pythonnative 0.40.0__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pythonnative/__init__.py +411 -0
- pythonnative/_ios_log.py +92 -0
- pythonnative/_yoga.cp313-win_amd64.pyd +0 -0
- pythonnative/alerts.py +236 -0
- pythonnative/animated.py +1687 -0
- pythonnative/animation_graph.py +78 -0
- pythonnative/appearance.py +124 -0
- pythonnative/bootstrap.py +100 -0
- pythonnative/bridge/__init__.py +302 -0
- pythonnative/bridge/android.py +78 -0
- pythonnative/bridge/codec.py +170 -0
- pythonnative/bridge/commits.py +114 -0
- pythonnative/bridge/fake.py +243 -0
- pythonnative/bridge/ios.py +138 -0
- pythonnative/bridge/web.py +489 -0
- pythonnative/cli/__init__.py +7 -0
- pythonnative/cli/pn.py +1214 -0
- pythonnative/component.py +271 -0
- pythonnative/components/__init__.py +111 -0
- pythonnative/components/_base.py +166 -0
- pythonnative/components/controls.py +521 -0
- pythonnative/components/layout.py +518 -0
- pythonnative/components/lists.py +785 -0
- pythonnative/components/media.py +204 -0
- pythonnative/components/overlays.py +107 -0
- pythonnative/components/pressable.py +252 -0
- pythonnative/components/structural.py +167 -0
- pythonnative/components/text.py +291 -0
- pythonnative/devclient.py +824 -0
- pythonnative/devserver/__init__.py +34 -0
- pythonnative/devserver/server.py +718 -0
- pythonnative/devserver/static/animation_graph.js +82 -0
- pythonnative/devserver/static/bridge.js +147 -0
- pythonnative/devserver/static/colors.js +70 -0
- pythonnative/devserver/static/host.js +552 -0
- pythonnative/devserver/static/index.html +60 -0
- pythonnative/devserver/static/layout.js +85 -0
- pythonnative/devserver/static/preview.css +415 -0
- pythonnative/devserver/static/renderer.js +1994 -0
- pythonnative/devserver/static/shell.js +345 -0
- pythonnative/devserver/static/yoga/LICENSE +21 -0
- pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
- pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
- pythonnative/devserver/static/yoga/src/index.js +16 -0
- pythonnative/devserver/static/yoga/src/index.js.map +1 -0
- pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
- pythonnative/devserver/static/yoga/src/load.js +17 -0
- pythonnative/devserver/static/yoga/src/load.js.map +1 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
- pythonnative/devserver/watcher.py +267 -0
- pythonnative/devserver/ws.py +421 -0
- pythonnative/diagnostics.py +241 -0
- pythonnative/element.py +159 -0
- pythonnative/equality.py +19 -0
- pythonnative/events.py +231 -0
- pythonnative/gestures.py +1333 -0
- pythonnative/hooks.py +1621 -0
- pythonnative/hosts/__init__.py +63 -0
- pythonnative/hosts/base.py +596 -0
- pythonnative/hosts/native.py +302 -0
- pythonnative/hot_reload.py +585 -0
- pythonnative/layout.py +328 -0
- pythonnative/mutations.py +142 -0
- pythonnative/native/android/build.gradle +52 -0
- pythonnative/native/android/gradle.properties +3 -0
- pythonnative/native/android/settings.gradle +12 -0
- pythonnative/native/android/src/main/AndroidManifest.xml +11 -0
- pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
- pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/PNBridge.kt +261 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/PythonHost.kt +20 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +141 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +257 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +175 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +40 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +33 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +82 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +80 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +117 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +74 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +37 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +32 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +213 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +69 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +186 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +123 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +141 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +162 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +134 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PNColor.kt +201 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +86 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +55 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +122 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +214 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +113 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +52 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +131 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +250 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextManager.kt +233 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +355 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +149 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +233 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +127 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +527 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +73 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +316 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +61 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +200 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +158 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +100 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +99 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +89 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +178 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +16 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +188 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +80 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +48 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +76 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +18 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +49 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +75 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +197 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNColorTest.kt +47 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +78 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PromiseTest.kt +89 -0
- pythonnative/native/ios/Package.swift +23 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimator.swift +312 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNBridge.swift +255 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNRegistry.swift +142 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNTransaction.swift +166 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +53 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNButtonManagers.swift +207 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNColor.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNComponentManager.swift +183 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNContainerView.swift +56 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNControlManagers.swift +281 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNImageManager.swift +222 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +243 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNPressableManager.swift +114 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +197 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTabBarManager.swift +106 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextInputManager.swift +297 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextManager.swift +230 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTransform.swift +82 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewManager.swift +86 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewState.swift +87 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewStyler.swift +340 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNWebViewManager.swift +124 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +260 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/AlertModule.swift +92 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/LifecycleModules.swift +174 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/MediaModules.swift +177 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/PNNativeModule.swift +168 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/PermissionModules.swift +266 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/SystemModules.swift +251 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +8 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNViewController.swift +237 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNCompat.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNJSON.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNLog.swift +47 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNWindow.swift +51 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNColorTests.swift +50 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNGestureTests.swift +101 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNManagerTests.swift +126 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNModuleTests.swift +111 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNTransactionTests.swift +91 -0
- pythonnative/native/yoga/LICENSE +21 -0
- pythonnative/native/yoga/Package.swift +9 -0
- pythonnative/native/yoga/VENDORED.md +2 -0
- pythonnative/native/yoga/include/PNStyle.h +10 -0
- pythonnative/native/yoga/include/module.modulemap +5 -0
- pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
- pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
- pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
- pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
- pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
- pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
- pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
- pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
- pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
- pythonnative/native/yoga/python.cpp +16 -0
- pythonnative/native/yoga/style.cpp +272 -0
- pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
- pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
- pythonnative/native/yoga/yoga/YGConfig.h +158 -0
- pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
- pythonnative/native/yoga/yoga/YGEnums.h +142 -0
- pythonnative/native/yoga/yoga/YGMacros.h +99 -0
- pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
- pythonnative/native/yoga/yoga/YGNode.h +304 -0
- pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
- pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
- pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
- pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
- pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
- pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
- pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
- pythonnative/native/yoga/yoga/YGValue.h +84 -0
- pythonnative/native/yoga/yoga/Yoga.h +21 -0
- pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
- pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
- pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
- pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
- pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
- pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
- pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
- pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
- pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
- pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
- pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
- pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
- pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
- pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
- pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
- pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
- pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
- pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
- pythonnative/native/yoga/yoga/config/Config.h +92 -0
- pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
- pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
- pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
- pythonnative/native/yoga/yoga/debug/Log.h +34 -0
- pythonnative/native/yoga/yoga/enums/Align.h +47 -0
- pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
- pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
- pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
- pythonnative/native/yoga/yoga/enums/Display.h +41 -0
- pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
- pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
- pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
- pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
- pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
- pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
- pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
- pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
- pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
- pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
- pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
- pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
- pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
- pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
- pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
- pythonnative/native/yoga/yoga/event/event.cpp +87 -0
- pythonnative/native/yoga/yoga/event/event.h +130 -0
- pythonnative/native/yoga/yoga/module.modulemap +21 -0
- pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
- pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
- pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
- pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
- pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
- pythonnative/native/yoga/yoga/node/Node.h +337 -0
- pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
- pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
- pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
- pythonnative/native/yoga/yoga/style/Style.h +757 -0
- pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
- pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
- pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
- pythonnative/native_modules/__init__.py +124 -0
- pythonnative/native_modules/app_state.py +99 -0
- pythonnative/native_modules/battery.py +75 -0
- pythonnative/native_modules/biometrics.py +42 -0
- pythonnative/native_modules/camera.py +65 -0
- pythonnative/native_modules/clipboard.py +46 -0
- pythonnative/native_modules/fallback.py +324 -0
- pythonnative/native_modules/file_system.py +145 -0
- pythonnative/native_modules/haptics.py +75 -0
- pythonnative/native_modules/linking.py +123 -0
- pythonnative/native_modules/location.py +75 -0
- pythonnative/native_modules/net_info.py +112 -0
- pythonnative/native_modules/notifications.py +129 -0
- pythonnative/native_modules/permissions.py +108 -0
- pythonnative/native_modules/registry.py +526 -0
- pythonnative/native_modules/secure_store.py +52 -0
- pythonnative/native_modules/share.py +51 -0
- pythonnative/native_views/__init__.py +375 -0
- pythonnative/native_views/base.py +316 -0
- pythonnative/native_views/bridge_backend.py +277 -0
- pythonnative/navigation/__init__.py +103 -0
- pythonnative/navigation/container.py +154 -0
- pythonnative/navigation/handle.py +540 -0
- pythonnative/navigation/hooks.py +133 -0
- pythonnative/navigation/host.py +58 -0
- pythonnative/navigation/linking.py +200 -0
- pythonnative/navigation/navigators.py +659 -0
- pythonnative/navigation/screen.py +149 -0
- pythonnative/navigation/state.py +269 -0
- pythonnative/net.py +248 -0
- pythonnative/platform.py +166 -0
- pythonnative/platform_metrics.py +252 -0
- pythonnative/preview.py +287 -0
- pythonnative/profiling.py +101 -0
- pythonnative/project/__init__.py +68 -0
- pythonnative/project/android.py +557 -0
- pythonnative/project/builder.py +817 -0
- pythonnative/project/config.py +773 -0
- pythonnative/project/deps.py +719 -0
- pythonnative/project/devices.py +304 -0
- pythonnative/project/doctor.py +283 -0
- pythonnative/project/fingerprint.py +171 -0
- pythonnative/project/icons.py +247 -0
- pythonnative/project/ios.py +325 -0
- pythonnative/project/lockfile.py +100 -0
- pythonnative/project/permissions.py +361 -0
- pythonnative/project/plugins.py +519 -0
- pythonnative/project/runtime_assets.py +183 -0
- pythonnative/py.typed +0 -0
- pythonnative/query.py +153 -0
- pythonnative/reconciler/__init__.py +29 -0
- pythonnative/reconciler/boundaries.py +375 -0
- pythonnative/reconciler/children.py +88 -0
- pythonnative/reconciler/core.py +1165 -0
- pythonnative/reconciler/layout_pass.py +393 -0
- pythonnative/reconciler/vnode.py +266 -0
- pythonnative/refresh.py +55 -0
- pythonnative/runtime.py +306 -0
- pythonnative/scheduler.py +159 -0
- pythonnative/sdk/__init__.py +153 -0
- pythonnative/sdk/_components.py +427 -0
- pythonnative/sdk/builtins.py +91 -0
- pythonnative/sdk/codegen.py +149 -0
- pythonnative/sdk/module_codegen.py +184 -0
- pythonnative/sdk/schema.py +224 -0
- pythonnative/sdk/templates/contracts.kt +46 -0
- pythonnative/sdk/templates/contracts.swift +46 -0
- pythonnative/storage.py +184 -0
- pythonnative/style.py +841 -0
- pythonnative/suspense.py +183 -0
- pythonnative/templates/android_template/app/build.gradle +75 -0
- pythonnative/templates/android_template/app/proguard-rules.pro +21 -0
- pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +24 -0
- pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +7 -0
- pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +32 -0
- pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +130 -0
- pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +13 -0
- pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
- pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
- pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +10 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +22 -0
- pythonnative/templates/android_template/app/src/main/res/values/colors.xml +5 -0
- pythonnative/templates/android_template/app/src/main/res/values/strings.xml +5 -0
- pythonnative/templates/android_template/app/src/main/res/values/themes.xml +9 -0
- pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +7 -0
- pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +13 -0
- pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +19 -0
- pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +17 -0
- pythonnative/templates/android_template/build.gradle +10 -0
- pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +6 -0
- pythonnative/templates/android_template/gradle.properties +23 -0
- pythonnative/templates/android_template/gradlew +185 -0
- pythonnative/templates/android_template/gradlew.bat +89 -0
- pythonnative/templates/android_template/settings.gradle +17 -0
- pythonnative/templates/ios_template/ios_template/AppDelegate.swift +51 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +13 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +6 -0
- pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +25 -0
- pythonnative/templates/ios_template/ios_template/BridgingHeader.h +14 -0
- pythonnative/templates/ios_template/ios_template/Info.plist +28 -0
- pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +390 -0
- pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +61 -0
- pythonnative/templates/ios_template/ios_template/ViewController.swift +23 -0
- pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +745 -0
- pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +36 -0
- pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +41 -0
- pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +32 -0
- pythonnative/testing/__init__.py +53 -0
- pythonnative/testing/backend.py +276 -0
- pythonnative/testing/harness.py +369 -0
- pythonnative/utils.py +145 -0
- pythonnative-0.40.0.dist-info/DELVEWHEEL +2 -0
- pythonnative-0.40.0.dist-info/METADATA +150 -0
- pythonnative-0.40.0.dist-info/RECORD +418 -0
- pythonnative-0.40.0.dist-info/WHEEL +5 -0
- pythonnative-0.40.0.dist-info/entry_points.txt +2 -0
- pythonnative-0.40.0.dist-info/licenses/LICENSE +21 -0
- pythonnative-0.40.0.dist-info/top_level.txt +1 -0
- pythonnative.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"""Embedded CPython runtime acquisition for iOS builds.
|
|
2
|
+
|
|
3
|
+
iOS apps can't rely on a system Python, so PythonNative bundles a copy of
|
|
4
|
+
CPython built for iOS by the excellent
|
|
5
|
+
[Python-Apple-support](https://github.com/beeware/Python-Apple-support)
|
|
6
|
+
project. This module downloads the pinned release asset for the
|
|
7
|
+
project's ``app.python_version``, verifies its checksum, extracts it
|
|
8
|
+
once (cached under the build directory), and exposes the path to
|
|
9
|
+
``Python.xcframework``.
|
|
10
|
+
|
|
11
|
+
The xcframework is linked and embedded by the bundled Xcode template at
|
|
12
|
+
build time; its ``build/utils.sh`` helper (shipped inside the framework
|
|
13
|
+
by BeeWare) installs the standard library and converts binary modules
|
|
14
|
+
into signed frameworks during the Xcode build. There is no post-build
|
|
15
|
+
copy step.
|
|
16
|
+
|
|
17
|
+
Android doesn't need any of this: Chaquopy ships its own CPython via
|
|
18
|
+
Gradle, so there's no Android equivalent here.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import hashlib
|
|
24
|
+
import tarfile
|
|
25
|
+
import urllib.request
|
|
26
|
+
from dataclasses import dataclass
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Callable, Optional
|
|
29
|
+
|
|
30
|
+
# Pinned, checksum-verified Python-Apple-support assets. Every version in
|
|
31
|
+
# ``config.SUPPORTED_PYTHON_VERSIONS`` must have an entry here; iOS builds
|
|
32
|
+
# refuse to run against an unpinned, unverified runtime.
|
|
33
|
+
#
|
|
34
|
+
# Both builds target iOS 13.0 and ship ``ios-arm64`` (device) and
|
|
35
|
+
# ``ios-arm64_x86_64-simulator`` slices, so a single package covers every
|
|
36
|
+
# ``pn run ios`` / ``pn build ios`` destination.
|
|
37
|
+
PINNED_ASSETS = {
|
|
38
|
+
"3.13": (
|
|
39
|
+
"3.13-b14",
|
|
40
|
+
"Python-3.13-iOS-support.b14.tar.gz",
|
|
41
|
+
"8b5cb76ef8d8a2946052479358eeec9d54b4496cb60920e175ec1489b5cf7963",
|
|
42
|
+
),
|
|
43
|
+
"3.14": (
|
|
44
|
+
"3.14-b10",
|
|
45
|
+
"Python-3.14-iOS-support.b10.tar.gz",
|
|
46
|
+
"200ef60eb67be0483ceb638daa9048f84f41a9a952707a5ad4c3198037c7b583",
|
|
47
|
+
),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
_DOWNLOAD_URL = "https://github.com/beeware/Python-Apple-support/releases/download/{tag}/{name}"
|
|
51
|
+
_USER_AGENT = "pythonnative-cli"
|
|
52
|
+
|
|
53
|
+
Logger = Callable[[str], None]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class IOSRuntime:
|
|
58
|
+
"""A resolved, extracted iOS CPython support package.
|
|
59
|
+
|
|
60
|
+
Attributes:
|
|
61
|
+
python_version: The CPython ``major.minor`` version.
|
|
62
|
+
xcframework_dir: Path to the extracted ``Python.xcframework``.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
python_version: str
|
|
66
|
+
xcframework_dir: Path
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def install_script(self) -> Path:
|
|
70
|
+
"""Path to BeeWare's ``utils.sh`` build helper inside the framework."""
|
|
71
|
+
return self.xcframework_dir / "build" / "utils.sh"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _sha256(path: Path) -> str:
|
|
75
|
+
digest = hashlib.sha256()
|
|
76
|
+
with open(path, "rb") as handle:
|
|
77
|
+
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
|
|
78
|
+
digest.update(chunk)
|
|
79
|
+
return digest.hexdigest()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _safe_extract(tar_path: Path, dest: Path) -> None:
|
|
83
|
+
"""Extract a tarball, refusing entries that escape ``dest``."""
|
|
84
|
+
dest = dest.resolve()
|
|
85
|
+
with tarfile.open(tar_path, "r:gz") as tar:
|
|
86
|
+
members = tar.getmembers()
|
|
87
|
+
for member in members:
|
|
88
|
+
target = (dest / member.name).resolve()
|
|
89
|
+
if not str(target).startswith(str(dest)):
|
|
90
|
+
raise RuntimeError(f"Refusing to extract unsafe path: {member.name}")
|
|
91
|
+
# ``filter='data'`` (3.12+) blocks unsafe members; older Pythons
|
|
92
|
+
# fall back to the manual check above.
|
|
93
|
+
try:
|
|
94
|
+
tar.extractall(dest, filter="data")
|
|
95
|
+
except TypeError:
|
|
96
|
+
tar.extractall(dest)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _locate_runtime(extract_root: Path, python_version: str) -> IOSRuntime:
|
|
100
|
+
xcframework = extract_root / "Python.xcframework"
|
|
101
|
+
if not xcframework.is_dir():
|
|
102
|
+
raise RuntimeError("Python.xcframework not found in extracted Python-Apple-support package.")
|
|
103
|
+
runtime = IOSRuntime(python_version=python_version, xcframework_dir=xcframework)
|
|
104
|
+
if not runtime.install_script.is_file():
|
|
105
|
+
raise RuntimeError(
|
|
106
|
+
"The extracted Python.xcframework is missing build/utils.sh; the support "
|
|
107
|
+
"package layout is older than PythonNative expects. Delete the "
|
|
108
|
+
"build/ios_runtime cache and re-run to fetch the pinned asset."
|
|
109
|
+
)
|
|
110
|
+
return runtime
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def prepare_ios_runtime(
|
|
114
|
+
cache_dir: Path,
|
|
115
|
+
python_version: str = "3.13",
|
|
116
|
+
*,
|
|
117
|
+
log: Optional[Logger] = None,
|
|
118
|
+
) -> IOSRuntime:
|
|
119
|
+
"""Download (if needed), verify, and extract the iOS CPython package.
|
|
120
|
+
|
|
121
|
+
The download and extraction are cached under ``cache_dir`` so repeat
|
|
122
|
+
builds are fast. Only pinned, checksum-verified versions are
|
|
123
|
+
accepted; there is no unverified fallback.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
cache_dir: Directory to store downloads and extractions in.
|
|
127
|
+
python_version: CPython ``major.minor`` to fetch.
|
|
128
|
+
log: Optional callback for progress messages.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
A resolved [`IOSRuntime`][pythonnative.project.runtime_assets.IOSRuntime].
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
RuntimeError: If the version has no pinned asset, the download
|
|
135
|
+
fails, the checksum doesn't match, or the package layout is
|
|
136
|
+
unexpected.
|
|
137
|
+
"""
|
|
138
|
+
emit: Logger = log or (lambda _message: None)
|
|
139
|
+
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
140
|
+
|
|
141
|
+
pinned = PINNED_ASSETS.get(python_version)
|
|
142
|
+
if pinned is None:
|
|
143
|
+
supported = ", ".join(sorted(PINNED_ASSETS))
|
|
144
|
+
raise RuntimeError(
|
|
145
|
+
f"No pinned iOS runtime for Python {python_version}. Set app.python_version to one of: {supported}."
|
|
146
|
+
)
|
|
147
|
+
tag, asset_name, expected_sha = pinned
|
|
148
|
+
|
|
149
|
+
extract_root = cache_dir / f"python-{python_version}"
|
|
150
|
+
if extract_root.is_dir():
|
|
151
|
+
try:
|
|
152
|
+
return _locate_runtime(extract_root, python_version)
|
|
153
|
+
except RuntimeError:
|
|
154
|
+
# Stale/partial extraction: re-extract below.
|
|
155
|
+
pass
|
|
156
|
+
|
|
157
|
+
url = _DOWNLOAD_URL.format(tag=tag, name=asset_name)
|
|
158
|
+
tar_path = cache_dir / asset_name
|
|
159
|
+
if not tar_path.exists() or _sha256(tar_path) != expected_sha:
|
|
160
|
+
emit(f"Downloading embedded Python runtime ({python_version} iOS): {asset_name}")
|
|
161
|
+
req = urllib.request.Request(url, headers={"User-Agent": _USER_AGENT})
|
|
162
|
+
try:
|
|
163
|
+
with urllib.request.urlopen(req) as response, open(tar_path, "wb") as handle:
|
|
164
|
+
handle.write(response.read())
|
|
165
|
+
except OSError as exc:
|
|
166
|
+
tar_path.unlink(missing_ok=True)
|
|
167
|
+
raise RuntimeError(
|
|
168
|
+
f"Could not download the iOS Python runtime from {url}: {exc}. "
|
|
169
|
+
"Check your network connection and re-run."
|
|
170
|
+
) from exc
|
|
171
|
+
|
|
172
|
+
actual = _sha256(tar_path)
|
|
173
|
+
if actual != expected_sha:
|
|
174
|
+
tar_path.unlink(missing_ok=True)
|
|
175
|
+
raise RuntimeError(
|
|
176
|
+
f"Checksum mismatch for {asset_name}: expected {expected_sha}, got {actual}. "
|
|
177
|
+
"The download may be corrupt; re-run to try again."
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
emit("Extracting embedded Python runtime...")
|
|
181
|
+
extract_root.mkdir(parents=True, exist_ok=True)
|
|
182
|
+
_safe_extract(tar_path, extract_root)
|
|
183
|
+
return _locate_runtime(extract_root, python_version)
|
pythonnative/py.typed
ADDED
|
File without changes
|
pythonnative/query.py
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""Shared async query cache with deduplication and explicit invalidation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import time
|
|
7
|
+
from collections import OrderedDict
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any, Awaitable, Callable, Hashable
|
|
10
|
+
|
|
11
|
+
from .runtime import TaskScope
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class QuerySnapshot:
|
|
16
|
+
"""Immutable state shared by every subscriber to a query key."""
|
|
17
|
+
|
|
18
|
+
data: Any = None
|
|
19
|
+
loading: bool = False
|
|
20
|
+
error: BaseException | None = None
|
|
21
|
+
revision: int = 0
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class _Entry:
|
|
25
|
+
def __init__(self, initial: Any) -> None:
|
|
26
|
+
self.snapshot = QuerySnapshot(data=initial, loading=True)
|
|
27
|
+
self.listeners: set[Callable[[], None]] = set()
|
|
28
|
+
self.fetcher: Callable[[], Awaitable[Any]] | None = None
|
|
29
|
+
self.task: Any = None
|
|
30
|
+
self.expires = 0.0
|
|
31
|
+
self.generation = 0
|
|
32
|
+
|
|
33
|
+
def publish(self, *, data: Any, loading: bool, error: BaseException | None = None) -> None:
|
|
34
|
+
self.snapshot = QuerySnapshot(data, loading, error, self.snapshot.revision + 1)
|
|
35
|
+
for listener in tuple(self.listeners):
|
|
36
|
+
listener()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class QueryClient:
|
|
40
|
+
"""Own shared requests and cached immutable results for one application.
|
|
41
|
+
|
|
42
|
+
A final unsubscribe cancels pending work. Cached values remain bounded by
|
|
43
|
+
capacity. Invalidation cancels older requests before starting replacements.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, *, capacity: int = 128, stale_time: float = 30) -> None:
|
|
47
|
+
if capacity < 1 or stale_time < 0:
|
|
48
|
+
raise ValueError("Invalid query cache limits")
|
|
49
|
+
self.capacity = capacity
|
|
50
|
+
self.stale_time = stale_time
|
|
51
|
+
self._entries: OrderedDict[Hashable, _Entry] = OrderedDict()
|
|
52
|
+
self._scope = TaskScope("queries")
|
|
53
|
+
|
|
54
|
+
def _entry(self, key: Hashable, initial: Any = None) -> _Entry:
|
|
55
|
+
hash(key)
|
|
56
|
+
if key not in self._entries:
|
|
57
|
+
self._entries[key] = _Entry(initial)
|
|
58
|
+
self._entries.move_to_end(key)
|
|
59
|
+
for old_key, old in tuple(self._entries.items()):
|
|
60
|
+
if len(self._entries) <= self.capacity:
|
|
61
|
+
break
|
|
62
|
+
if old_key != key and not old.listeners and (old.task is None or old.task.done()):
|
|
63
|
+
del self._entries[old_key]
|
|
64
|
+
return self._entries[key]
|
|
65
|
+
|
|
66
|
+
def snapshot(self, key: Hashable, initial: Any = None) -> QuerySnapshot:
|
|
67
|
+
"""Read a stable snapshot without starting network work."""
|
|
68
|
+
return self._entry(key, initial).snapshot
|
|
69
|
+
|
|
70
|
+
def subscribe(
|
|
71
|
+
self, key: Hashable, fetcher: Callable[[], Awaitable[Any]], listener: Callable[[], None]
|
|
72
|
+
) -> Callable[[], None]:
|
|
73
|
+
"""Subscribe and start one shared request when cached data is stale."""
|
|
74
|
+
entry = self._entry(key)
|
|
75
|
+
entry.fetcher = fetcher
|
|
76
|
+
entry.listeners.add(listener)
|
|
77
|
+
if entry.expires <= time.monotonic():
|
|
78
|
+
self._fetch(entry)
|
|
79
|
+
|
|
80
|
+
def remove() -> None:
|
|
81
|
+
entry.listeners.discard(listener)
|
|
82
|
+
if not entry.listeners and entry.task is not None and not entry.task.done():
|
|
83
|
+
entry.generation += 1
|
|
84
|
+
entry.task.cancel()
|
|
85
|
+
entry.task = None
|
|
86
|
+
entry.publish(data=entry.snapshot.data, loading=False)
|
|
87
|
+
|
|
88
|
+
return remove
|
|
89
|
+
|
|
90
|
+
def _fetch(self, entry: _Entry) -> None:
|
|
91
|
+
if entry.fetcher is None or entry.task is not None and not entry.task.done():
|
|
92
|
+
return
|
|
93
|
+
generation = entry.generation
|
|
94
|
+
fetcher = entry.fetcher
|
|
95
|
+
entry.publish(data=entry.snapshot.data, loading=True)
|
|
96
|
+
|
|
97
|
+
async def run() -> None:
|
|
98
|
+
try:
|
|
99
|
+
result = await fetcher()
|
|
100
|
+
if generation == entry.generation:
|
|
101
|
+
entry.expires = time.monotonic() + self.stale_time
|
|
102
|
+
entry.publish(data=result, loading=False)
|
|
103
|
+
except asyncio.CancelledError:
|
|
104
|
+
raise
|
|
105
|
+
except Exception as error:
|
|
106
|
+
if generation == entry.generation:
|
|
107
|
+
entry.publish(data=entry.snapshot.data, loading=False, error=error)
|
|
108
|
+
|
|
109
|
+
entry.task = self._scope.create_task(run())
|
|
110
|
+
|
|
111
|
+
def invalidate(self, key: Hashable | None = None) -> None:
|
|
112
|
+
"""Invalidate one key or every query and refresh active subscribers."""
|
|
113
|
+
for entry in [self._entry(key)] if key is not None else list(self._entries.values()):
|
|
114
|
+
entry.generation += 1
|
|
115
|
+
entry.expires = 0
|
|
116
|
+
if entry.task is not None:
|
|
117
|
+
entry.task.cancel()
|
|
118
|
+
entry.task = None
|
|
119
|
+
if entry.listeners:
|
|
120
|
+
self._fetch(entry)
|
|
121
|
+
|
|
122
|
+
def set_data(self, key: Hashable, value: Any) -> None:
|
|
123
|
+
"""Publish an immutable optimistic result and supersede older requests."""
|
|
124
|
+
entry = self._entry(key)
|
|
125
|
+
entry.generation += 1
|
|
126
|
+
if entry.task is not None:
|
|
127
|
+
entry.task.cancel()
|
|
128
|
+
entry.task = None
|
|
129
|
+
entry.expires = time.monotonic() + self.stale_time
|
|
130
|
+
entry.publish(data=value, loading=False)
|
|
131
|
+
|
|
132
|
+
def close(self) -> None:
|
|
133
|
+
"""Cancel shared tasks and release all cached data and listeners."""
|
|
134
|
+
self._scope.close()
|
|
135
|
+
self._entries.clear()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
_default: QueryClient | None = None
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def default_client() -> QueryClient:
|
|
142
|
+
"""Return the application's default query cache."""
|
|
143
|
+
global _default
|
|
144
|
+
if _default is None or _default._scope.closed:
|
|
145
|
+
_default = QueryClient()
|
|
146
|
+
return _default
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _reset_for_tests() -> None:
|
|
150
|
+
global _default
|
|
151
|
+
if _default is not None:
|
|
152
|
+
_default.close()
|
|
153
|
+
_default = None
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Reconciler package: turns element trees into batched native mutations.
|
|
2
|
+
|
|
3
|
+
The public surface is [`Reconciler`][pythonnative.reconciler.core.Reconciler] and
|
|
4
|
+
[`VNode`][pythonnative.reconciler.vnode.VNode]; the remaining modules are
|
|
5
|
+
implementation detail:
|
|
6
|
+
|
|
7
|
+
- ``core``: render, diff, commit.
|
|
8
|
+
- ``boundaries``: ``ErrorBoundary``
|
|
9
|
+
and ``Suspense``.
|
|
10
|
+
- ``layout_pass``: the flexbox
|
|
11
|
+
pass and frame diffing.
|
|
12
|
+
- ``children``: minimal move
|
|
13
|
+
planning for keyed child lists.
|
|
14
|
+
- ``vnode``: the mounted-tree node and
|
|
15
|
+
pure helpers.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from .children import plan_child_moves
|
|
19
|
+
from .core import Reconciler
|
|
20
|
+
from .vnode import VNode, next_tag, normalize_children, shallow_equal_props
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"Reconciler",
|
|
24
|
+
"VNode",
|
|
25
|
+
"next_tag",
|
|
26
|
+
"normalize_children",
|
|
27
|
+
"plan_child_moves",
|
|
28
|
+
"shallow_equal_props",
|
|
29
|
+
]
|