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.
- {pythonnative-0.37.0/src/pythonnative.egg-info → pythonnative-0.38.0}/PKG-INFO +8 -8
- {pythonnative-0.37.0 → pythonnative-0.38.0}/README.md +4 -1
- {pythonnative-0.37.0 → pythonnative-0.38.0}/pyproject.toml +14 -16
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/__init__.py +9 -1
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/alerts.py +6 -14
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/cli/pn.py +96 -10
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/_base.py +31 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/controls.py +19 -16
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/layout.py +5 -8
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/lists.py +6 -6
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/gestures.py +27 -6
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/__init__.py +19 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/battery.py +13 -14
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/biometrics.py +12 -14
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/camera.py +10 -6
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/clipboard.py +9 -11
- pythonnative-0.38.0/src/pythonnative/native_modules/file_system.py +145 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/haptics.py +14 -10
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/linking.py +9 -8
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/location.py +10 -12
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/net_info.py +1 -4
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/notifications.py +25 -32
- pythonnative-0.38.0/src/pythonnative/native_modules/permissions.py +108 -0
- pythonnative-0.38.0/src/pythonnative/native_modules/secure_store.py +52 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/share.py +5 -5
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/__init__.py +2 -1
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/hooks.py +46 -7
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/state.py +30 -9
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/android.py +23 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/builder.py +64 -35
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/config.py +84 -24
- pythonnative-0.38.0/src/pythonnative/project/deps.py +703 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/doctor.py +53 -4
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/runtime_assets.py +13 -14
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/style.py +94 -44
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/build.gradle +5 -2
- pythonnative-0.38.0/src/pythonnative/templates/android_template/build.gradle +10 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +1 -1
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/PermissionModules.swift +25 -10
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +3 -2
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +35 -9
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/utils.py +22 -27
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/virtual_rows.py +10 -20
- {pythonnative-0.37.0 → pythonnative-0.38.0/src/pythonnative.egg-info}/PKG-INFO +8 -8
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/SOURCES.txt +1 -0
- pythonnative-0.38.0/src/pythonnative.egg-info/requires.txt +4 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_animated_graph.py +2 -2
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_appearance.py +21 -4
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_bridge.py +15 -1
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_cli.py +153 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_gestures.py +21 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_native_lists.py +2 -2
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_native_modules.py +107 -2
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_navigation.py +42 -1
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_new_components.py +27 -14
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_style.py +17 -2
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_utils.py +5 -2
- pythonnative-0.37.0/src/pythonnative/native_modules/file_system.py +0 -236
- pythonnative-0.37.0/src/pythonnative/native_modules/permissions.py +0 -60
- pythonnative-0.37.0/src/pythonnative/native_modules/secure_store.py +0 -56
- pythonnative-0.37.0/src/pythonnative/templates/android_template/build.gradle +0 -7
- pythonnative-0.37.0/src/pythonnative.egg-info/requires.txt +0 -8
- {pythonnative-0.37.0 → pythonnative-0.38.0}/LICENSE +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/setup.cfg +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/_ios_log.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/animated.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/appearance.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bootstrap.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/android.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/codec.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/fake.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/ios.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/cli/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/component.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/media.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/overlays.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/pressable.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/structural.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/text.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/diagnostics.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/element.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/events.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hooks.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/base.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/desktop.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/native.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hot_reload.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/images.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/layout.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/mutations.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/app_state.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/desktop.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/registry.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/base.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/bridge_backend.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/desktop.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/container.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/handle.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/host.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/linking.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/navigators.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/screen.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/net.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/platform.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/platform_metrics.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/preview.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/devices.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/icons.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/ios.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/permissions.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/plugins.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/py.typed +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/boundaries.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/children.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/core.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/layout_pass.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/vnode.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/runtime.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/scheduler.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/sdk/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/sdk/_components.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/storage.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/suspense.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
- {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
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
- {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
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradlew +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/build.gradle +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/AndroidManifest.xml +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/PNBridge.kt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/PythonHost.kt +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/PNColorTest.kt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/PromiseTest.kt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Package.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Animation/PNAnimator.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNBridge.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNRegistry.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNTransaction.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNButtonManagers.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNColor.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNComponentManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNContainerView.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNControlManagers.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNImageManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNPressableManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTabBarManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTextInputManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTextManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTransform.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNViewManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNViewState.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNViewStyler.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNWebViewManager.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/AlertModule.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/HostModule.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/LifecycleModules.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/MediaModules.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/PNNativeModule.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/SystemModules.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Screens/PNViewController.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNCompat.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNJSON.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNLog.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNWindow.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNColorTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNGestureTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNManagerTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNModuleTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNTransactionTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/testing/__init__.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/testing/backend.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/testing/harness.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/top_level.txt +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_alert.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_animated.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_async_hooks.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_components.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_core_semantics.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_desktop_backend.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_element.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_events.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_extended_components.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_gesture_composition.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_hooks.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_hosts.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_hot_reload.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_images.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_incremental_render.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_interaction_props.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_ios_log.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_layout.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_metric_hooks.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_mutations.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_native_views.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_net.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_platform.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_platform_metrics.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_reconciler.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_ref.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_runtime.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_sdk.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_smoke.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_storage.py +0 -0
- {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_suspense.py +0 -0
- {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.
|
|
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.
|
|
38
|
-
Classifier: Programming Language :: Python :: 3.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
22
|
-
"Programming Language :: Python :: 3.
|
|
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`
|
|
48
|
-
# app's [requirements].packages
|
|
49
|
-
#
|
|
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 = "
|
|
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 = ['
|
|
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.
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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 = """
|
|
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":
|
|
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",
|
|
72
|
-
style={"spacing":
|
|
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
|
-
|
|
91
|
+
route = pn.use_route(DetailParams)
|
|
81
92
|
return pn.Column(
|
|
82
|
-
pn.Text(f"Detail: count was {params
|
|
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",
|
|
93
|
-
Stack.Screen("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(
|
|
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
|
|
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
|
-
) ->
|
|
430
|
-
"""Pull-to-refresh
|
|
429
|
+
) -> Element:
|
|
430
|
+
"""Pull-to-refresh control for [`ScrollView`][pythonnative.ScrollView] and the list components.
|
|
431
431
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
[`
|
|
435
|
-
|
|
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
|
-
|
|
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
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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[
|
|
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
|
|
306
|
-
|
|
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[
|
|
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[
|
|
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
|
|
513
|
-
|
|
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[
|
|
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
|
|
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.
|