pythonnative 0.39.0__tar.gz → 0.40.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pythonnative-0.40.0/MANIFEST.in +11 -0
- {pythonnative-0.39.0/src/pythonnative.egg-info → pythonnative-0.40.0}/PKG-INFO +1 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/pyproject.toml +10 -3
- pythonnative-0.40.0/setup.py +19 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/__init__.py +2 -3
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/animated.py +44 -20
- pythonnative-0.40.0/src/pythonnative/animation_graph.py +78 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bootstrap.py +7 -6
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/__init__.py +58 -69
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/android.py +2 -2
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/codec.py +6 -0
- pythonnative-0.40.0/src/pythonnative/bridge/commits.py +114 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/fake.py +20 -13
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/ios.py +5 -5
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/web.py +25 -66
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/cli/pn.py +31 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/component.py +17 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/__init__.py +6 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/_base.py +3 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/controls.py +9 -6
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/lists.py +121 -145
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/text.py +3 -3
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devclient.py +5 -5
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/server.py +8 -2
- pythonnative-0.40.0/src/pythonnative/devserver/static/animation_graph.js +82 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/bridge.js +0 -8
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/host.js +4 -29
- pythonnative-0.40.0/src/pythonnative/devserver/static/layout.js +85 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/renderer.js +128 -171
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/shell.js +4 -2
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/LICENSE +21 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/index.js +16 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/index.js.map +1 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/load.js +17 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/load.js.map +1 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
- pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
- pythonnative-0.40.0/src/pythonnative/equality.py +19 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/events.py +17 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/gestures.py +27 -5
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hooks.py +75 -53
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hosts/base.py +13 -73
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hosts/native.py +20 -56
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hot_reload.py +23 -8
- pythonnative-0.40.0/src/pythonnative/layout.py +328 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/build.gradle +4 -0
- pythonnative-0.40.0/src/pythonnative/native/android/gradle.properties +3 -0
- pythonnative-0.40.0/src/pythonnative/native/android/settings.gradle +12 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/PNBridge.kt +61 -14
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +11 -3
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +8 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +3 -1
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +2 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +0 -1
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +2 -2
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +6 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +0 -1
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +6 -1
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
- pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +5 -41
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +26 -3
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +7 -7
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/PromiseTest.kt +14 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Package.swift +2 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Animation/PNAnimator.swift +11 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNBridge.swift +81 -17
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNRegistry.swift +2 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNTransaction.swift +5 -4
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNButtonManagers.swift +3 -2
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNControlManagers.swift +7 -7
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNImageManager.swift +1 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNPressableManager.swift +2 -2
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTextInputManager.swift +9 -1
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/PNNativeModule.swift +44 -1
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Screens/PNViewController.swift +4 -2
- pythonnative-0.40.0/src/pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
- pythonnative-0.40.0/src/pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNManagerTests.swift +8 -6
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNModuleTests.swift +13 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/LICENSE +21 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/Package.swift +9 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/VENDORED.md +2 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/PNStyle.h +10 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/module.modulemap +5 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/python.cpp +16 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/style.cpp +272 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGConfig.h +158 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGEnums.h +142 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGMacros.h +99 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNode.h +304 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGValue.h +84 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/Yoga.h +21 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/config/Config.h +92 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/Log.h +34 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Align.h +47 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Display.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/event/event.cpp +87 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/event/event.h +130 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/module.modulemap +21 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/Node.h +337 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/Style.h +757 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
- pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/registry.py +14 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_views/bridge_backend.py +94 -82
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/handle.py +3 -36
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/navigators.py +28 -6
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/preview.py +12 -27
- pythonnative-0.40.0/src/pythonnative/profiling.py +101 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/android.py +7 -2
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/builder.py +87 -3
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/config.py +2 -2
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/deps.py +20 -4
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/fingerprint.py +1 -0
- pythonnative-0.40.0/src/pythonnative/project/lockfile.py +100 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/plugins.py +155 -2
- pythonnative-0.40.0/src/pythonnative/query.py +153 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/boundaries.py +10 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/core.py +103 -91
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/layout_pass.py +36 -2
- pythonnative-0.40.0/src/pythonnative/refresh.py +55 -0
- pythonnative-0.40.0/src/pythonnative/runtime.py +306 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/sdk/__init__.py +7 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/sdk/_components.py +19 -0
- pythonnative-0.40.0/src/pythonnative/sdk/builtins.py +91 -0
- pythonnative-0.40.0/src/pythonnative/sdk/codegen.py +149 -0
- pythonnative-0.40.0/src/pythonnative/sdk/module_codegen.py +184 -0
- pythonnative-0.40.0/src/pythonnative/sdk/schema.py +224 -0
- pythonnative-0.40.0/src/pythonnative/sdk/templates/contracts.kt +46 -0
- pythonnative-0.40.0/src/pythonnative/sdk/templates/contracts.swift +46 -0
- pythonnative-0.40.0/src/pythonnative/suspense.py +183 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/testing/backend.py +1 -1
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/testing/harness.py +7 -29
- {pythonnative-0.39.0 → pythonnative-0.40.0/src/pythonnative.egg-info}/PKG-INFO +1 -1
- pythonnative-0.40.0/src/pythonnative.egg-info/SOURCES.txt +468 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_bridge.py +44 -54
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_cli.py +26 -0
- pythonnative-0.40.0/tests/test_codegen.py +26 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_components.py +2 -2
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_hot_reload.py +45 -0
- pythonnative-0.40.0/tests/test_inbox.py +85 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_layout.py +29 -23
- pythonnative-0.40.0/tests/test_native_lists.py +86 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_navigation.py +19 -31
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_runtime.py +5 -5
- pythonnative-0.40.0/tests/test_runtime_contracts.py +297 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_suspense.py +8 -106
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_web_transport.py +40 -9
- pythonnative-0.39.0/src/pythonnative/images.py +0 -198
- pythonnative-0.39.0/src/pythonnative/layout.py +0 -1603
- pythonnative-0.39.0/src/pythonnative/runtime.py +0 -512
- pythonnative-0.39.0/src/pythonnative/suspense.py +0 -413
- pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +0 -179
- pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/screens/Navigator.kt +0 -116
- pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNVirtualListView.java +0 -169
- pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +0 -257
- pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/HostModule.swift +0 -157
- pythonnative-0.39.0/src/pythonnative/virtual_rows.py +0 -127
- pythonnative-0.39.0/src/pythonnative.egg-info/SOURCES.txt +0 -326
- pythonnative-0.39.0/tests/test_images.py +0 -145
- pythonnative-0.39.0/tests/test_native_lists.py +0 -330
- {pythonnative-0.39.0 → pythonnative-0.40.0}/LICENSE +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/README.md +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/setup.cfg +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/_ios_log.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/alerts.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/appearance.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/cli/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/layout.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/media.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/overlays.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/pressable.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/structural.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/colors.js +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/index.html +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/preview.css +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/watcher.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/ws.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/diagnostics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/element.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hosts/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/mutations.py +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/AndroidManifest.xml +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/PythonHost.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PNColor.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TextManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/PNColorTest.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNColor.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNComponentManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNContainerView.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTabBarManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTextManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTransform.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewState.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewStyler.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNWebViewManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/AlertModule.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/LifecycleModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/MediaModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/PermissionModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/SystemModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNCompat.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNJSON.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNLog.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNWindow.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNColorTests.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNGestureTests.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNTransactionTests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/app_state.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/battery.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/biometrics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/camera.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/clipboard.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/fallback.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/file_system.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/haptics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/linking.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/location.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/net_info.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/notifications.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/permissions.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/secure_store.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/share.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_views/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_views/base.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/container.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/host.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/linking.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/screen.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/state.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/net.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/platform.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/platform_metrics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/devices.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/doctor.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/icons.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/ios.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/permissions.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/runtime_assets.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/py.typed +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/children.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/vnode.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/scheduler.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/storage.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/style.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/build.gradle +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/build.gradle +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradlew +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/testing/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/utils.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/requires.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/top_level.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_alert.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_animated.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_animated_graph.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_appearance.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_async_hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_core_semantics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_devclient.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_devserver.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_devserver_ws.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_element.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_events.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_extended_components.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_gesture_composition.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_gestures.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_hosts.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_incremental_render.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_interaction_props.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_ios_log.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_metric_hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_mutations.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_native_modules.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_native_views.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_net.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_new_components.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_platform.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_platform_metrics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_reconciler.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_ref.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_sdk.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_smoke.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_storage.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_style.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_transitions.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_utils.py +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
global-exclude *.pyc *.pyo .DS_Store
|
|
2
|
+
recursive-exclude src/pythonnative/native .build/* .gradle/* .cxx/* build/* .swiftpm/* .kotlin/*
|
|
3
|
+
prune src/pythonnative/native/android/build
|
|
4
|
+
prune src/pythonnative/native/android/.gradle
|
|
5
|
+
prune src/pythonnative/native/android/.cxx
|
|
6
|
+
prune src/pythonnative/native/ios/.build
|
|
7
|
+
prune src/pythonnative/native/ios/.swiftpm
|
|
8
|
+
prune src/pythonnative/native/yoga/.build
|
|
9
|
+
prune src/pythonnative/templates/android_template/app/build
|
|
10
|
+
prune src/pythonnative/templates/android_template/.gradle
|
|
11
|
+
prune src/pythonnative/templates/ios_template/build
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pythonnative"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.40.0"
|
|
8
8
|
description = "Cross-platform native UI toolkit for Android and iOS"
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "Owen Carey" }
|
|
@@ -93,8 +93,15 @@ license-files = ["LICENSE*"]
|
|
|
93
93
|
[tool.setuptools.package-data]
|
|
94
94
|
pythonnative = [
|
|
95
95
|
"py.typed",
|
|
96
|
-
"templates/**",
|
|
97
|
-
"devserver/static
|
|
96
|
+
"templates/**", "native/**", "sdk/templates/**",
|
|
97
|
+
"devserver/static/**",
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
[tool.setuptools.exclude-package-data]
|
|
101
|
+
pythonnative = [
|
|
102
|
+
"**/build/**", "**/.build/**", "**/.gradle/**",
|
|
103
|
+
"**/.cxx/**", "**/.swiftpm/**", "**/.kotlin/**",
|
|
104
|
+
"**/__pycache__/**", "**/.DS_Store",
|
|
98
105
|
]
|
|
99
106
|
|
|
100
107
|
[tool.ruff]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Build the host Yoga binding; mobile hosts compile the vendored core."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from setuptools import Extension, setup
|
|
7
|
+
|
|
8
|
+
root = Path("src/pythonnative/native/yoga")
|
|
9
|
+
setup(
|
|
10
|
+
ext_modules=[
|
|
11
|
+
Extension(
|
|
12
|
+
"pythonnative._yoga",
|
|
13
|
+
sources=[str(root / "python.cpp"), *map(str, sorted((root / "yoga").rglob("*.cpp")))],
|
|
14
|
+
include_dirs=[str(root)],
|
|
15
|
+
language="c++",
|
|
16
|
+
extra_compile_args=["/std:c++20"] if os.name == "nt" else ["-std=c++20"],
|
|
17
|
+
)
|
|
18
|
+
]
|
|
19
|
+
)
|
|
@@ -62,9 +62,9 @@ Example:
|
|
|
62
62
|
```
|
|
63
63
|
"""
|
|
64
64
|
|
|
65
|
-
__version__ = "0.
|
|
65
|
+
__version__ = "0.40.0"
|
|
66
66
|
|
|
67
|
-
from . import appearance, diagnostics, gestures,
|
|
67
|
+
from . import appearance, diagnostics, gestures, runtime, sdk
|
|
68
68
|
from .alerts import Alert
|
|
69
69
|
from .animated import Animated, AnimatedValue, use_animated_value
|
|
70
70
|
from .component import Component, component, memo
|
|
@@ -348,7 +348,6 @@ __all__ = [
|
|
|
348
348
|
# Appearance
|
|
349
349
|
"appearance",
|
|
350
350
|
# Image pipeline
|
|
351
|
-
"images",
|
|
352
351
|
# Animation
|
|
353
352
|
"Animated",
|
|
354
353
|
"AnimatedValue",
|
|
@@ -85,7 +85,7 @@ import weakref
|
|
|
85
85
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
|
|
86
86
|
|
|
87
87
|
from .element import Element
|
|
88
|
-
from .hooks import use_effect, use_ref
|
|
88
|
+
from .hooks import Ref, use_effect, use_ref
|
|
89
89
|
from .runtime import resolve_future
|
|
90
90
|
from .style import StyleProp, resolve_style
|
|
91
91
|
|
|
@@ -243,12 +243,17 @@ class AnimatedNode:
|
|
|
243
243
|
except Exception:
|
|
244
244
|
pass
|
|
245
245
|
|
|
246
|
+
from .animation_graph import install
|
|
247
|
+
|
|
248
|
+
install(self)
|
|
249
|
+
|
|
246
250
|
def _detach() -> None:
|
|
247
251
|
with self._lock:
|
|
248
252
|
try:
|
|
249
253
|
self._attachments.remove(binding)
|
|
250
254
|
except ValueError:
|
|
251
255
|
pass
|
|
256
|
+
install(self, detached_tag=tag)
|
|
252
257
|
|
|
253
258
|
return _detach
|
|
254
259
|
|
|
@@ -404,6 +409,12 @@ class AnimatedValue(AnimatedNode):
|
|
|
404
409
|
def set_value(self, new_value: float) -> None:
|
|
405
410
|
"""Set the value immediately, pushing to native views and listeners."""
|
|
406
411
|
self._apply(float(new_value), push_native=True)
|
|
412
|
+
from .animation_graph import install
|
|
413
|
+
|
|
414
|
+
graph = install(self)
|
|
415
|
+
if graph and graph["bindings"]:
|
|
416
|
+
backend = _backend()
|
|
417
|
+
backend.set_animated_property(graph["bindings"][0][0], f"_pn_graph:{id(self)}", float(new_value))
|
|
407
418
|
|
|
408
419
|
def _apply(self, new_value: float, push_native: bool) -> None:
|
|
409
420
|
with self._lock:
|
|
@@ -695,7 +706,12 @@ class AnimatedEvent:
|
|
|
695
706
|
if raw is None:
|
|
696
707
|
continue
|
|
697
708
|
try:
|
|
698
|
-
|
|
709
|
+
if getattr(_backend(), "install_animation_graph", None) is not None:
|
|
710
|
+
# Native already evaluated the graph at the input timestamp.
|
|
711
|
+
# Python observes the sample without echoing an older frame.
|
|
712
|
+
node._value = float(raw)
|
|
713
|
+
else:
|
|
714
|
+
node.set_value(float(raw))
|
|
699
715
|
except (TypeError, ValueError):
|
|
700
716
|
continue
|
|
701
717
|
if self._listener is not None:
|
|
@@ -1041,21 +1057,21 @@ def _start_native(value: AnimatedValue, spec: Dict[str, Any]) -> Optional[_Nativ
|
|
|
1041
1057
|
animation; otherwise rolls back any accepted targets and returns
|
|
1042
1058
|
``None`` so the caller falls back to the Python ticker.
|
|
1043
1059
|
"""
|
|
1044
|
-
targets = value.attachments()
|
|
1045
|
-
if not targets:
|
|
1046
|
-
return None
|
|
1047
|
-
if value.has_listeners():
|
|
1048
|
-
# Python listeners want per-frame values; only the ticker
|
|
1049
|
-
# provides those.
|
|
1050
|
-
return None
|
|
1051
|
-
if value._has_dependents():
|
|
1052
|
-
# Derived nodes (interpolations, arithmetic) need per-frame
|
|
1053
|
-
# Python evaluation to keep their own attachments in sync.
|
|
1054
|
-
return None
|
|
1055
1060
|
try:
|
|
1056
1061
|
backend = _backend()
|
|
1057
1062
|
except Exception:
|
|
1058
1063
|
return None
|
|
1064
|
+
from .animation_graph import install
|
|
1065
|
+
|
|
1066
|
+
graph = install(value)
|
|
1067
|
+
if graph and graph["bindings"]:
|
|
1068
|
+
targets = [(graph["bindings"][0][0], f"_pn_graph:{id(value)}")]
|
|
1069
|
+
else:
|
|
1070
|
+
targets = value.attachments()
|
|
1071
|
+
if value._has_dependents():
|
|
1072
|
+
return None
|
|
1073
|
+
if not targets or value.has_listeners():
|
|
1074
|
+
return None
|
|
1059
1075
|
|
|
1060
1076
|
group = _NativeAnimationGroup(value, _projected_final_value(spec))
|
|
1061
1077
|
accepted: List[Tuple[int, int]] = [] # (anim_id, tag)
|
|
@@ -1368,24 +1384,32 @@ def _make_animated_factory(
|
|
|
1368
1384
|
plain_style, bindings = _resolve_style_with_values(style)
|
|
1369
1385
|
|
|
1370
1386
|
ref = use_ref(None)
|
|
1387
|
+
attached: Ref[List[Callable[[], None]]] = use_ref([])
|
|
1371
1388
|
|
|
1372
|
-
def _attach_bindings() ->
|
|
1389
|
+
def _attach_bindings() -> None:
|
|
1373
1390
|
tag = ref._pn_tag
|
|
1374
1391
|
if tag is None:
|
|
1375
|
-
return
|
|
1392
|
+
return
|
|
1393
|
+
# Derived nodes can be rebuilt on every render. Install their new
|
|
1394
|
+
# bindings before releasing the old ones so a running native graph
|
|
1395
|
+
# never temporarily loses every owner.
|
|
1376
1396
|
detachers = [value.attach(tag, _animated_prop_name(prop)) for prop, value in bindings.items()]
|
|
1397
|
+
previous = attached.current
|
|
1398
|
+
attached.current = detachers
|
|
1399
|
+
for detach in previous:
|
|
1400
|
+
detach()
|
|
1377
1401
|
|
|
1402
|
+
def _unmount_bindings() -> Callable[[], None]:
|
|
1378
1403
|
def _cleanup() -> None:
|
|
1379
|
-
for
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
except Exception:
|
|
1383
|
-
pass
|
|
1404
|
+
for detach in attached.current:
|
|
1405
|
+
detach()
|
|
1406
|
+
attached.current = []
|
|
1384
1407
|
|
|
1385
1408
|
return _cleanup
|
|
1386
1409
|
|
|
1387
1410
|
# Re-attach whenever the binding set changes identity.
|
|
1388
1411
|
use_effect(_attach_bindings, [tuple(sorted((k, id(v)) for k, v in bindings.items()))])
|
|
1412
|
+
use_effect(_unmount_bindings, [])
|
|
1389
1413
|
|
|
1390
1414
|
if element_type == "Text":
|
|
1391
1415
|
text = children[0] if children else kwargs.pop("text", "")
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Portable animation expressions evaluated by the native UI thread."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def serialize(root: Any) -> dict[str, Any]:
|
|
9
|
+
"""Serialize one connected animation graph in dependency order."""
|
|
10
|
+
from .animated import AnimatedInterpolation, AnimatedNode, AnimatedValue, _AnimatedDiffClamp, _AnimatedOperation
|
|
11
|
+
|
|
12
|
+
connected: dict[int, Any] = {}
|
|
13
|
+
|
|
14
|
+
def discover(node: Any) -> None:
|
|
15
|
+
if not isinstance(node, AnimatedNode) or id(node) in connected:
|
|
16
|
+
return
|
|
17
|
+
connected[id(node)] = node
|
|
18
|
+
for child in list(node._children):
|
|
19
|
+
discover(child)
|
|
20
|
+
for parent in getattr(node, "_parents", [getattr(node, "_parent", None)]):
|
|
21
|
+
discover(parent)
|
|
22
|
+
|
|
23
|
+
discover(root)
|
|
24
|
+
encoded: dict[int, dict[str, Any]] = {}
|
|
25
|
+
|
|
26
|
+
def encode(node: Any) -> Any:
|
|
27
|
+
if not isinstance(node, AnimatedNode):
|
|
28
|
+
return {"constant": float(node)}
|
|
29
|
+
identity = id(node)
|
|
30
|
+
if identity not in encoded:
|
|
31
|
+
definition: dict[str, Any] = {"id": identity}
|
|
32
|
+
if isinstance(node, AnimatedValue):
|
|
33
|
+
definition.update(kind="value", value=node.value)
|
|
34
|
+
elif isinstance(node, AnimatedInterpolation):
|
|
35
|
+
definition.update(
|
|
36
|
+
kind="interpolate",
|
|
37
|
+
inputs=[encode(node._parent)],
|
|
38
|
+
ranges=node._inputs,
|
|
39
|
+
outputs=node._outputs,
|
|
40
|
+
color=node._kind == "color",
|
|
41
|
+
left=node._left,
|
|
42
|
+
right=node._right,
|
|
43
|
+
)
|
|
44
|
+
elif isinstance(node, _AnimatedOperation):
|
|
45
|
+
definition.update(kind=node._op, inputs=[encode(parent) for parent in node._parents])
|
|
46
|
+
elif isinstance(node, _AnimatedDiffClamp):
|
|
47
|
+
definition.update(
|
|
48
|
+
kind="diff_clamp",
|
|
49
|
+
inputs=[encode(node._parent)],
|
|
50
|
+
minimum=node._min,
|
|
51
|
+
maximum=node._max,
|
|
52
|
+
previous=node._last_input,
|
|
53
|
+
value=node.value,
|
|
54
|
+
)
|
|
55
|
+
else:
|
|
56
|
+
raise TypeError(f"Unsupported animated node {type(node).__name__}")
|
|
57
|
+
encoded[identity] = definition
|
|
58
|
+
return {"node": identity}
|
|
59
|
+
|
|
60
|
+
for node in connected.values():
|
|
61
|
+
encode(node)
|
|
62
|
+
bindings = [[tag, prop, id(node)] for node in connected.values() for tag, prop in node.attachments()]
|
|
63
|
+
return {"id": min(connected), "nodes": list(encoded.values()), "bindings": bindings}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def install(node: Any, *, detached_tag: int | None = None) -> dict[str, Any] | None:
|
|
67
|
+
"""Synchronize native graph ownership when a binding is attached or removed."""
|
|
68
|
+
from .animated import _backend
|
|
69
|
+
|
|
70
|
+
backend = _backend()
|
|
71
|
+
handler = getattr(backend, "install_animation_graph", None)
|
|
72
|
+
if handler is None:
|
|
73
|
+
return None
|
|
74
|
+
graph = serialize(node)
|
|
75
|
+
tag = graph["bindings"][0][0] if graph["bindings"] else detached_tag
|
|
76
|
+
if tag is not None:
|
|
77
|
+
handler(tag, graph)
|
|
78
|
+
return graph
|
|
@@ -37,7 +37,7 @@ def start(dev: bool = False, strict: bool = False) -> Dict[str, Any]:
|
|
|
37
37
|
error screen with the full traceback.
|
|
38
38
|
|
|
39
39
|
Returns:
|
|
40
|
-
A status dict (``{"protocol":
|
|
40
|
+
A status dict (``{"protocol": 2, "platform": "ios"}``) that the
|
|
41
41
|
template logs. Unless ``strict`` is set this never raises:
|
|
42
42
|
failures are printed and reported in the dict under
|
|
43
43
|
``"error"``.
|
|
@@ -57,6 +57,12 @@ def start(dev: bool = False, strict: bool = False) -> Dict[str, Any]:
|
|
|
57
57
|
_ios_log.install()
|
|
58
58
|
except Exception:
|
|
59
59
|
pass
|
|
60
|
+
from .runtime import start as start_runtime
|
|
61
|
+
|
|
62
|
+
start_runtime()
|
|
63
|
+
from .sdk.schema import load_bundled_contracts
|
|
64
|
+
|
|
65
|
+
load_bundled_contracts()
|
|
60
66
|
from . import bridge
|
|
61
67
|
|
|
62
68
|
status_["protocol"] = bridge.handshake()
|
|
@@ -65,11 +71,6 @@ def start(dev: bool = False, strict: bool = False) -> Dict[str, Any]:
|
|
|
65
71
|
from . import diagnostics
|
|
66
72
|
|
|
67
73
|
diagnostics.set_dev_mode(True)
|
|
68
|
-
# Create the guest loop now so the first pump request has a
|
|
69
|
-
# loop to drive and effects can schedule work during mount.
|
|
70
|
-
from .runtime import get_loop
|
|
71
|
-
|
|
72
|
-
get_loop()
|
|
73
74
|
# Import the view backend eagerly: on a slow device the first
|
|
74
75
|
# commit shouldn't also pay for importing the reconciler.
|
|
75
76
|
from .native_views import get_registry
|
|
@@ -19,8 +19,7 @@ tests that want to exercise the bridge itself install a
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
import threading
|
|
22
|
-
from
|
|
23
|
-
from typing import Any, Callable, Deque, Dict, Optional, Protocol, Tuple
|
|
22
|
+
from typing import Callable, Optional, Protocol, Tuple
|
|
24
23
|
|
|
25
24
|
from . import codec
|
|
26
25
|
|
|
@@ -31,11 +30,11 @@ __all__ = [
|
|
|
31
30
|
"has_transport",
|
|
32
31
|
"handshake",
|
|
33
32
|
"native_callback",
|
|
34
|
-
"post_to_main",
|
|
35
33
|
"set_transport",
|
|
36
34
|
]
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
from .commits import PROTOCOL_VERSION
|
|
37
|
+
|
|
39
38
|
"""Bridge protocol version this Python package speaks."""
|
|
40
39
|
|
|
41
40
|
|
|
@@ -47,7 +46,7 @@ class Transport(Protocol):
|
|
|
47
46
|
def protocol_version(self) -> int:
|
|
48
47
|
"""Return the protocol version compiled into the native library."""
|
|
49
48
|
|
|
50
|
-
def apply(self, transaction_json: str) ->
|
|
49
|
+
def apply(self, transaction_json: str) -> str:
|
|
51
50
|
"""Apply one serialized transaction (a JSON array of ops)."""
|
|
52
51
|
|
|
53
52
|
def measure(self, tag: int, max_width: float, max_height: float) -> Tuple[float, float]:
|
|
@@ -154,58 +153,29 @@ def handshake() -> int:
|
|
|
154
153
|
f"expects v{PROTOCOL_VERSION}. Re-run 'pn build' so the staged template matches the "
|
|
155
154
|
"installed pythonnative package."
|
|
156
155
|
)
|
|
156
|
+
if getattr(get_transport(), "name", "") in {"ios", "android"}:
|
|
157
|
+
from ..sdk.schema import fingerprint
|
|
158
|
+
|
|
159
|
+
reply = codec.loads(get_transport().call("Runtime", "capabilities", codec.dumps({"id": 0, "args": {}})))
|
|
160
|
+
capabilities = reply.get("value", {}) if isinstance(reply, dict) else {}
|
|
161
|
+
if capabilities.get("schema") != fingerprint() or capabilities.get("yoga") != "3.2.1":
|
|
162
|
+
raise RuntimeError("Native component contracts changed. Rebuild the app with 'pn run'.")
|
|
157
163
|
return version
|
|
158
164
|
|
|
159
165
|
|
|
160
166
|
# ======================================================================
|
|
161
|
-
#
|
|
167
|
+
# native -> Python
|
|
162
168
|
# ======================================================================
|
|
163
|
-
#
|
|
164
|
-
# The asyncio guest loop and ``call_on_main_thread`` need a way to run
|
|
165
|
-
# a callable on the platform main thread's next turn. Native provides
|
|
166
|
-
# it: ``Host.post()`` schedules ``callback("pump")``, which drains this
|
|
167
|
-
# queue. Keeping the queue in Python means one native crossing per
|
|
168
|
-
# batch of callables rather than one per callable.
|
|
169
|
-
|
|
170
|
-
_main_queue: Deque[Callable[[], None]] = deque()
|
|
171
|
-
_main_queue_lock = threading.Lock()
|
|
172
|
-
_pump_requested = False
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def post_to_main(fn: Callable[[], None]) -> None:
|
|
176
|
-
"""Queue ``fn`` for the next main-thread turn (never runs inline)."""
|
|
177
|
-
global _pump_requested
|
|
178
|
-
with _main_queue_lock:
|
|
179
|
-
_main_queue.append(fn)
|
|
180
|
-
if _pump_requested:
|
|
181
|
-
return
|
|
182
|
-
_pump_requested = True
|
|
183
|
-
try:
|
|
184
|
-
get_transport().call("Host", "post", codec.dumps({"call_id": 0, "args": {}}))
|
|
185
|
-
except Exception as exc:
|
|
186
|
-
with _main_queue_lock:
|
|
187
|
-
_pump_requested = False
|
|
188
|
-
print(f"[pn.bridge] Host.post failed; running {len(_main_queue)} queued callable(s) inline: {exc!r}")
|
|
189
|
-
_drain_main_queue()
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
def _drain_main_queue() -> None:
|
|
193
|
-
global _pump_requested
|
|
194
|
-
while True:
|
|
195
|
-
with _main_queue_lock:
|
|
196
|
-
if not _main_queue:
|
|
197
|
-
_pump_requested = False
|
|
198
|
-
return
|
|
199
|
-
fn = _main_queue.popleft()
|
|
200
|
-
try:
|
|
201
|
-
fn()
|
|
202
|
-
except Exception as exc:
|
|
203
|
-
print(f"[pn.bridge] main-thread callable raised: {exc!r}")
|
|
204
169
|
|
|
205
170
|
|
|
206
|
-
#
|
|
207
|
-
|
|
208
|
-
|
|
171
|
+
# Callback threads coalesce continuous input before the application loop drains.
|
|
172
|
+
_continuous: dict[tuple[int, str], list[str]] = {}
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _deliver_continuous(tag: int, name: str, slot: list[str]) -> None:
|
|
176
|
+
if _continuous.get((tag, name)) is slot:
|
|
177
|
+
_continuous.pop((tag, name), None)
|
|
178
|
+
native_callback("event", tag, name, slot[0])
|
|
209
179
|
|
|
210
180
|
|
|
211
181
|
def native_callback(kind: str, tag: int, name: str, payload: str) -> Optional[str]:
|
|
@@ -225,7 +195,31 @@ def native_callback(kind: str, tag: int, name: str, payload: str) -> Optional[st
|
|
|
225
195
|
``diagnostics`` so nothing propagates into UIKit or the
|
|
226
196
|
Android looper.
|
|
227
197
|
"""
|
|
198
|
+
from ..runtime import _on_loop_thread, get_loop
|
|
199
|
+
|
|
200
|
+
loop = get_loop()
|
|
201
|
+
if loop.is_running() and not _on_loop_thread(loop):
|
|
202
|
+
if kind == "event" and name in {"on_scroll", "on_selection_change", "on_gesture_update"}:
|
|
203
|
+
key = (tag, name)
|
|
204
|
+
slot = _continuous.get(key)
|
|
205
|
+
if slot is None:
|
|
206
|
+
slot = [payload]
|
|
207
|
+
_continuous[key] = slot
|
|
208
|
+
loop.call_soon_threadsafe(_deliver_continuous, tag, name, slot)
|
|
209
|
+
else:
|
|
210
|
+
slot[0] = payload
|
|
211
|
+
else:
|
|
212
|
+
_continuous.clear()
|
|
213
|
+
loop.call_soon_threadsafe(native_callback, kind, tag, name, payload)
|
|
214
|
+
return None
|
|
228
215
|
try:
|
|
216
|
+
if kind == "layout":
|
|
217
|
+
from ..native_views import get_registry
|
|
218
|
+
|
|
219
|
+
backend = get_registry()
|
|
220
|
+
if backend.on_layout is not None:
|
|
221
|
+
backend.on_layout(codec.loads(payload))
|
|
222
|
+
return None
|
|
229
223
|
if kind == "event":
|
|
230
224
|
return _on_event(int(tag), name, payload)
|
|
231
225
|
if kind == "module":
|
|
@@ -243,9 +237,6 @@ def native_callback(kind: str, tag: int, name: str, payload: str) -> Optional[st
|
|
|
243
237
|
data = codec.loads(payload) or {}
|
|
244
238
|
native_animation_completed(int(data.get("id", 0)), bool(data.get("finished", True)))
|
|
245
239
|
return None
|
|
246
|
-
if kind == "pump":
|
|
247
|
-
_drain_main_queue()
|
|
248
|
-
return None
|
|
249
240
|
print(f"[pn.bridge] unknown callback kind {kind!r}")
|
|
250
241
|
except Exception as exc:
|
|
251
242
|
from .. import diagnostics
|
|
@@ -261,6 +252,14 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
|
|
|
261
252
|
from ..events import get_event_registry
|
|
262
253
|
|
|
263
254
|
args = codec.loads(payload)
|
|
255
|
+
from ..native_views import get_registry
|
|
256
|
+
|
|
257
|
+
backend = get_registry()
|
|
258
|
+
accept = getattr(backend, "accept_event", None)
|
|
259
|
+
if accept is not None:
|
|
260
|
+
if not accept(tag, name, args):
|
|
261
|
+
return None
|
|
262
|
+
args = args["args"]
|
|
264
263
|
if args is None:
|
|
265
264
|
args = []
|
|
266
265
|
elif not isinstance(args, list):
|
|
@@ -276,7 +275,7 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
|
|
|
276
275
|
return None if result is None else codec.dumps(codec.to_jsonable(result))
|
|
277
276
|
return None
|
|
278
277
|
try:
|
|
279
|
-
result =
|
|
278
|
+
result = get_event_registry().invoke(tag, name, *args)
|
|
280
279
|
except Exception as exc:
|
|
281
280
|
from .. import diagnostics
|
|
282
281
|
|
|
@@ -285,7 +284,9 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
|
|
|
285
284
|
|
|
286
285
|
traceback.print_exc()
|
|
287
286
|
return None
|
|
288
|
-
|
|
287
|
+
import inspect
|
|
288
|
+
|
|
289
|
+
if result is None or inspect.isawaitable(result):
|
|
289
290
|
return None
|
|
290
291
|
try:
|
|
291
292
|
return codec.dumps(codec.to_jsonable(result))
|
|
@@ -294,20 +295,8 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
|
|
|
294
295
|
|
|
295
296
|
|
|
296
297
|
def _reset_for_tests() -> None:
|
|
297
|
-
"""Drop the transport
|
|
298
|
-
global _transport, _explicit
|
|
298
|
+
"""Drop the transport for test isolation."""
|
|
299
|
+
global _transport, _explicit
|
|
299
300
|
with _transport_lock:
|
|
300
301
|
_transport = None
|
|
301
302
|
_explicit = False
|
|
302
|
-
with _main_queue_lock:
|
|
303
|
-
_main_queue.clear()
|
|
304
|
-
_pump_requested = False
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
def transport_state() -> Dict[str, Any]:
|
|
308
|
-
"""Diagnostics snapshot (used by ``pn doctor`` and tests)."""
|
|
309
|
-
return {
|
|
310
|
-
"transport": None if _transport is None else _transport.name,
|
|
311
|
-
"protocol_version": PROTOCOL_VERSION,
|
|
312
|
-
"queued_main_callables": len(_main_queue),
|
|
313
|
-
}
|
|
@@ -39,9 +39,9 @@ class AndroidTransport:
|
|
|
39
39
|
"""Return the protocol version compiled into the native library."""
|
|
40
40
|
return int(self._bridge.protocolVersion())
|
|
41
41
|
|
|
42
|
-
def apply(self, transaction_json: str) ->
|
|
42
|
+
def apply(self, transaction_json: str) -> str:
|
|
43
43
|
"""Apply one serialized transaction (a JSON array of ops)."""
|
|
44
|
-
self._bridge.apply(transaction_json)
|
|
44
|
+
return str(self._bridge.apply(transaction_json))
|
|
45
45
|
|
|
46
46
|
def measure(self, tag: int, max_width: float, max_height: float) -> Tuple[float, float]:
|
|
47
47
|
"""Return the intrinsic ``(width, height)`` of the view ``tag`` under the constraints."""
|
|
@@ -88,6 +88,12 @@ def split_props(props: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
|
|
88
88
|
python: Dict[str, Any] = {}
|
|
89
89
|
for key, value in props.items():
|
|
90
90
|
if callable(value) and not isinstance(value, type):
|
|
91
|
+
from ..animated import AnimatedEvent
|
|
92
|
+
|
|
93
|
+
if isinstance(value, AnimatedEvent):
|
|
94
|
+
wire.setdefault("_pn_animated_events", {})[key] = {
|
|
95
|
+
name: id(node) for name, node in value._bindings.items()
|
|
96
|
+
}
|
|
91
97
|
python[key] = value
|
|
92
98
|
continue
|
|
93
99
|
try:
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Versioned commit validation and surface ownership.
|
|
2
|
+
|
|
3
|
+
A commit is validated in full before it changes a native tree. Revisions are
|
|
4
|
+
strictly consecutive within an application and surface. A failed native mount
|
|
5
|
+
poisons that surface until the host explicitly resets and remounts it.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import copy
|
|
11
|
+
import math
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
PROTOCOL_VERSION = 2
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CommitError(RuntimeError):
|
|
19
|
+
"""A malformed, stale, or failed native transaction."""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class ViewState:
|
|
24
|
+
"""Wire-visible view state used to validate a whole transaction."""
|
|
25
|
+
|
|
26
|
+
type_name: str
|
|
27
|
+
props: dict[str, Any]
|
|
28
|
+
parent: int | None = None
|
|
29
|
+
children: list[int] = field(default_factory=list)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class CommitState:
|
|
34
|
+
"""Committed revision and structural state for one native surface."""
|
|
35
|
+
|
|
36
|
+
application: str = ""
|
|
37
|
+
surface: int = 0
|
|
38
|
+
revision: int = 0
|
|
39
|
+
views: dict[int, ViewState] = field(default_factory=dict)
|
|
40
|
+
|
|
41
|
+
def prepare(self, envelope: Any) -> CommitState:
|
|
42
|
+
"""Validate without mutating this state and return the candidate state."""
|
|
43
|
+
if not isinstance(envelope, dict) or envelope.get("version") != PROTOCOL_VERSION:
|
|
44
|
+
raise CommitError("Expected a protocol v2 commit envelope; rebuild the native client")
|
|
45
|
+
application, surface, revision = (envelope.get(k) for k in ("application", "surface", "revision"))
|
|
46
|
+
if not isinstance(application, str) or not application or type(surface) is not int or surface <= 0:
|
|
47
|
+
raise CommitError("Invalid application or surface identity")
|
|
48
|
+
if self.application and (application, surface) != (self.application, self.surface):
|
|
49
|
+
raise CommitError("Commit belongs to another application or surface")
|
|
50
|
+
if type(revision) is not int or revision != self.revision + 1:
|
|
51
|
+
raise CommitError(f"Expected revision {self.revision + 1}, received {revision!r}")
|
|
52
|
+
ops = envelope.get("ops")
|
|
53
|
+
if not isinstance(ops, list):
|
|
54
|
+
raise CommitError("Commit ops must be a list")
|
|
55
|
+
result = CommitState(application, surface, revision, copy.deepcopy(self.views))
|
|
56
|
+
for index, op in enumerate(ops):
|
|
57
|
+
try:
|
|
58
|
+
result._validate_op(op)
|
|
59
|
+
except (KeyError, TypeError, ValueError, IndexError) as exc:
|
|
60
|
+
raise CommitError(f"Invalid op {index}: {exc}") from exc
|
|
61
|
+
return result
|
|
62
|
+
|
|
63
|
+
def _validate_op(self, op: Any) -> None:
|
|
64
|
+
if not isinstance(op, list) or len(op) < 2:
|
|
65
|
+
raise ValueError("Expected an operation array")
|
|
66
|
+
code, tag = op[:2]
|
|
67
|
+
lengths = {"c": 4, "u": 3, "i": 4, "d": 2, "f": 6}
|
|
68
|
+
if code not in lengths or len(op) != lengths[code] or type(tag) is not int or tag <= 0:
|
|
69
|
+
raise ValueError("Invalid opcode, arity, or tag")
|
|
70
|
+
if code == "c":
|
|
71
|
+
if tag in self.views or not isinstance(op[2], str) or not op[2] or not isinstance(op[3], dict):
|
|
72
|
+
raise ValueError("Invalid or duplicate create")
|
|
73
|
+
self.views[tag] = ViewState(op[2], dict(op[3]))
|
|
74
|
+
return
|
|
75
|
+
view = self.views[tag]
|
|
76
|
+
if code == "u":
|
|
77
|
+
if not isinstance(op[2], dict):
|
|
78
|
+
raise ValueError("Update requires a property mapping")
|
|
79
|
+
for name, value in op[2].items():
|
|
80
|
+
if value is None:
|
|
81
|
+
view.props.pop(name, None)
|
|
82
|
+
else:
|
|
83
|
+
view.props[name] = value
|
|
84
|
+
elif code == "i":
|
|
85
|
+
child_tag, index = op[2:]
|
|
86
|
+
if type(child_tag) is not int or type(index) is not int or index < 0:
|
|
87
|
+
raise ValueError("Invalid child or insertion index")
|
|
88
|
+
child = self.views[child_tag]
|
|
89
|
+
ancestor: int | None = tag
|
|
90
|
+
while ancestor is not None:
|
|
91
|
+
if ancestor == child_tag:
|
|
92
|
+
raise ValueError("Insertion creates a cycle")
|
|
93
|
+
ancestor = self.views[ancestor].parent
|
|
94
|
+
if child.parent is not None:
|
|
95
|
+
self.views[child.parent].children.remove(child_tag)
|
|
96
|
+
if index > len(view.children):
|
|
97
|
+
raise ValueError("Insertion index exceeds child count")
|
|
98
|
+
view.children.insert(index, child_tag)
|
|
99
|
+
child.parent = tag
|
|
100
|
+
elif code == "d":
|
|
101
|
+
if view.children:
|
|
102
|
+
raise ValueError("Destroy children before their parent")
|
|
103
|
+
if view.parent is not None:
|
|
104
|
+
self.views[view.parent].children.remove(tag)
|
|
105
|
+
del self.views[tag]
|
|
106
|
+
elif code == "f":
|
|
107
|
+
if any(type(n) not in (float, int) or not math.isfinite(n) for n in op[2:]):
|
|
108
|
+
raise ValueError("Frame values must be finite numbers")
|
|
109
|
+
if op[4] < 0 or op[5] < 0:
|
|
110
|
+
raise ValueError("Frame sizes must be nonnegative")
|
|
111
|
+
|
|
112
|
+
def acknowledgement(self) -> dict[str, Any]:
|
|
113
|
+
"""Identify the exact revision native successfully mounted."""
|
|
114
|
+
return {"ok": True, "application": self.application, "surface": self.surface, "revision": self.revision}
|