pythonnative 0.35.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.
- {pythonnative-0.35.0/src/pythonnative.egg-info → pythonnative-0.36.0}/PKG-INFO +1 -1
- {pythonnative-0.35.0 → pythonnative-0.36.0}/pyproject.toml +1 -1
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/__init__.py +1 -1
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/cli/pn.py +24 -6
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/mutations.py +21 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0/src/pythonnative.egg-info}/PKG-INFO +1 -1
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_cli.py +126 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/LICENSE +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/README.md +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/setup.cfg +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/_ios_log.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/alerts.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/animated.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/appearance.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/cli/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/component.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/_base.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/controls.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/layout.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/lists.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/media.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/overlays.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/pressable.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/structural.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/components/text.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/diagnostics.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/element.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/events.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/gestures.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hooks.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hosts/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hosts/android.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hosts/base.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hosts/desktop.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hosts/ios.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/hot_reload.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/images.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/layout.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/app_state.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/battery.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/biometrics.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/camera.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/clipboard.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/file_system.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/haptics.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/linking.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/location.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/net_info.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/notifications.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/permissions.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/secure_store.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/share.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_views/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_views/android.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_views/base.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_views/desktop.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_views/ios.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/container.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/handle.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/hooks.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/host.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/linking.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/navigators.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/screen.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/navigation/state.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/net.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/platform.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/platform_metrics.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/preview.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/android.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/builder.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/config.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/devices.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/doctor.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/icons.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/ios.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/permissions.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/project/runtime_assets.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/boundaries.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/children.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/core.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/layout_pass.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/reconciler/vnode.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/runtime.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/scheduler.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/sdk/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/sdk/_components.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/storage.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/style.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/suspense.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/build.gradle +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/Navigator.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNAccessibilityDelegate.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNBorderDrawable.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNFrameLayout.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/PNVirtualListView.java +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/build.gradle +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradlew +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/testing/__init__.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/testing/backend.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/testing/harness.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/utils.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/virtual_rows.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/SOURCES.txt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/requires.txt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative.egg-info/top_level.txt +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_alert.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_animated.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_animated_graph.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_appearance.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_async_hooks.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_components.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_core_semantics.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_desktop_backend.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_element.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_events.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_extended_components.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_gesture_composition.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_gestures.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_hooks.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_hosts.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_hot_reload.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_images.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_incremental_render.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_interaction_props.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_ios_log.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_layout.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_metric_hooks.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_mutations.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_native_lists.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_native_modules.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_native_views.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_navigation.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_net.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_new_components.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_platform.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_platform_metrics.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_reconciler.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_ref.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_runtime.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_sdk.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_smoke.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_storage.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_style.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_suspense.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_transitions.py +0 -0
- {pythonnative-0.35.0 → pythonnative-0.36.0}/tests/test_utils.py +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
@@ -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()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/native_modules/notifications.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/build.gradle
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradlew
RENAMED
|
File without changes
|
{pythonnative-0.35.0 → pythonnative-0.36.0}/src/pythonnative/templates/android_template/gradlew.bat
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|