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,271 @@
|
|
|
1
|
+
"""The ``@component`` decorator and the [`Component`][pythonnative.Component] type.
|
|
2
|
+
|
|
3
|
+
A component is a plain Python function that takes props and returns a
|
|
4
|
+
[`Node`][pythonnative.element.Node]: an [`Element`][pythonnative.Element],
|
|
5
|
+
a list of elements, or ``None``. Decorating it with
|
|
6
|
+
[`@component`][pythonnative.component.component] turns it into a
|
|
7
|
+
[`Component`][pythonnative.Component]: a callable that *describes* a
|
|
8
|
+
render (it returns an ``Element`` whose ``type`` is the component)
|
|
9
|
+
instead of performing one. The reconciler invokes the function body
|
|
10
|
+
later, with hook state installed.
|
|
11
|
+
|
|
12
|
+
The decorator preserves the function's signature for type checkers via
|
|
13
|
+
:class:`typing.ParamSpec`, so ``Greeting(nme="x")`` is a static error
|
|
14
|
+
and editors autocomplete props from the function definition.
|
|
15
|
+
|
|
16
|
+
Children
|
|
17
|
+
--------
|
|
18
|
+
|
|
19
|
+
Children are positional. A component that accepts children declares a
|
|
20
|
+
``*children`` parameter, exactly like the built-in containers:
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
@pn.component
|
|
24
|
+
def Card(*children: pn.Element, title: str = "") -> pn.Element:
|
|
25
|
+
return pn.Column(pn.Text(title, style=pn.style(bold=True)), *children)
|
|
26
|
+
|
|
27
|
+
Card(pn.Text("body"), title="Hello")
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Positional arguments to a component *without* ``*children`` bind to its
|
|
31
|
+
positional parameters, so ``Greeting("World")`` works for
|
|
32
|
+
``def Greeting(name: str)``.
|
|
33
|
+
|
|
34
|
+
Keys
|
|
35
|
+
----
|
|
36
|
+
|
|
37
|
+
Every component accepts ``key=`` at the call site for keyed
|
|
38
|
+
reconciliation. ``key`` is consumed by the framework and is not passed
|
|
39
|
+
to the function unless the function declares a ``key`` parameter
|
|
40
|
+
itself. Declaring it (``key: str | None = None``) is the way to keep
|
|
41
|
+
strict type checkers happy when a component is rendered in a list;
|
|
42
|
+
otherwise use [`Element.with_key`][pythonnative.element.Element.with_key].
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
from __future__ import annotations
|
|
46
|
+
|
|
47
|
+
import functools
|
|
48
|
+
import inspect
|
|
49
|
+
from typing import Any, Awaitable, Callable, Dict, Generic, List, Optional, ParamSpec, Tuple, Union, overload
|
|
50
|
+
|
|
51
|
+
from .element import Element, Node
|
|
52
|
+
|
|
53
|
+
__all__ = ["Component", "RenderFn", "component", "memo", "is_component"]
|
|
54
|
+
|
|
55
|
+
P = ParamSpec("P")
|
|
56
|
+
|
|
57
|
+
RenderFn = Callable[P, Union[Node, Awaitable[Node]]]
|
|
58
|
+
"""A component body: returns a [`Node`][pythonnative.element.Node], or awaits one when ``async def``."""
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class Component(Generic[P]):
|
|
62
|
+
"""A render-function wrapped by [`@component`][pythonnative.component.component].
|
|
63
|
+
|
|
64
|
+
Calling a ``Component`` does not run the function; it returns an
|
|
65
|
+
[`Element`][pythonnative.Element] describing the call so the
|
|
66
|
+
reconciler can mount it, preserve its hook state across renders,
|
|
67
|
+
and re-run it when its state or props change.
|
|
68
|
+
|
|
69
|
+
Attributes:
|
|
70
|
+
fn: The original render function.
|
|
71
|
+
display_name: Name shown in diagnostics and dev tooling
|
|
72
|
+
(defaults to ``fn.__name__``).
|
|
73
|
+
memoized: Whether [`memo`][pythonnative.memo] was applied, in
|
|
74
|
+
which case the reconciler skips re-rendering this component
|
|
75
|
+
when its props are shallowly equal to the previous render.
|
|
76
|
+
accepts_children: Whether ``fn`` declares ``*children``.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
__slots__ = (
|
|
80
|
+
"fn",
|
|
81
|
+
"display_name",
|
|
82
|
+
"memoized",
|
|
83
|
+
"props_equal",
|
|
84
|
+
"accepts_children",
|
|
85
|
+
"_positional",
|
|
86
|
+
"_declares_key",
|
|
87
|
+
"_is_async",
|
|
88
|
+
"refresh_signature",
|
|
89
|
+
"__wrapped__",
|
|
90
|
+
"__dict__",
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def __init__(self, fn: RenderFn[P], *, display_name: Optional[str] = None) -> None:
|
|
94
|
+
if isinstance(fn, Component):
|
|
95
|
+
raise TypeError(f"{fn!r} is already a component; remove the duplicate @component")
|
|
96
|
+
sig = inspect.signature(fn)
|
|
97
|
+
positional: List[str] = []
|
|
98
|
+
accepts_children = False
|
|
99
|
+
declares_key = False
|
|
100
|
+
for name, param in sig.parameters.items():
|
|
101
|
+
if param.kind in (inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.POSITIONAL_OR_KEYWORD):
|
|
102
|
+
positional.append(name)
|
|
103
|
+
elif param.kind is inspect.Parameter.VAR_POSITIONAL:
|
|
104
|
+
accepts_children = True
|
|
105
|
+
if name == "key":
|
|
106
|
+
declares_key = True
|
|
107
|
+
from .refresh import hook_signature
|
|
108
|
+
|
|
109
|
+
self.refresh_signature = hook_signature(fn)
|
|
110
|
+
self.fn = fn
|
|
111
|
+
self.display_name = display_name or getattr(fn, "__name__", "Component")
|
|
112
|
+
self.memoized = False
|
|
113
|
+
self.props_equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None
|
|
114
|
+
self.accepts_children = accepts_children
|
|
115
|
+
self._positional: Tuple[str, ...] = tuple(positional)
|
|
116
|
+
self._declares_key = declares_key
|
|
117
|
+
self._is_async = inspect.iscoroutinefunction(fn)
|
|
118
|
+
self.__wrapped__ = fn
|
|
119
|
+
functools.update_wrapper(self, fn, updated=())
|
|
120
|
+
|
|
121
|
+
# ------------------------------------------------------------------
|
|
122
|
+
# Element construction
|
|
123
|
+
# ------------------------------------------------------------------
|
|
124
|
+
|
|
125
|
+
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> Element:
|
|
126
|
+
"""Describe a render of this component with the given props."""
|
|
127
|
+
props: Dict[str, Any] = dict(kwargs)
|
|
128
|
+
key = props.pop("key", None) if not self._declares_key else props.get("key")
|
|
129
|
+
children: List[Any] = []
|
|
130
|
+
if args:
|
|
131
|
+
if self.accepts_children:
|
|
132
|
+
children = list(args)
|
|
133
|
+
else:
|
|
134
|
+
names = self._positional
|
|
135
|
+
if len(args) > len(names):
|
|
136
|
+
raise TypeError(
|
|
137
|
+
f"{self.display_name}() takes {len(names)} positional argument(s) but "
|
|
138
|
+
f"{len(args)} were given. Declare *children to accept child elements."
|
|
139
|
+
)
|
|
140
|
+
for name, value in zip(names, args):
|
|
141
|
+
if name in props:
|
|
142
|
+
raise TypeError(f"{self.display_name}() got multiple values for argument {name!r}")
|
|
143
|
+
props[name] = value
|
|
144
|
+
return Element(self, props, children, key=key if isinstance(key, str) or key is None else str(key))
|
|
145
|
+
|
|
146
|
+
# ------------------------------------------------------------------
|
|
147
|
+
# Rendering (used by the reconciler)
|
|
148
|
+
# ------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
def render(self, element: Element) -> Any:
|
|
151
|
+
"""Invoke the render function for ``element``.
|
|
152
|
+
|
|
153
|
+
Children stored on the element are passed positionally; props
|
|
154
|
+
are passed by keyword. Returns whatever the function returned
|
|
155
|
+
(an element, a list, ``None``, or a coroutine for ``async def``
|
|
156
|
+
bodies).
|
|
157
|
+
"""
|
|
158
|
+
if self.accepts_children:
|
|
159
|
+
return self.fn(*element.children, **element.props)
|
|
160
|
+
return self.fn(**element.props) # type: ignore[call-arg]
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def is_async(self) -> bool:
|
|
164
|
+
"""Whether the render function is an ``async def``."""
|
|
165
|
+
return self._is_async
|
|
166
|
+
|
|
167
|
+
def __repr__(self) -> str:
|
|
168
|
+
flags = " memo" if self.memoized else ""
|
|
169
|
+
return f"<Component {self.display_name}{flags}>"
|
|
170
|
+
|
|
171
|
+
def __get__(self, instance: Any, owner: Any = None) -> "Component[P]":
|
|
172
|
+
# Components stored on classes (rare) should not bind ``self``.
|
|
173
|
+
return self
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def component(fn: RenderFn[P]) -> Component[P]:
|
|
177
|
+
"""Turn a render function into a [`Component`][pythonnative.Component].
|
|
178
|
+
|
|
179
|
+
The decorated function may use hooks (``use_state``, ``use_effect``,
|
|
180
|
+
etc.) and returns an [`Element`][pythonnative.Element] tree, a list
|
|
181
|
+
of elements, or ``None``. Each call site creates an independent
|
|
182
|
+
component instance with its own hook state.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
fn: The render function. May be ``async def``; the body is then
|
|
186
|
+
driven by the reconciler and suspends on pending awaits (see
|
|
187
|
+
[`Suspense`][pythonnative.Suspense]).
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
A ``Component`` whose call signature mirrors ``fn`` (plus the
|
|
191
|
+
framework ``key=`` keyword).
|
|
192
|
+
|
|
193
|
+
Example:
|
|
194
|
+
```python
|
|
195
|
+
import pythonnative as pn
|
|
196
|
+
|
|
197
|
+
@pn.component
|
|
198
|
+
def Greeting(name: str = "World"):
|
|
199
|
+
return pn.Text(f"Hello, {name}!")
|
|
200
|
+
```
|
|
201
|
+
"""
|
|
202
|
+
return Component(fn)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@overload
|
|
206
|
+
def memo(
|
|
207
|
+
target: Component[P], *, equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None
|
|
208
|
+
) -> Component[P]: ...
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@overload
|
|
212
|
+
def memo(
|
|
213
|
+
target: None = None, *, equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None
|
|
214
|
+
) -> Callable[[Component[P]], Component[P]]: ...
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def memo(
|
|
218
|
+
target: Optional[Component[P]] = None,
|
|
219
|
+
*,
|
|
220
|
+
equal: Optional[Callable[[Dict[str, Any], Dict[str, Any]], bool]] = None,
|
|
221
|
+
) -> Any:
|
|
222
|
+
"""Skip a component's render when its props haven't changed.
|
|
223
|
+
|
|
224
|
+
Apply on top of ``@component``. When the reconciler re-renders the
|
|
225
|
+
parent tree, a memoized child is skipped (its previously-rendered
|
|
226
|
+
subtree is reused) iff its props and children are equal to the
|
|
227
|
+
previous render and none of its own state setters fired. Props are
|
|
228
|
+
compared shallowly by default: callables by identity, everything
|
|
229
|
+
else by ``==``.
|
|
230
|
+
|
|
231
|
+
Pair with [`use_callback`][pythonnative.use_callback] when passing
|
|
232
|
+
callbacks as props, otherwise a fresh closure defeats the memo.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
target: A [`Component`][pythonnative.Component].
|
|
236
|
+
equal: Optional custom comparator ``(old_props, new_props) ->
|
|
237
|
+
bool`` replacing the shallow comparison.
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
The same component, marked for memoization (or a decorator when
|
|
241
|
+
called with keyword arguments only).
|
|
242
|
+
|
|
243
|
+
Example:
|
|
244
|
+
```python
|
|
245
|
+
@pn.memo
|
|
246
|
+
@pn.component
|
|
247
|
+
def ExpensiveRow(label: str):
|
|
248
|
+
...
|
|
249
|
+
|
|
250
|
+
@pn.memo(equal=lambda a, b: a["id"] == b["id"])
|
|
251
|
+
@pn.component
|
|
252
|
+
def Row(id: int, extra: dict):
|
|
253
|
+
...
|
|
254
|
+
```
|
|
255
|
+
"""
|
|
256
|
+
|
|
257
|
+
def apply(comp: Component[P]) -> Component[P]:
|
|
258
|
+
if not isinstance(comp, Component):
|
|
259
|
+
raise TypeError("@memo must wrap a @component; write @memo above @component")
|
|
260
|
+
comp.memoized = True
|
|
261
|
+
comp.props_equal = equal
|
|
262
|
+
return comp
|
|
263
|
+
|
|
264
|
+
if target is None:
|
|
265
|
+
return apply
|
|
266
|
+
return apply(target)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def is_component(obj: Any) -> bool:
|
|
270
|
+
"""Return whether ``obj`` is a [`Component`][pythonnative.Component]."""
|
|
271
|
+
return isinstance(obj, Component)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""Built-in element factories.
|
|
2
|
+
|
|
3
|
+
Each factory function (``Text``, ``Button``, …) is a fully-typed thin
|
|
4
|
+
wrapper that builds an [`Element`][pythonnative.Element] through the
|
|
5
|
+
shared ``_make_element`` helper, so style resolution, ``ref``
|
|
6
|
+
attachment, ``None``-default dropping, and forced overrides (e.g.
|
|
7
|
+
``Column``'s fixed ``flex_direction``) live in exactly one place. The
|
|
8
|
+
factory signatures themselves are the canonical prop schemas: editors
|
|
9
|
+
and type checkers validate calls directly against them.
|
|
10
|
+
|
|
11
|
+
The factories are grouped by concern into submodules (``text``,
|
|
12
|
+
``media``, ``controls``, ``layout``, ``pressable``, ``overlays``,
|
|
13
|
+
``structural``, ``lists``); everything public is re-exported here, so
|
|
14
|
+
``from pythonnative.components import Text`` keeps working.
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
```python
|
|
18
|
+
import pythonnative as pn
|
|
19
|
+
|
|
20
|
+
pn.Column(
|
|
21
|
+
pn.Text("Hello", style=pn.style(font_size=18)),
|
|
22
|
+
pn.Button("Tap", on_press=lambda: print("tapped")),
|
|
23
|
+
style=pn.style(spacing=12, padding=16),
|
|
24
|
+
)
|
|
25
|
+
```
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from ._base import _SPAN_STYLE_KEYS, _flatten_text_spans, _make_element # noqa: F401
|
|
29
|
+
from .controls import (
|
|
30
|
+
ActivityIndicator,
|
|
31
|
+
Checkbox,
|
|
32
|
+
DatePicker,
|
|
33
|
+
Picker,
|
|
34
|
+
ProgressBar,
|
|
35
|
+
RefreshControl,
|
|
36
|
+
SegmentedControl,
|
|
37
|
+
Slider,
|
|
38
|
+
StatusBar,
|
|
39
|
+
Switch,
|
|
40
|
+
)
|
|
41
|
+
from .layout import ( # noqa: F401
|
|
42
|
+
_SAFE_AREA_EDGES,
|
|
43
|
+
Column,
|
|
44
|
+
KeyboardAvoidingView,
|
|
45
|
+
Row,
|
|
46
|
+
SafeAreaView,
|
|
47
|
+
ScrollView,
|
|
48
|
+
Spacer,
|
|
49
|
+
View,
|
|
50
|
+
_KeyboardAvoidingContainer,
|
|
51
|
+
_numeric_edge_padding,
|
|
52
|
+
_SafeAreaContainer,
|
|
53
|
+
)
|
|
54
|
+
from .lists import ( # noqa: F401
|
|
55
|
+
_DEFAULT_ROW_EXTENT,
|
|
56
|
+
FlatList,
|
|
57
|
+
ListController,
|
|
58
|
+
SectionList,
|
|
59
|
+
_dispatch_scroll_command,
|
|
60
|
+
_native_lists_supported,
|
|
61
|
+
_NativeList,
|
|
62
|
+
_RowSpec,
|
|
63
|
+
_VirtualizedList,
|
|
64
|
+
)
|
|
65
|
+
from .media import Image, ImageBackground, WebView
|
|
66
|
+
from .overlays import Modal, Portal
|
|
67
|
+
from .pressable import Pressable, TouchableOpacity, _StatefulPressable # noqa: F401
|
|
68
|
+
from .structural import ErrorBoundary, Fragment, Suspense
|
|
69
|
+
from .text import Button, Text, TextInput
|
|
70
|
+
|
|
71
|
+
__all__ = [
|
|
72
|
+
"ActivityIndicator",
|
|
73
|
+
"Button",
|
|
74
|
+
"Checkbox",
|
|
75
|
+
"Column",
|
|
76
|
+
"DatePicker",
|
|
77
|
+
"ErrorBoundary",
|
|
78
|
+
"FlatList",
|
|
79
|
+
"Fragment",
|
|
80
|
+
"Image",
|
|
81
|
+
"ImageBackground",
|
|
82
|
+
"KeyboardAvoidingView",
|
|
83
|
+
"ListController",
|
|
84
|
+
"Modal",
|
|
85
|
+
"Picker",
|
|
86
|
+
"Portal",
|
|
87
|
+
"Pressable",
|
|
88
|
+
"ProgressBar",
|
|
89
|
+
"RefreshControl",
|
|
90
|
+
"Row",
|
|
91
|
+
"SafeAreaView",
|
|
92
|
+
"ScrollView",
|
|
93
|
+
"SectionList",
|
|
94
|
+
"SegmentedControl",
|
|
95
|
+
"Slider",
|
|
96
|
+
"Spacer",
|
|
97
|
+
"StatusBar",
|
|
98
|
+
"Suspense",
|
|
99
|
+
"Switch",
|
|
100
|
+
"Text",
|
|
101
|
+
"TextInput",
|
|
102
|
+
"TouchableOpacity",
|
|
103
|
+
"View",
|
|
104
|
+
"WebView",
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
# Factories are the single source for Python signatures and native contracts.
|
|
108
|
+
from ..sdk.builtins import install as _install_native_contracts
|
|
109
|
+
|
|
110
|
+
_install_native_contracts(globals())
|
|
111
|
+
del _install_native_contracts
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"""Shared private helpers behind the built-in element factories.
|
|
2
|
+
|
|
3
|
+
Every factory in this package routes through :func:`_make_element`, so
|
|
4
|
+
style resolution, ``ref`` attachment, ``None``-default dropping, and
|
|
5
|
+
forced overrides live in exactly one place. The rich-text span
|
|
6
|
+
flattening used by ``Text`` also lives here so it can be shared.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
10
|
+
|
|
11
|
+
from ..element import Element
|
|
12
|
+
from ..hooks import Ref
|
|
13
|
+
from ..style import StyleProp, resolve_style, validate_style_keys
|
|
14
|
+
|
|
15
|
+
# ======================================================================
|
|
16
|
+
# Canonical element builder
|
|
17
|
+
# ======================================================================
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _make_element(
|
|
21
|
+
name: str,
|
|
22
|
+
*children: Element,
|
|
23
|
+
style: StyleProp = None,
|
|
24
|
+
ref: Optional[Ref] = None,
|
|
25
|
+
key: Optional[str] = None,
|
|
26
|
+
_defaults: Optional[Dict[str, Any]] = None,
|
|
27
|
+
_forced: Optional[Dict[str, Any]] = None,
|
|
28
|
+
**props: Any,
|
|
29
|
+
) -> Element:
|
|
30
|
+
"""Build an [`Element`][pythonnative.Element] of type ``name``.
|
|
31
|
+
|
|
32
|
+
This is the single helper every built-in factory routes through, so
|
|
33
|
+
the cross-cutting concerns that used to be duplicated per component
|
|
34
|
+
live in one place:
|
|
35
|
+
|
|
36
|
+
1. ``style`` is flattened via
|
|
37
|
+
[`resolve_style`][pythonnative.style.resolve_style] (list-of-dicts
|
|
38
|
+
and ``None`` both handled).
|
|
39
|
+
2. ``_defaults`` are filled in for keys not already present (used for
|
|
40
|
+
things like ``View``'s default ``flex_direction: "column"`` that
|
|
41
|
+
a user style may legitimately override).
|
|
42
|
+
3. ``**props`` are merged on top, with ``None`` values *dropped* so
|
|
43
|
+
optional kwargs don't pollute the prop dict.
|
|
44
|
+
4. ``ref`` is attached under the reserved ``"ref"`` key.
|
|
45
|
+
5. ``_forced`` overrides everything (used by ``Column`` / ``Row`` to
|
|
46
|
+
lock their flex direction regardless of user style).
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
name: Element type name (e.g. ``"Text"``).
|
|
50
|
+
*children: Child elements.
|
|
51
|
+
style: Style dict, list of dicts, or ``None``.
|
|
52
|
+
ref: Optional [`Ref`][pythonnative.Ref] from ``use_ref()``; the
|
|
53
|
+
reconciler populates ``ref.current`` with the underlying
|
|
54
|
+
native view.
|
|
55
|
+
key: Stable identity for keyed reconciliation.
|
|
56
|
+
_defaults: Internal: fill-only-if-missing prop defaults.
|
|
57
|
+
_forced: Internal: prop overrides applied last.
|
|
58
|
+
**props: Per-component props. ``None`` values are dropped.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
A fresh [`Element`][pythonnative.Element].
|
|
62
|
+
"""
|
|
63
|
+
from ..sdk.builtins import validate_props
|
|
64
|
+
|
|
65
|
+
validate_props(name, props)
|
|
66
|
+
out: Dict[str, Any] = dict(resolve_style(style))
|
|
67
|
+
if out:
|
|
68
|
+
validate_style_keys(out, owner=name)
|
|
69
|
+
if _defaults:
|
|
70
|
+
for k, v in _defaults.items():
|
|
71
|
+
out.setdefault(k, v)
|
|
72
|
+
for k, v in props.items():
|
|
73
|
+
if v is not None:
|
|
74
|
+
out[k] = v
|
|
75
|
+
if ref is not None:
|
|
76
|
+
out["ref"] = ref
|
|
77
|
+
if _forced:
|
|
78
|
+
out.update(_forced)
|
|
79
|
+
return Element(name, out, list(children), key=key)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# ======================================================================
|
|
83
|
+
# RefreshControl attachment
|
|
84
|
+
# ======================================================================
|
|
85
|
+
|
|
86
|
+
REFRESH_CONTROL_TYPE = "RefreshControl"
|
|
87
|
+
"""Element type produced by [`RefreshControl`][pythonnative.RefreshControl]."""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _refresh_control_props(control: Optional[Element], *, owner: str) -> Optional[Dict[str, Any]]:
|
|
91
|
+
"""Turn a ``RefreshControl`` element into the ``refresh_control`` wire prop.
|
|
92
|
+
|
|
93
|
+
Scroll containers hold their refresh control as a prop rather than
|
|
94
|
+
a child (the native side attaches a ``UIRefreshControl`` /
|
|
95
|
+
``SwipeRefreshLayout`` to the scroll view itself), so the element
|
|
96
|
+
is unwrapped here into the flat dict the bridge and the event
|
|
97
|
+
extractor expect. Keeping it an element on the Python side means
|
|
98
|
+
users build it like every other piece of UI and get a clear error
|
|
99
|
+
if they pass the wrong thing.
|
|
100
|
+
|
|
101
|
+
Raises:
|
|
102
|
+
TypeError: If ``control`` is not a ``RefreshControl`` element.
|
|
103
|
+
"""
|
|
104
|
+
if control is None:
|
|
105
|
+
return None
|
|
106
|
+
if not isinstance(control, Element) or control.type != REFRESH_CONTROL_TYPE:
|
|
107
|
+
raise TypeError(
|
|
108
|
+
f"{owner}(refresh_control=...) expects pn.RefreshControl(...), got {type(control).__name__}: {control!r}"
|
|
109
|
+
)
|
|
110
|
+
return dict(control.props)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# ======================================================================
|
|
114
|
+
# Rich text spans
|
|
115
|
+
# ======================================================================
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# Style keys that can vary per span inside a rich-text run. Layout
|
|
119
|
+
# keys are excluded: spans are inline fragments of one paragraph and
|
|
120
|
+
# have no boxes of their own.
|
|
121
|
+
_SPAN_STYLE_KEYS = (
|
|
122
|
+
"color",
|
|
123
|
+
"background_color",
|
|
124
|
+
"font_size",
|
|
125
|
+
"font_family",
|
|
126
|
+
"font_weight",
|
|
127
|
+
"bold",
|
|
128
|
+
"italic",
|
|
129
|
+
"text_decoration",
|
|
130
|
+
"letter_spacing",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _flatten_text_spans(
|
|
135
|
+
parts: Tuple[Any, ...],
|
|
136
|
+
inherited: Dict[str, Any],
|
|
137
|
+
) -> List[Dict[str, Any]]:
|
|
138
|
+
"""Flatten nested ``Text`` parts into a flat list of styled spans.
|
|
139
|
+
|
|
140
|
+
Strings become spans carrying only the inherited style overrides;
|
|
141
|
+
nested ``Text`` elements contribute their own span-style keys
|
|
142
|
+
(merged over what they inherit) and recurse into their parts.
|
|
143
|
+
"""
|
|
144
|
+
spans: List[Dict[str, Any]] = []
|
|
145
|
+
for part in parts:
|
|
146
|
+
if part is None:
|
|
147
|
+
continue
|
|
148
|
+
if isinstance(part, Element):
|
|
149
|
+
props = part.props or {}
|
|
150
|
+
child_style = dict(inherited)
|
|
151
|
+
for k in _SPAN_STYLE_KEYS:
|
|
152
|
+
if props.get(k) is not None:
|
|
153
|
+
child_style[k] = props[k]
|
|
154
|
+
nested = props.get("spans")
|
|
155
|
+
if nested:
|
|
156
|
+
for span in nested:
|
|
157
|
+
merged = dict(child_style)
|
|
158
|
+
for k in _SPAN_STYLE_KEYS:
|
|
159
|
+
if span.get(k) is not None:
|
|
160
|
+
merged[k] = span[k]
|
|
161
|
+
spans.append({"text": span.get("text", ""), **merged})
|
|
162
|
+
else:
|
|
163
|
+
spans.append({"text": str(props.get("text", "")), **child_style})
|
|
164
|
+
else:
|
|
165
|
+
spans.append({"text": str(part), **inherited})
|
|
166
|
+
return spans
|