pythonnative 0.34.0__tar.gz → 0.36.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 (202) hide show
  1. {pythonnative-0.34.0/src/pythonnative.egg-info → pythonnative-0.36.0}/PKG-INFO +1 -1
  2. {pythonnative-0.34.0 → pythonnative-0.36.0}/pyproject.toml +1 -1
  3. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/__init__.py +3 -2
  4. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/cli/pn.py +24 -6
  5. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/mutations.py +21 -0
  6. {pythonnative-0.34.0 → pythonnative-0.36.0/src/pythonnative.egg-info}/PKG-INFO +1 -1
  7. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_cli.py +126 -0
  8. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_platform.py +5 -0
  9. {pythonnative-0.34.0 → pythonnative-0.36.0}/LICENSE +0 -0
  10. {pythonnative-0.34.0 → pythonnative-0.36.0}/README.md +0 -0
  11. {pythonnative-0.34.0 → pythonnative-0.36.0}/setup.cfg +0 -0
  12. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/_ios_log.py +0 -0
  13. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/alerts.py +0 -0
  14. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/animated.py +0 -0
  15. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/appearance.py +0 -0
  16. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/cli/__init__.py +0 -0
  17. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/component.py +0 -0
  18. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/__init__.py +0 -0
  19. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/_base.py +0 -0
  20. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/controls.py +0 -0
  21. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/layout.py +0 -0
  22. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/lists.py +0 -0
  23. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/media.py +0 -0
  24. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/overlays.py +0 -0
  25. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/pressable.py +0 -0
  26. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/structural.py +0 -0
  27. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/components/text.py +0 -0
  28. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/diagnostics.py +0 -0
  29. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/element.py +0 -0
  30. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/events.py +0 -0
  31. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/gestures.py +0 -0
  32. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hooks.py +0 -0
  33. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hosts/__init__.py +0 -0
  34. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hosts/android.py +0 -0
  35. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hosts/base.py +0 -0
  36. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hosts/desktop.py +0 -0
  37. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hosts/ios.py +0 -0
  38. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/hot_reload.py +0 -0
  39. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/images.py +0 -0
  40. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/layout.py +0 -0
  41. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/__init__.py +0 -0
  42. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/app_state.py +0 -0
  43. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/battery.py +0 -0
  44. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/biometrics.py +0 -0
  45. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/camera.py +0 -0
  46. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/clipboard.py +0 -0
  47. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/file_system.py +0 -0
  48. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/haptics.py +0 -0
  49. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/linking.py +0 -0
  50. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/location.py +0 -0
  51. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/net_info.py +0 -0
  52. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/notifications.py +0 -0
  53. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/permissions.py +0 -0
  54. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/secure_store.py +0 -0
  55. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/share.py +0 -0
  56. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_views/__init__.py +0 -0
  57. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_views/android.py +0 -0
  58. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_views/base.py +0 -0
  59. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_views/desktop.py +0 -0
  60. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/native_views/ios.py +0 -0
  61. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/__init__.py +0 -0
  62. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/container.py +0 -0
  63. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/handle.py +0 -0
  64. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/hooks.py +0 -0
  65. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/host.py +0 -0
  66. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/linking.py +0 -0
  67. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/navigators.py +0 -0
  68. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/screen.py +0 -0
  69. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/navigation/state.py +0 -0
  70. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/net.py +0 -0
  71. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/platform.py +0 -0
  72. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/platform_metrics.py +0 -0
  73. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/preview.py +0 -0
  74. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/__init__.py +0 -0
  75. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/android.py +0 -0
  76. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/builder.py +0 -0
  77. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/config.py +0 -0
  78. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/devices.py +0 -0
  79. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/doctor.py +0 -0
  80. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/icons.py +0 -0
  81. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/ios.py +0 -0
  82. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/permissions.py +0 -0
  83. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/project/runtime_assets.py +0 -0
  84. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/__init__.py +0 -0
  85. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/boundaries.py +0 -0
  86. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/children.py +0 -0
  87. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/core.py +0 -0
  88. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/layout_pass.py +0 -0
  89. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/vnode.py +0 -0
  90. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/runtime.py +0 -0
  91. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/scheduler.py +0 -0
  92. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/sdk/__init__.py +0 -0
  93. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/sdk/_components.py +0 -0
  94. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/storage.py +0 -0
  95. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/style.py +0 -0
  96. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/suspense.py +0 -0
  97. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/build.gradle +0 -0
  98. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
  99. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +0 -0
  100. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
  101. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +0 -0
  102. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/Navigator.kt +0 -0
  103. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNAccessibilityDelegate.kt +0 -0
  104. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNBorderDrawable.kt +0 -0
  105. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNFrameLayout.kt +0 -0
  106. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNVirtualListView.java +0 -0
  107. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +0 -0
  108. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
  109. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -0
  110. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
  111. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
  112. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
  113. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  114. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  115. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  116. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  117. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  118. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  119. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  120. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  121. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  122. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  123. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
  124. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
  125. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
  126. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
  127. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
  128. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
  129. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
  130. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +0 -0
  131. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/build.gradle +0 -0
  132. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
  133. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +0 -0
  134. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
  135. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradlew +0 -0
  136. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
  137. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
  138. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
  139. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  140. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  141. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
  142. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
  143. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
  144. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
  145. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +0 -0
  146. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
  147. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
  148. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +0 -0
  149. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  150. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
  151. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
  152. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
  153. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/testing/__init__.py +0 -0
  154. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/testing/backend.py +0 -0
  155. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/testing/harness.py +0 -0
  156. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/utils.py +0 -0
  157. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative/virtual_rows.py +0 -0
  158. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/SOURCES.txt +0 -0
  159. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
  160. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
  161. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/requires.txt +0 -0
  162. {pythonnative-0.34.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/top_level.txt +0 -0
  163. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_alert.py +0 -0
  164. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_animated.py +0 -0
  165. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_animated_graph.py +0 -0
  166. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_appearance.py +0 -0
  167. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_async_hooks.py +0 -0
  168. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_components.py +0 -0
  169. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_core_semantics.py +0 -0
  170. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_desktop_backend.py +0 -0
  171. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_element.py +0 -0
  172. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_events.py +0 -0
  173. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_extended_components.py +0 -0
  174. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_gesture_composition.py +0 -0
  175. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_gestures.py +0 -0
  176. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_hooks.py +0 -0
  177. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_hosts.py +0 -0
  178. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_hot_reload.py +0 -0
  179. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_images.py +0 -0
  180. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_incremental_render.py +0 -0
  181. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_interaction_props.py +0 -0
  182. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_ios_log.py +0 -0
  183. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_layout.py +0 -0
  184. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_metric_hooks.py +0 -0
  185. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_mutations.py +0 -0
  186. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_native_lists.py +0 -0
  187. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_native_modules.py +0 -0
  188. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_native_views.py +0 -0
  189. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_navigation.py +0 -0
  190. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_net.py +0 -0
  191. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_new_components.py +0 -0
  192. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_platform_metrics.py +0 -0
  193. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_reconciler.py +0 -0
  194. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_ref.py +0 -0
  195. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_runtime.py +0 -0
  196. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_sdk.py +0 -0
  197. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_smoke.py +0 -0
  198. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_storage.py +0 -0
  199. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_style.py +0 -0
  200. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_suspense.py +0 -0
  201. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_transitions.py +0 -0
  202. {pythonnative-0.34.0 → pythonnative-0.36.0}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonnative
3
- Version: 0.34.0
3
+ Version: 0.36.0
4
4
  Summary: Cross-platform native UI toolkit for Android and iOS
5
5
  Author: Owen Carey
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pythonnative"
7
- version = "0.34.0"
7
+ version = "0.36.0"
8
8
  description = "Cross-platform native UI toolkit for Android and iOS"
9
9
  authors = [
10
10
  { name = "Owen Carey" }
@@ -60,7 +60,7 @@ Example:
60
60
  ```
61
61
  """
62
62
 
63
- __version__ = "0.34.0"
63
+ __version__ = "0.36.0"
64
64
 
65
65
  from . import appearance, diagnostics, gestures, images, runtime, sdk
66
66
  from .alerts import Alert
@@ -167,7 +167,7 @@ from .navigation import (
167
167
  use_route,
168
168
  )
169
169
  from .net import HTTPError, Response, fetch
170
- from .platform import Platform
170
+ from .platform import Platform, get_platform
171
171
  from .runtime import run_async, run_blocking
172
172
  from .scheduler import batch_updates
173
173
  from .sdk import (
@@ -379,6 +379,7 @@ __all__ = [
379
379
  "diagnostics",
380
380
  # Platform
381
381
  "Platform",
382
+ "get_platform",
382
383
  # Custom-component SDK
383
384
  "Props",
384
385
  "ViewHandler",
@@ -12,8 +12,8 @@ The console script `pn` (declared in `pyproject.toml`) dispatches to:
12
12
  simulators, as a table or as JSON with `--json`.
13
13
  - `pn run android|ios [--device D]`: stage + build + install + launch on
14
14
  a device, emulator, or simulator, with optional on-device hot reload.
15
- - `pn logs android|ios`: stream logs from the running app without
16
- rebuilding.
15
+ - `pn logs android|ios [--device D]`: stream logs from the running app
16
+ without rebuilding.
17
17
  - `pn build android|ios`: produce standalone artifacts (signed APK/AAB,
18
18
  or an iOS archive/IPA, optionally uploaded to App Store Connect).
19
19
  - `pn app-id android|ios`: print the resolved application/bundle id
@@ -626,10 +626,15 @@ def logs_command(args: argparse.Namespace) -> None:
626
626
  """Stream logs from the running app without rebuilding.
627
627
 
628
628
  Args:
629
- args: Parsed namespace (``platform``).
629
+ args: Parsed namespace (``platform``, ``device``).
630
630
  """
631
631
  platform: str = args.platform
632
+ device = _resolve_device(platform, getattr(args, "device", None))
632
633
  if platform == "android":
634
+ if device is not None:
635
+ # Both adb and logcat below honor ANDROID_SERIAL, so exporting
636
+ # it targets the whole log stream at the chosen device.
637
+ os.environ["ANDROID_SERIAL"] = device.identifier
633
638
  proc = _start_android_log_stream()
634
639
  if proc is None:
635
640
  sys.exit(1)
@@ -643,8 +648,12 @@ def logs_command(args: argparse.Namespace) -> None:
643
648
 
644
649
  # iOS: relaunch the app on the booted simulator with a console PTY so
645
650
  # Python's stdout/stderr stream to this terminal.
651
+ if device is not None and device.kind == "device":
652
+ print("For a physical device, use Console.app or Xcode > Devices and Simulators.")
653
+ sys.exit(1)
646
654
  config = _load_config_or_exit()
647
- proc = _start_ios_log_stream(config.bundle_id)
655
+ udid = device.identifier if device is not None else None
656
+ proc = _start_ios_log_stream(config.bundle_id, udid=udid)
648
657
  if proc is None:
649
658
  print("For a physical device, use Console.app or Xcode > Devices and Simulators.")
650
659
  sys.exit(1)
@@ -762,16 +771,19 @@ def _select_ios_simulator() -> Optional[str]:
762
771
  return None
763
772
 
764
773
 
765
- def _start_ios_log_stream(bundle_id: str) -> Optional[subprocess.Popen]:
774
+ def _start_ios_log_stream(bundle_id: str, *, udid: Optional[str] = None) -> Optional[subprocess.Popen]:
766
775
  """Re-launch the iOS app with a console PTY so its stdio streams here.
767
776
 
768
777
  Args:
769
778
  bundle_id: The app's bundle identifier.
779
+ udid: A specific simulator UDID to target. Falls back to the
780
+ booted simulator when not given.
770
781
 
771
782
  Returns:
772
783
  The launched process, or ``None`` when no simulator is booted.
773
784
  """
774
- udid = _booted_ios_udid()
785
+ if udid is None:
786
+ udid = _booted_ios_udid()
775
787
  if udid is None:
776
788
  print("Note: no booted iOS Simulator found; skipping log streaming.")
777
789
  return None
@@ -1044,6 +1056,12 @@ def _build_parser() -> argparse.ArgumentParser:
1044
1056
 
1045
1057
  parser_logs = subparsers.add_parser("logs", help="Stream logs from the running app")
1046
1058
  parser_logs.add_argument("platform", choices=["android", "ios"])
1059
+ parser_logs.add_argument(
1060
+ "--device",
1061
+ "-d",
1062
+ help="Target device: an identifier or name from 'pn devices' "
1063
+ "(physical iOS devices aren't supported for log streaming)",
1064
+ )
1047
1065
  parser_logs.set_defaults(func=logs_command)
1048
1066
 
1049
1067
  parser_build = subparsers.add_parser("build", help="Build distributable artifacts")
@@ -64,6 +64,11 @@ class UpdateOp:
64
64
 
65
65
  Removed props are signaled with a value of ``None``, matching the
66
66
  pre-existing handler contract.
67
+
68
+ Attributes:
69
+ tag: Unique integer identity of the target view.
70
+ changed_props: Mapping of modified prop names to their new values.
71
+ Removed props appear with a value of ``None``.
67
72
  """
68
73
 
69
74
  tag: int
@@ -78,6 +83,12 @@ class InsertOp:
78
83
  attached to the parent at a different position, it is moved rather
79
84
  than duplicated. ``index`` is clamped by handlers to the current
80
85
  child count.
86
+
87
+ Attributes:
88
+ parent_tag: Integer tag of the container view.
89
+ child_tag: Integer tag of the child view to insert or move.
90
+ index: Zero-based insertion index, clamped by handlers to the
91
+ current child count.
81
92
  """
82
93
 
83
94
  parent_tag: int
@@ -92,6 +103,9 @@ class DestroyOp:
92
103
  The registry drops its tag record and calls the handler's
93
104
  ``destroy`` hook so platform resources (listeners, timers, image
94
105
  loads) can be released eagerly instead of waiting for GC.
106
+
107
+ Attributes:
108
+ tag: Unique integer identity of the view to destroy.
95
109
  """
96
110
 
97
111
  tag: int
@@ -103,6 +117,13 @@ class SetFrameOp:
103
117
 
104
118
  Coordinates are points relative to the parent's content origin,
105
119
  exactly as computed by the layout engine.
120
+
121
+ Attributes:
122
+ tag: Unique integer identity of the target view.
123
+ x: Horizontal origin offset in points relative to the parent.
124
+ y: Vertical origin offset in points relative to the parent.
125
+ width: View width in points.
126
+ height: View height in points.
106
127
  """
107
128
 
108
129
  tag: int
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonnative
3
- Version: 0.34.0
3
+ Version: 0.36.0
4
4
  Summary: Cross-platform native UI toolkit for Android and iOS
5
5
  Author: Owen Carey
6
6
  License: MIT License
@@ -620,6 +620,132 @@ def test_devices_json_serializes_awkward_field_values(
620
620
  }
621
621
 
622
622
 
623
+ class _FakeCompletedProc:
624
+ """Stand-in for subprocess.Popen that returns immediately from wait()."""
625
+
626
+ def wait(self) -> int:
627
+ return 0
628
+
629
+
630
+ def test_logs_command_android_sets_android_serial_for_device(
631
+ monkeypatch: pytest.MonkeyPatch,
632
+ ) -> None:
633
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices(_FAKE_DEVICES))
634
+ monkeypatch.delenv("ANDROID_SERIAL", raising=False)
635
+ monkeypatch.setattr(pn_cli, "_start_android_log_stream", lambda: _FakeCompletedProc())
636
+
637
+ pn_cli.logs_command(argparse.Namespace(platform="android", device="Pixel"))
638
+
639
+ # pop() rather than a plain lookup: monkeypatch.delenv() on a variable that
640
+ # was never set has nothing to restore, so the value the command exported
641
+ # would otherwise leak into the rest of the session.
642
+ assert os.environ.pop("ANDROID_SERIAL") == "R5CT12345XYZ"
643
+
644
+
645
+ def test_logs_command_android_no_device_leaves_android_serial_unset(
646
+ monkeypatch: pytest.MonkeyPatch,
647
+ ) -> None:
648
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices(_FAKE_DEVICES))
649
+ monkeypatch.delenv("ANDROID_SERIAL", raising=False)
650
+ monkeypatch.setattr(pn_cli, "_start_android_log_stream", lambda: _FakeCompletedProc())
651
+
652
+ pn_cli.logs_command(argparse.Namespace(platform="android", device=None))
653
+
654
+ assert "ANDROID_SERIAL" not in os.environ
655
+
656
+
657
+ def test_logs_command_ios_passes_resolved_udid(monkeypatch: pytest.MonkeyPatch) -> None:
658
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices(_FAKE_DEVICES))
659
+ monkeypatch.setattr(
660
+ pn_cli, "_load_config_or_exit", lambda project_dir=None: argparse.Namespace(bundle_id="com.example.app")
661
+ )
662
+ captured: Dict[str, Optional[str]] = {}
663
+
664
+ def _fake_start_ios_log_stream(bundle_id: str, *, udid: Optional[str] = None) -> _FakeCompletedProc:
665
+ captured["bundle_id"] = bundle_id
666
+ captured["udid"] = udid
667
+ return _FakeCompletedProc()
668
+
669
+ monkeypatch.setattr(pn_cli, "_start_ios_log_stream", _fake_start_ios_log_stream)
670
+
671
+ pn_cli.logs_command(argparse.Namespace(platform="ios", device="iPhone 17"))
672
+
673
+ assert captured == {"bundle_id": "com.example.app", "udid": "ABC-123"}
674
+
675
+
676
+ def test_logs_command_ios_no_device_falls_back_to_booted(
677
+ monkeypatch: pytest.MonkeyPatch,
678
+ ) -> None:
679
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices(_FAKE_DEVICES))
680
+ monkeypatch.setattr(
681
+ pn_cli, "_load_config_or_exit", lambda project_dir=None: argparse.Namespace(bundle_id="com.example.app")
682
+ )
683
+ captured: Dict[str, Optional[str]] = {}
684
+
685
+ def _fake_start_ios_log_stream(bundle_id: str, *, udid: Optional[str] = None) -> _FakeCompletedProc:
686
+ captured["udid"] = udid
687
+ return _FakeCompletedProc()
688
+
689
+ monkeypatch.setattr(pn_cli, "_start_ios_log_stream", _fake_start_ios_log_stream)
690
+
691
+ pn_cli.logs_command(argparse.Namespace(platform="ios", device=None))
692
+
693
+ assert captured["udid"] is None
694
+
695
+
696
+ def test_logs_command_ios_physical_device_prints_console_hint(
697
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
698
+ ) -> None:
699
+ physical = Device("ios", "device", "PHYS-1", "Owen's iPhone", "iOS 26.4", "connected")
700
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices([physical]))
701
+
702
+ with pytest.raises(SystemExit) as exc_info:
703
+ pn_cli.logs_command(argparse.Namespace(platform="ios", device="Owen's iPhone"))
704
+
705
+ assert exc_info.value.code == 1
706
+ assert "Console.app" in capsys.readouterr().out
707
+
708
+
709
+ def test_logs_command_ios_no_simulator_prints_console_hint(
710
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
711
+ ) -> None:
712
+ # Without --device and with no booted simulator, the user may well be
713
+ # holding a physical device, so the Console.app pointer must still print.
714
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices(_FAKE_DEVICES))
715
+ monkeypatch.setattr(
716
+ pn_cli, "_load_config_or_exit", lambda project_dir=None: argparse.Namespace(bundle_id="com.example.app")
717
+ )
718
+ monkeypatch.setattr(pn_cli, "_start_ios_log_stream", lambda bundle_id, *, udid=None: None)
719
+
720
+ with pytest.raises(SystemExit) as exc_info:
721
+ pn_cli.logs_command(argparse.Namespace(platform="ios", device=None))
722
+
723
+ assert exc_info.value.code == 1
724
+ assert "Console.app" in capsys.readouterr().out
725
+
726
+
727
+ def test_logs_command_bad_device_query_exits_with_hint(
728
+ monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
729
+ ) -> None:
730
+ monkeypatch.setattr(pn_cli.devices_mod, "list_devices", _fake_list_devices(_FAKE_DEVICES))
731
+
732
+ with pytest.raises(SystemExit) as exc_info:
733
+ pn_cli.logs_command(argparse.Namespace(platform="android", device="nope"))
734
+
735
+ assert exc_info.value.code == 1
736
+ assert "no android device matches 'nope'" in capsys.readouterr().out
737
+
738
+
739
+ def test_logs_device_flag_is_wired_through_argparse(tmp_path: Path) -> None:
740
+ # The tests above call logs_command() directly; this one proves the
741
+ # subparser actually accepts --device and routes it through.
742
+ env = {**os.environ, "PATH": str(tmp_path)}
743
+ result = run_pn(["logs", "android", "--device", "nope"], str(tmp_path), env=env)
744
+
745
+ assert result.returncode == 1
746
+ assert "no android device matches 'nope'" in result.stdout
747
+
748
+
623
749
  def test_hot_reload_manifest_payload_maps_files_to_modules(tmp_path: Path) -> None:
624
750
  app_dir = tmp_path / "app"
625
751
  app_dir.mkdir()
@@ -6,6 +6,7 @@ from typing import Generator
6
6
 
7
7
  import pytest
8
8
 
9
+ import pythonnative as pn
9
10
  from pythonnative.platform import Platform, _set_platform_for_test, get_platform
10
11
 
11
12
 
@@ -27,6 +28,10 @@ def test_get_platform_matches_os() -> None:
27
28
  assert get_platform() == Platform.OS
28
29
 
29
30
 
31
+ def test_get_platform_exported_from_package() -> None:
32
+ assert pn.get_platform() == pn.Platform.OS
33
+
34
+
30
35
  def test_version_string_present() -> None:
31
36
  assert isinstance(Platform.Version, str)
32
37
  assert len(Platform.Version) > 0
File without changes
File without changes
File without changes