pythonnative 0.39.0__tar.gz → 0.41.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.41.0/.github/workflows/release.yml +115 -0
- pythonnative-0.41.0/MANIFEST.in +13 -0
- pythonnative-0.41.0/PKG-INFO +141 -0
- pythonnative-0.41.0/README.md +94 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/pyproject.toml +13 -5
- pythonnative-0.41.0/scripts/check-distributions.py +121 -0
- pythonnative-0.41.0/scripts/cibuildwheel.toml +27 -0
- pythonnative-0.41.0/scripts/release-assets.py +43 -0
- pythonnative-0.41.0/setup.py +23 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/__init__.py +12 -11
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/animated.py +57 -36
- pythonnative-0.41.0/src/pythonnative/animation_graph.py +78 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bootstrap.py +7 -6
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bridge/__init__.py +58 -69
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bridge/android.py +2 -2
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bridge/codec.py +6 -0
- pythonnative-0.41.0/src/pythonnative/bridge/commits.py +114 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bridge/fake.py +20 -13
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bridge/ios.py +8 -8
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/bridge/web.py +35 -76
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/cli/pn.py +68 -12
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/component.py +17 -1
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/__init__.py +6 -1
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/_base.py +3 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/controls.py +9 -6
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/lists.py +128 -151
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/text.py +3 -3
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devclient.py +7 -8
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/server.py +10 -4
- pythonnative-0.41.0/src/pythonnative/devserver/static/animation_graph.js +82 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/bridge.js +0 -8
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/host.js +4 -29
- pythonnative-0.41.0/src/pythonnative/devserver/static/layout.js +85 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/renderer.js +128 -171
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/shell.js +4 -2
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/LICENSE +21 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/index.js +16 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/index.js.map +1 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/load.js +17 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/load.js.map +1 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
- pythonnative-0.41.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
- pythonnative-0.41.0/src/pythonnative/equality.py +19 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/events.py +21 -8
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/gestures.py +27 -5
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/hooks.py +75 -53
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/hosts/__init__.py +10 -9
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/hosts/base.py +13 -73
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/hosts/native.py +21 -57
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/hot_reload.py +33 -19
- pythonnative-0.41.0/src/pythonnative/layout.py +328 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.41.0/src/pythonnative/native/android}/build.gradle +4 -0
- pythonnative-0.41.0/src/pythonnative/native/android/gradle.properties +3 -0
- pythonnative-0.41.0/src/pythonnative/native/android/settings.gradle +12 -0
- pythonnative-0.41.0/src/pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
- pythonnative-0.41.0/src/pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
- pythonnative-0.41.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
- pythonnative-0.41.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
- pythonnative-0.41.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.41.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/PNBridge.kt +61 -14
- pythonnative-0.41.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.41.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +11 -3
- pythonnative-0.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +0 -1
- pythonnative-0.41.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.41.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +6 -1
- pythonnative-0.41.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
- pythonnative-0.41.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
- pythonnative-0.41.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.41.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.41.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.41.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.41.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.41.0/src/pythonnative/native/ios}/Package.swift +2 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Animation/PNAnimator.swift +11 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNBridge.swift +81 -17
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNRegistry.swift +2 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNTransaction.swift +5 -4
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNButtonManagers.swift +3 -2
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNControlManagers.swift +7 -7
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNImageManager.swift +1 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNPressableManager.swift +2 -2
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTextInputManager.swift +9 -1
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/PNNativeModule.swift +44 -1
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Screens/PNViewController.swift +4 -2
- pythonnative-0.41.0/src/pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
- pythonnative-0.41.0/src/pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNManagerTests.swift +8 -6
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNModuleTests.swift +13 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/LICENSE +21 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/Package.swift +9 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/VENDORED.md +2 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/PNStyle.h +10 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/module.modulemap +5 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/python.cpp +16 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/style.cpp +272 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGConfig.h +158 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGEnums.h +142 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGMacros.h +99 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGNode.h +304 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/YGValue.h +84 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/Yoga.h +21 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/config/Config.h +92 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/debug/Log.h +34 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Align.h +47 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Display.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/event/event.cpp +87 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/event/event.h +130 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/module.modulemap +21 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/node/Node.h +337 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/style/Style.h +757 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
- pythonnative-0.41.0/src/pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/registry.py +14 -1
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_views/base.py +3 -3
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_views/bridge_backend.py +94 -82
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/handle.py +3 -36
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/navigators.py +28 -6
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/preview.py +12 -27
- pythonnative-0.41.0/src/pythonnative/profiling.py +101 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/android.py +7 -2
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/builder.py +87 -3
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/config.py +2 -2
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/deps.py +20 -4
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/doctor.py +4 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/fingerprint.py +1 -0
- pythonnative-0.41.0/src/pythonnative/project/lockfile.py +100 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/plugins.py +155 -2
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/runtime_assets.py +25 -8
- pythonnative-0.41.0/src/pythonnative/query.py +153 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/reconciler/boundaries.py +10 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/reconciler/core.py +106 -93
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/reconciler/layout_pass.py +42 -7
- pythonnative-0.41.0/src/pythonnative/refresh.py +55 -0
- pythonnative-0.41.0/src/pythonnative/runtime.py +306 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/sdk/__init__.py +7 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/sdk/_components.py +19 -0
- pythonnative-0.41.0/src/pythonnative/sdk/builtins.py +91 -0
- pythonnative-0.41.0/src/pythonnative/sdk/codegen.py +149 -0
- pythonnative-0.41.0/src/pythonnative/sdk/module_codegen.py +184 -0
- pythonnative-0.41.0/src/pythonnative/sdk/schema.py +224 -0
- pythonnative-0.41.0/src/pythonnative/sdk/templates/contracts.kt +46 -0
- pythonnative-0.41.0/src/pythonnative/sdk/templates/contracts.swift +46 -0
- pythonnative-0.41.0/src/pythonnative/suspense.py +183 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/testing/backend.py +4 -5
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/testing/harness.py +7 -29
- pythonnative-0.41.0/src/pythonnative.egg-info/PKG-INFO +141 -0
- pythonnative-0.41.0/src/pythonnative.egg-info/SOURCES.txt +474 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_bridge.py +44 -54
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_cli.py +108 -0
- pythonnative-0.41.0/tests/test_codegen.py +26 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_components.py +2 -2
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_hot_reload.py +45 -0
- pythonnative-0.41.0/tests/test_inbox.py +85 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_layout.py +29 -23
- pythonnative-0.41.0/tests/test_native_lists.py +86 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_navigation.py +19 -31
- pythonnative-0.41.0/tests/test_release_packaging.py +160 -0
- pythonnative-0.41.0/tests/test_release_workflow.py +108 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_runtime.py +5 -5
- pythonnative-0.41.0/tests/test_runtime_contracts.py +297 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_suspense.py +8 -106
- pythonnative-0.41.0/tests/test_utils.py +177 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_web_transport.py +40 -9
- pythonnative-0.39.0/PKG-INFO +0 -150
- pythonnative-0.39.0/README.md +0 -103
- 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/PKG-INFO +0 -150
- 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/tests/test_utils.py +0 -73
- {pythonnative-0.39.0 → pythonnative-0.41.0}/LICENSE +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/setup.cfg +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/_ios_log.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/alerts.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/appearance.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/cli/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/layout.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/media.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/overlays.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/pressable.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/components/structural.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/colors.js +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/index.html +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/static/preview.css +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/watcher.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/devserver/ws.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/diagnostics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/element.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/mutations.py +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.41.0/src/pythonnative/native/android}/src/main/AndroidManifest.xml +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.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.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNColor.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNComponentManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNContainerView.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTabBarManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTextManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTransform.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewState.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewStyler.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNWebViewManager.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/AlertModule.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/LifecycleModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/MediaModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/PermissionModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/SystemModules.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNCompat.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNJSON.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNLog.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNWindow.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNColorTests.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNGestureTests.swift +0 -0
- {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.41.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNTransactionTests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/app_state.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/battery.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/biometrics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/camera.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/clipboard.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/fallback.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/file_system.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/haptics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/linking.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/location.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/net_info.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/notifications.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/permissions.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/secure_store.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_modules/share.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/native_views/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/container.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/host.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/linking.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/screen.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/navigation/state.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/net.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/platform.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/platform_metrics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/devices.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/icons.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/ios.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/project/permissions.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/py.typed +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/reconciler/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/reconciler/children.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/reconciler/vnode.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/scheduler.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/storage.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/style.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/build.gradle +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.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.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/build.gradle +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/gradlew +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/testing/__init__.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative/utils.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative.egg-info/requires.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/src/pythonnative.egg-info/top_level.txt +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_alert.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_animated.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_animated_graph.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_appearance.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_async_hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_core_semantics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_devclient.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_devserver.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_devserver_ws.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_element.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_events.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_extended_components.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_gesture_composition.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_gestures.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_hosts.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_incremental_render.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_interaction_props.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_ios_log.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_metric_hooks.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_mutations.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_native_modules.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_native_views.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_net.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_new_components.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_platform.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_platform_metrics.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_reconciler.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_ref.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_sdk.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_smoke.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_storage.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_style.py +0 -0
- {pythonnative-0.39.0 → pythonnative-0.41.0}/tests/test_transitions.py +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
tag:
|
|
9
|
+
description: Existing release tag to recover (leave empty for a new release)
|
|
10
|
+
type: string
|
|
11
|
+
required: false
|
|
12
|
+
|
|
13
|
+
# Serialize the entire release, including manual recoveries and uploads.
|
|
14
|
+
concurrency:
|
|
15
|
+
group: release
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
release:
|
|
23
|
+
if: github.repository == 'pythonnative/pythonnative' && github.ref == 'refs/heads/main'
|
|
24
|
+
name: Select release
|
|
25
|
+
runs-on: ubuntu-24.04
|
|
26
|
+
permissions:
|
|
27
|
+
contents: write
|
|
28
|
+
outputs:
|
|
29
|
+
# PSR writes its own `tag` output even when released=false. Forward
|
|
30
|
+
# only outputs we explicitly set after selecting a source commit.
|
|
31
|
+
tag: ${{ steps.select.outputs.release_tag }}
|
|
32
|
+
commit: ${{ steps.select.outputs.release_commit }}
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
with:
|
|
36
|
+
fetch-depth: 0
|
|
37
|
+
- uses: astral-sh/setup-uv@v10.0.1
|
|
38
|
+
with:
|
|
39
|
+
python-version: '3.13'
|
|
40
|
+
- name: Create a version or select an existing release
|
|
41
|
+
id: select
|
|
42
|
+
env:
|
|
43
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
44
|
+
RECOVERY_TAG: ${{ inputs.tag }}
|
|
45
|
+
run: |
|
|
46
|
+
if [ -n "$RECOVERY_TAG" ]; then
|
|
47
|
+
# Only published release tags from main can be recovered.
|
|
48
|
+
[[ "$RECOVERY_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]
|
|
49
|
+
commit=$(git rev-parse --verify "refs/tags/$RECOVERY_TAG^{commit}")
|
|
50
|
+
git merge-base --is-ancestor "$commit" origin/main
|
|
51
|
+
gh release view "$RECOVERY_TAG" --json isDraft --jq '.isDraft' | grep -qx false
|
|
52
|
+
tag="$RECOVERY_TAG"
|
|
53
|
+
else
|
|
54
|
+
git config user.name "github-actions"
|
|
55
|
+
git config user.email "actions@github.com"
|
|
56
|
+
# GitPython 3.1.60 removed Actor.name_email_regex, which PSR
|
|
57
|
+
# 9.21.2 still uses. Keep this constraint until PSR is upgraded.
|
|
58
|
+
uv tool install "python-semantic-release==9.21.2" --with "gitpython<3.1.60"
|
|
59
|
+
tags_before=$(git tag | wc -l)
|
|
60
|
+
semantic-release -v version
|
|
61
|
+
tags_after=$(git tag | wc -l)
|
|
62
|
+
if [ "$tags_after" -eq "$tags_before" ]; then
|
|
63
|
+
echo "No new release. To resume an upload, run this workflow with its existing tag."
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
tag=$(git describe --tags --exact-match HEAD)
|
|
67
|
+
commit=$(git rev-parse HEAD)
|
|
68
|
+
fi
|
|
69
|
+
# Check the tag against package metadata without importing/building it.
|
|
70
|
+
git show "$commit:pyproject.toml" > "$RUNNER_TEMP/release-project.toml"
|
|
71
|
+
RELEASE_TAG="$tag" python -c 'import os, pathlib, tomllib; data = tomllib.loads((pathlib.Path(os.environ["RUNNER_TEMP"]) / "release-project.toml").read_text()); assert os.environ["RELEASE_TAG"] == "v" + data["project"]["version"]'
|
|
72
|
+
echo "release_tag=$tag" >> "$GITHUB_OUTPUT"
|
|
73
|
+
echo "release_commit=$commit" >> "$GITHUB_OUTPUT"
|
|
74
|
+
|
|
75
|
+
distributions:
|
|
76
|
+
name: Build release distributions
|
|
77
|
+
needs: release
|
|
78
|
+
if: needs.release.outputs.tag != '' && needs.release.outputs.commit != ''
|
|
79
|
+
uses: ./.github/workflows/wheels.yml
|
|
80
|
+
with:
|
|
81
|
+
source-ref: ${{ needs.release.outputs.commit }}
|
|
82
|
+
|
|
83
|
+
publish:
|
|
84
|
+
name: Publish distributions
|
|
85
|
+
needs: [release, distributions]
|
|
86
|
+
runs-on: ubuntu-24.04
|
|
87
|
+
permissions:
|
|
88
|
+
contents: write
|
|
89
|
+
id-token: write
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v4
|
|
92
|
+
with:
|
|
93
|
+
persist-credentials: false
|
|
94
|
+
- uses: actions/download-artifact@v4
|
|
95
|
+
with:
|
|
96
|
+
name: release-distributions
|
|
97
|
+
path: dist
|
|
98
|
+
- uses: astral-sh/setup-uv@v10.0.1
|
|
99
|
+
with:
|
|
100
|
+
python-version: '3.13'
|
|
101
|
+
- name: Preserve release assets for resumable publishing
|
|
102
|
+
env:
|
|
103
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
104
|
+
RELEASE_TAG: ${{ needs.release.outputs.tag }}
|
|
105
|
+
run: uv run --no-project python scripts/release-assets.py "$RELEASE_TAG" dist
|
|
106
|
+
- name: Validate the exact files to publish
|
|
107
|
+
env:
|
|
108
|
+
RELEASE_TAG: ${{ needs.release.outputs.tag }}
|
|
109
|
+
run: |
|
|
110
|
+
uv run --no-project --with packaging python scripts/check-distributions.py dist --version "${RELEASE_TAG#v}"
|
|
111
|
+
uvx twine check --strict dist/*
|
|
112
|
+
- name: Publish to PyPI
|
|
113
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
114
|
+
with:
|
|
115
|
+
skip-existing: true
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
global-exclude *.pyc *.pyo .DS_Store
|
|
2
|
+
include scripts/cibuildwheel.toml scripts/check-distributions.py scripts/release-assets.py
|
|
3
|
+
include .github/workflows/release.yml
|
|
4
|
+
recursive-exclude src/pythonnative/native .build/* .gradle/* .cxx/* build/* .swiftpm/* .kotlin/*
|
|
5
|
+
prune src/pythonnative/native/android/build
|
|
6
|
+
prune src/pythonnative/native/android/.gradle
|
|
7
|
+
prune src/pythonnative/native/android/.cxx
|
|
8
|
+
prune src/pythonnative/native/ios/.build
|
|
9
|
+
prune src/pythonnative/native/ios/.swiftpm
|
|
10
|
+
prune src/pythonnative/native/yoga/.build
|
|
11
|
+
prune src/pythonnative/templates/android_template/app/build
|
|
12
|
+
prune src/pythonnative/templates/android_template/.gradle
|
|
13
|
+
prune src/pythonnative/templates/ios_template/build
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pythonnative
|
|
3
|
+
Version: 0.41.0
|
|
4
|
+
Summary: Cross-platform native UI toolkit for Android and iOS
|
|
5
|
+
Author: Owen Carey
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Owen Carey
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in
|
|
18
|
+
all copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
26
|
+
THE SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/pythonnative/pythonnative
|
|
29
|
+
Project-URL: Repository, https://github.com/pythonnative/pythonnative
|
|
30
|
+
Project-URL: Issues, https://github.com/pythonnative/pythonnative/issues
|
|
31
|
+
Project-URL: Documentation, https://pythonnative.com/
|
|
32
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
33
|
+
Classifier: Intended Audience :: Developers
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Programming Language :: Python :: 3
|
|
36
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
39
|
+
Classifier: Topic :: Software Development :: User Interfaces
|
|
40
|
+
Requires-Python: >=3.13
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
License-File: LICENSE
|
|
43
|
+
Requires-Dist: requests>=2.31.0
|
|
44
|
+
Provides-Extra: build
|
|
45
|
+
Requires-Dist: Pillow>=10.0; extra == "build"
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
|
|
48
|
+
<p align="center">
|
|
49
|
+
<img src="docs/assets/banner.jpg" alt="PythonNative" width="800" />
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
<p align="center">
|
|
53
|
+
<em>Build native Android and iOS apps in Python.</em>
|
|
54
|
+
</p>
|
|
55
|
+
|
|
56
|
+
<p align="center">
|
|
57
|
+
<a href="https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml"><img src="https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
58
|
+
<a href="https://github.com/pythonnative/pythonnative/actions/workflows/release.yml"><img src="https://github.com/pythonnative/pythonnative/actions/workflows/release.yml/badge.svg" alt="Release" /></a>
|
|
59
|
+
<a href="https://pypi.org/project/pythonnative/"><img src="https://img.shields.io/pypi/v/pythonnative" alt="PyPI Version" /></a>
|
|
60
|
+
<a href="https://pypi.org/project/pythonnative/"><img src="https://img.shields.io/pypi/pyversions/pythonnative" alt="Python Versions" /></a>
|
|
61
|
+
<a href="LICENSE"><img src="https://img.shields.io/pypi/l/pythonnative" alt="License: MIT" /></a>
|
|
62
|
+
<a href="https://pythonnative.com/"><img src="https://img.shields.io/website?url=https%3A%2F%2Fpythonnative.com&label=docs" alt="Docs" /></a>
|
|
63
|
+
</p>
|
|
64
|
+
|
|
65
|
+
<p align="center">
|
|
66
|
+
<a href="https://pythonnative.com/">Documentation</a> ·
|
|
67
|
+
<a href="https://pythonnative.com/getting-started/">Getting Started</a> ·
|
|
68
|
+
<a href="https://pythonnative.com/examples/">Examples</a> ·
|
|
69
|
+
<a href="CONTRIBUTING.md">Contributing</a>
|
|
70
|
+
</p>
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Overview
|
|
75
|
+
|
|
76
|
+
PythonNative is a cross-platform toolkit for building native Android and iOS apps in Python. It provides a **declarative, React-like component model** with hooks and automatic reconciliation on top of a **native rendering core** written in Swift and Kotlin. Write function components with `use_state`, `use_effect`, and friends, just like React, and let PythonNative handle creating and updating native views.
|
|
77
|
+
|
|
78
|
+
## Features
|
|
79
|
+
|
|
80
|
+
- **Declarative components and hooks:** Describe native UI with Python functions, immutable elements, and typed styles. State, effects, context, and suspense boundaries follow one logical application tree across screens, overlays, and mounted list rows.
|
|
81
|
+
- **Native widgets and layout:** Swift and Kotlin component managers own UIKit and Android widgets. The shared Yoga C++ engine computes layout beside the controls, using platform measurements for text and intrinsic sizes.
|
|
82
|
+
- **Standard asyncio:** Components, effects, event handlers, and tasks run on a dedicated Python application thread. Native UI threads handle widgets, scrolling, and animation frames. Component-owned tasks are canceled on unmount.
|
|
83
|
+
- **Incremental reconciliation:** State changes update affected component subtrees. Versioned bridge commits validate operations and acknowledge revisions; events and controlled text inputs carry identities that prevent stale updates.
|
|
84
|
+
- **Native lists and navigation:** UIKit collection views and Android recycler views recycle cells for fixed or variable row sizes, grids, sections, and horizontal lists. Native navigation containers present logical screen roots while providers and component state remain in the shared Python tree.
|
|
85
|
+
- **Animation and gestures:** Serialized animation graphs support timing, springs, decay, arithmetic, interpolation, and native scroll and gesture bindings. Swift and Kotlin recognize mobile gestures and update supported animation bindings without Python work on every frame.
|
|
86
|
+
- **Device APIs:** Python facades expose camera, location, notifications, storage, permissions, and other native services. Test permissions and platform behavior on your deployment targets.
|
|
87
|
+
- **Native extension SDK:** Python dataclasses and protocols define contracts; `pn codegen` generates props and module adapters for Swift and Kotlin. Plugins package native sources and resources, and builds verify matching contracts at startup.
|
|
88
|
+
- **Development tools:** `pn start` serves the browser preview and connected mobile dev clients. Fast Refresh preserves compatible component state, while diagnostics report errors and invalid hook usage. Changes to native inputs trigger a rebuild.
|
|
89
|
+
- **Browser preview:** `pn preview` runs your Python application against a browser renderer with DOM widgets, Yoga WebAssembly layout, and JavaScript animation graphs. It supports iteration on application logic and UI; fonts, platform controls, and device APIs require mobile testing.
|
|
90
|
+
- **App packaging and dependency locks:** `pn run` and `pn build` stage bundled app templates, native libraries, and Python sources. Target-specific wheel locks record dependency versions and hashes for mobile builds. Binary dependencies need compatible mobile wheels; `pn deps` reports target resolution.
|
|
91
|
+
|
|
92
|
+
## Quick Start
|
|
93
|
+
|
|
94
|
+
### Installation
|
|
95
|
+
|
|
96
|
+
Requires Python 3.13 or newer.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pip install pythonnative
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Usage
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
import pythonnative as pn
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@pn.component
|
|
109
|
+
def App():
|
|
110
|
+
count, set_count = pn.use_state(0)
|
|
111
|
+
return pn.Column(
|
|
112
|
+
pn.Text(f"Count: {count}", style=pn.style(font_size=24, bold=True)),
|
|
113
|
+
pn.Button(
|
|
114
|
+
"Tap me",
|
|
115
|
+
on_press=lambda: set_count(count + 1),
|
|
116
|
+
),
|
|
117
|
+
style=pn.style(spacing=12, padding=16),
|
|
118
|
+
)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Develop
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
pn init my-app && cd my-app
|
|
125
|
+
pn preview # dev server + browser preview with Fast Refresh
|
|
126
|
+
pn run ios # in another terminal: debug build that connects to the same server
|
|
127
|
+
pn run android
|
|
128
|
+
pn build ios # standalone release artifacts
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Documentation
|
|
132
|
+
|
|
133
|
+
Visit [pythonnative.com](https://pythonnative.com/) for the full documentation, including getting started guides, platform-specific instructions for Android and iOS, API reference, and working examples.
|
|
134
|
+
|
|
135
|
+
## Contributing
|
|
136
|
+
|
|
137
|
+
Contributions are welcome. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, coding standards, and guidelines for submitting pull requests.
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/banner.jpg" alt="PythonNative" width="800" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<em>Build native Android and iOS apps in Python.</em>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml"><img src="https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
11
|
+
<a href="https://github.com/pythonnative/pythonnative/actions/workflows/release.yml"><img src="https://github.com/pythonnative/pythonnative/actions/workflows/release.yml/badge.svg" alt="Release" /></a>
|
|
12
|
+
<a href="https://pypi.org/project/pythonnative/"><img src="https://img.shields.io/pypi/v/pythonnative" alt="PyPI Version" /></a>
|
|
13
|
+
<a href="https://pypi.org/project/pythonnative/"><img src="https://img.shields.io/pypi/pyversions/pythonnative" alt="Python Versions" /></a>
|
|
14
|
+
<a href="LICENSE"><img src="https://img.shields.io/pypi/l/pythonnative" alt="License: MIT" /></a>
|
|
15
|
+
<a href="https://pythonnative.com/"><img src="https://img.shields.io/website?url=https%3A%2F%2Fpythonnative.com&label=docs" alt="Docs" /></a>
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
<a href="https://pythonnative.com/">Documentation</a> ·
|
|
20
|
+
<a href="https://pythonnative.com/getting-started/">Getting Started</a> ·
|
|
21
|
+
<a href="https://pythonnative.com/examples/">Examples</a> ·
|
|
22
|
+
<a href="CONTRIBUTING.md">Contributing</a>
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Overview
|
|
28
|
+
|
|
29
|
+
PythonNative is a cross-platform toolkit for building native Android and iOS apps in Python. It provides a **declarative, React-like component model** with hooks and automatic reconciliation on top of a **native rendering core** written in Swift and Kotlin. Write function components with `use_state`, `use_effect`, and friends, just like React, and let PythonNative handle creating and updating native views.
|
|
30
|
+
|
|
31
|
+
## Features
|
|
32
|
+
|
|
33
|
+
- **Declarative components and hooks:** Describe native UI with Python functions, immutable elements, and typed styles. State, effects, context, and suspense boundaries follow one logical application tree across screens, overlays, and mounted list rows.
|
|
34
|
+
- **Native widgets and layout:** Swift and Kotlin component managers own UIKit and Android widgets. The shared Yoga C++ engine computes layout beside the controls, using platform measurements for text and intrinsic sizes.
|
|
35
|
+
- **Standard asyncio:** Components, effects, event handlers, and tasks run on a dedicated Python application thread. Native UI threads handle widgets, scrolling, and animation frames. Component-owned tasks are canceled on unmount.
|
|
36
|
+
- **Incremental reconciliation:** State changes update affected component subtrees. Versioned bridge commits validate operations and acknowledge revisions; events and controlled text inputs carry identities that prevent stale updates.
|
|
37
|
+
- **Native lists and navigation:** UIKit collection views and Android recycler views recycle cells for fixed or variable row sizes, grids, sections, and horizontal lists. Native navigation containers present logical screen roots while providers and component state remain in the shared Python tree.
|
|
38
|
+
- **Animation and gestures:** Serialized animation graphs support timing, springs, decay, arithmetic, interpolation, and native scroll and gesture bindings. Swift and Kotlin recognize mobile gestures and update supported animation bindings without Python work on every frame.
|
|
39
|
+
- **Device APIs:** Python facades expose camera, location, notifications, storage, permissions, and other native services. Test permissions and platform behavior on your deployment targets.
|
|
40
|
+
- **Native extension SDK:** Python dataclasses and protocols define contracts; `pn codegen` generates props and module adapters for Swift and Kotlin. Plugins package native sources and resources, and builds verify matching contracts at startup.
|
|
41
|
+
- **Development tools:** `pn start` serves the browser preview and connected mobile dev clients. Fast Refresh preserves compatible component state, while diagnostics report errors and invalid hook usage. Changes to native inputs trigger a rebuild.
|
|
42
|
+
- **Browser preview:** `pn preview` runs your Python application against a browser renderer with DOM widgets, Yoga WebAssembly layout, and JavaScript animation graphs. It supports iteration on application logic and UI; fonts, platform controls, and device APIs require mobile testing.
|
|
43
|
+
- **App packaging and dependency locks:** `pn run` and `pn build` stage bundled app templates, native libraries, and Python sources. Target-specific wheel locks record dependency versions and hashes for mobile builds. Binary dependencies need compatible mobile wheels; `pn deps` reports target resolution.
|
|
44
|
+
|
|
45
|
+
## Quick Start
|
|
46
|
+
|
|
47
|
+
### Installation
|
|
48
|
+
|
|
49
|
+
Requires Python 3.13 or newer.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pip install pythonnative
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Usage
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
import pythonnative as pn
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@pn.component
|
|
62
|
+
def App():
|
|
63
|
+
count, set_count = pn.use_state(0)
|
|
64
|
+
return pn.Column(
|
|
65
|
+
pn.Text(f"Count: {count}", style=pn.style(font_size=24, bold=True)),
|
|
66
|
+
pn.Button(
|
|
67
|
+
"Tap me",
|
|
68
|
+
on_press=lambda: set_count(count + 1),
|
|
69
|
+
),
|
|
70
|
+
style=pn.style(spacing=12, padding=16),
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Develop
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pn init my-app && cd my-app
|
|
78
|
+
pn preview # dev server + browser preview with Fast Refresh
|
|
79
|
+
pn run ios # in another terminal: debug build that connects to the same server
|
|
80
|
+
pn run android
|
|
81
|
+
pn build ios # standalone release artifacts
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Documentation
|
|
85
|
+
|
|
86
|
+
Visit [pythonnative.com](https://pythonnative.com/) for the full documentation, including getting started guides, platform-specific instructions for Android and iOS, API reference, and working examples.
|
|
87
|
+
|
|
88
|
+
## Contributing
|
|
89
|
+
|
|
90
|
+
Contributions are welcome. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, coding standards, and guidelines for submitting pull requests.
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
[MIT](LICENSE)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pythonnative"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.41.0"
|
|
8
8
|
description = "Cross-platform native UI toolkit for Android and iOS"
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "Owen Carey" }
|
|
@@ -44,6 +44,7 @@ dev = [
|
|
|
44
44
|
"mypy>=1.10",
|
|
45
45
|
"pytest>=8.0",
|
|
46
46
|
"pytest-asyncio>=0.23",
|
|
47
|
+
"PyYAML>=6.0",
|
|
47
48
|
"Pillow>=10.0",
|
|
48
49
|
# `pn deps` and `pn run ios` shell out to `sys.executable -m pip` to
|
|
49
50
|
# resolve and vendor the app's [requirements].packages for the device
|
|
@@ -93,8 +94,15 @@ license-files = ["LICENSE*"]
|
|
|
93
94
|
[tool.setuptools.package-data]
|
|
94
95
|
pythonnative = [
|
|
95
96
|
"py.typed",
|
|
96
|
-
"templates/**",
|
|
97
|
-
"devserver/static
|
|
97
|
+
"templates/**", "native/**", "sdk/templates/**",
|
|
98
|
+
"devserver/static/**",
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
[tool.setuptools.exclude-package-data]
|
|
102
|
+
pythonnative = [
|
|
103
|
+
"**/build/**", "**/.build/**", "**/.gradle/**",
|
|
104
|
+
"**/.cxx/**", "**/.swiftpm/**", "**/.kotlin/**",
|
|
105
|
+
"**/__pycache__/**", "**/.DS_Store",
|
|
98
106
|
]
|
|
99
107
|
|
|
100
108
|
[tool.ruff]
|
|
@@ -146,11 +154,11 @@ target-version = ['py313']
|
|
|
146
154
|
# PSR stamps the new version into pyproject.toml before running this, so
|
|
147
155
|
# `--upgrade-package` re-syncs only this project's own version in the lock
|
|
148
156
|
# (never dependency upgrades), and the staged uv.lock lands in the release
|
|
149
|
-
# commit.
|
|
157
|
+
# commit. The release workflow builds distributions from that tagged commit
|
|
158
|
+
# using the same cibuildwheel matrix as PR CI.
|
|
150
159
|
build_command = """
|
|
151
160
|
uv lock --upgrade-package pythonnative
|
|
152
161
|
git add uv.lock
|
|
153
|
-
uv build
|
|
154
162
|
"""
|
|
155
163
|
version_toml = ["pyproject.toml:project.version"]
|
|
156
164
|
version_variables = ["src/pythonnative/__init__.py:__version__"]
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Reject incomplete or incorrectly tagged release artifacts before publishing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import re
|
|
7
|
+
import tarfile
|
|
8
|
+
import tomllib
|
|
9
|
+
import zipfile
|
|
10
|
+
from email.parser import BytesParser
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from packaging.tags import parse_tag
|
|
14
|
+
from packaging.utils import canonicalize_name, parse_sdist_filename, parse_wheel_filename
|
|
15
|
+
from packaging.version import Version
|
|
16
|
+
|
|
17
|
+
PYTHONS = {"cp313", "cp314"}
|
|
18
|
+
PLATFORMS = {"linux_x86_64", "linux_aarch64", "macos_x86_64", "macos_arm64", "win_amd64"}
|
|
19
|
+
PACKAGE_FILES = {
|
|
20
|
+
"pythonnative/py.typed",
|
|
21
|
+
"pythonnative/native/yoga/python.cpp",
|
|
22
|
+
"pythonnative/native/yoga/yoga/Yoga.h",
|
|
23
|
+
"pythonnative/native/yoga/yoga/YGNode.cpp",
|
|
24
|
+
"pythonnative/native/ios/Package.swift",
|
|
25
|
+
"pythonnative/templates/android_template/gradlew",
|
|
26
|
+
"pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js",
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def platform_family(platform: str) -> str:
|
|
31
|
+
"""Map portable wheel tags to the host targets in the release matrix."""
|
|
32
|
+
match = re.fullmatch(r"manylinux_2_(\d+)_(x86_64|aarch64)", platform)
|
|
33
|
+
if match and int(match[1]) <= 28:
|
|
34
|
+
return f"linux_{match[2]}"
|
|
35
|
+
match = re.fullmatch(r"macosx_(\d+)_(\d+)_(x86_64|arm64)", platform)
|
|
36
|
+
if match and (int(match[1]), int(match[2])) <= (11, 0):
|
|
37
|
+
return f"macos_{match[3]}"
|
|
38
|
+
if platform == "win_amd64":
|
|
39
|
+
return platform
|
|
40
|
+
raise ValueError(f"Unsupported release platform tag: {platform}")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def check_metadata(data: bytes, version: Version) -> None:
|
|
44
|
+
"""Require archive metadata to agree with the selected release."""
|
|
45
|
+
metadata = BytesParser().parsebytes(data)
|
|
46
|
+
if canonicalize_name(metadata.get("Name", "")) != "pythonnative":
|
|
47
|
+
raise ValueError("Distribution metadata has the wrong project name")
|
|
48
|
+
if metadata.get("Version") != str(version):
|
|
49
|
+
raise ValueError("Distribution metadata has the wrong version")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def check_distributions(directory: Path, expected_version: str) -> None:
|
|
53
|
+
"""Validate the full wheel matrix and its single source distribution."""
|
|
54
|
+
version = Version(expected_version)
|
|
55
|
+
expected = {(python, platform) for python in PYTHONS for platform in PLATFORMS}
|
|
56
|
+
seen: set[tuple[str, str]] = set()
|
|
57
|
+
sdists = 0
|
|
58
|
+
for path in sorted(directory.iterdir()):
|
|
59
|
+
if path.name.endswith(".whl"):
|
|
60
|
+
name, wheel_version, build, tags = parse_wheel_filename(path.name)
|
|
61
|
+
if name != "pythonnative" or wheel_version != version or build:
|
|
62
|
+
raise ValueError(f"Unexpected wheel name/version/build: {path.name}")
|
|
63
|
+
targets = set()
|
|
64
|
+
for tag in tags:
|
|
65
|
+
if tag.interpreter not in PYTHONS or tag.abi != tag.interpreter:
|
|
66
|
+
raise ValueError(f"Unsupported Python/ABI tag: {tag}")
|
|
67
|
+
targets.add((tag.interpreter, platform_family(tag.platform)))
|
|
68
|
+
if len(targets) != 1 or targets & seen:
|
|
69
|
+
raise ValueError(f"Duplicate or ambiguous wheel target: {path.name}")
|
|
70
|
+
seen.update(targets)
|
|
71
|
+
with zipfile.ZipFile(path) as archive:
|
|
72
|
+
names = set(archive.namelist())
|
|
73
|
+
metadata_path = f"pythonnative-{version}.dist-info/METADATA"
|
|
74
|
+
check_metadata(archive.read(metadata_path), version)
|
|
75
|
+
wheel = BytesParser().parsebytes(archive.read(metadata_path.replace("METADATA", "WHEEL")))
|
|
76
|
+
archive_tags = set().union(*(parse_tag(tag) for tag in wheel.get_all("Tag", [])))
|
|
77
|
+
if wheel.get("Root-Is-Purelib") != "false" or archive_tags != tags:
|
|
78
|
+
raise ValueError(f"Wheel metadata disagrees with binary platform tags: {path.name}")
|
|
79
|
+
suffix = ".pyd" if next(iter(targets))[1] == "win_amd64" else ".so"
|
|
80
|
+
if not any(n.startswith("pythonnative/_yoga.") and n.endswith(suffix) for n in names):
|
|
81
|
+
raise ValueError(f"Missing compiled Yoga extension: {path.name}")
|
|
82
|
+
missing = PACKAGE_FILES - names
|
|
83
|
+
if missing:
|
|
84
|
+
raise ValueError(f"Missing package resources in {path.name}: {sorted(missing)}")
|
|
85
|
+
elif path.name.endswith(".tar.gz"):
|
|
86
|
+
name, sdist_version = parse_sdist_filename(path.name)
|
|
87
|
+
if name != "pythonnative" or sdist_version != version:
|
|
88
|
+
raise ValueError(f"Unexpected source distribution: {path.name}")
|
|
89
|
+
sdists += 1
|
|
90
|
+
with tarfile.open(path) as archive:
|
|
91
|
+
prefix = f"pythonnative-{version}/"
|
|
92
|
+
names = set(archive.getnames())
|
|
93
|
+
required = {prefix + "src/" + name for name in PACKAGE_FILES}
|
|
94
|
+
required |= {prefix + "setup.py", prefix + "tests/test_layout.py"}
|
|
95
|
+
if missing := required - names:
|
|
96
|
+
raise ValueError(f"Incomplete source distribution: {sorted(missing)}")
|
|
97
|
+
metadata_file = archive.extractfile(prefix + "PKG-INFO")
|
|
98
|
+
project_file = archive.extractfile(prefix + "pyproject.toml")
|
|
99
|
+
if metadata_file is None or project_file is None:
|
|
100
|
+
raise ValueError("Source distribution is missing package metadata")
|
|
101
|
+
check_metadata(metadata_file.read(), version)
|
|
102
|
+
if tomllib.loads(project_file.read().decode())["project"]["version"] != str(version):
|
|
103
|
+
raise ValueError("Source version disagrees with release version")
|
|
104
|
+
else:
|
|
105
|
+
raise ValueError(f"Unexpected release artifact: {path.name}")
|
|
106
|
+
if sdists != 1 or seen != expected:
|
|
107
|
+
raise ValueError(f"Incomplete release: {sdists} sdists; missing wheel targets: {sorted(expected - seen)}")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def main() -> None:
|
|
111
|
+
"""Validate release artifacts selected by the workflow."""
|
|
112
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
113
|
+
parser.add_argument("directory", type=Path)
|
|
114
|
+
parser.add_argument("--version", required=True)
|
|
115
|
+
args = parser.parse_args()
|
|
116
|
+
check_distributions(args.directory, args.version)
|
|
117
|
+
print(f"Validated {len(PYTHONS) * len(PLATFORMS)} wheels and one sdist for {args.version}")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
if __name__ == "__main__":
|
|
121
|
+
main()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Kept outside pyproject.toml so the current workflow can also build an
|
|
2
|
+
# existing release's unmodified sdist, including tags predating cibuildwheel.
|
|
3
|
+
[tool.cibuildwheel]
|
|
4
|
+
build = ["cp313-*", "cp314-*"]
|
|
5
|
+
skip = ["*-musllinux*", "*-win32", "*-manylinux_i686"]
|
|
6
|
+
archs = ["native"]
|
|
7
|
+
test-requires = ["pytest>=8"]
|
|
8
|
+
# Install the repaired wheel into a fresh environment and copy just this
|
|
9
|
+
# test file to a temporary directory, outside the source checkout.
|
|
10
|
+
test-sources = ["tests/test_layout.py"]
|
|
11
|
+
test-command = [
|
|
12
|
+
"python -c \"import pythonnative; from importlib.metadata import version; from pathlib import Path; assert 'site-packages' in Path(pythonnative.__file__).parts; assert pythonnative.__version__ == version('pythonnative')\"",
|
|
13
|
+
"python -m pytest -q tests/test_layout.py",
|
|
14
|
+
"pn --help",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[tool.cibuildwheel.linux]
|
|
18
|
+
manylinux-x86_64-image = "manylinux_2_28"
|
|
19
|
+
manylinux-aarch64-image = "manylinux_2_28"
|
|
20
|
+
|
|
21
|
+
[tool.cibuildwheel.macos]
|
|
22
|
+
environment = { MACOSX_DEPLOYMENT_TARGET = "11.0" }
|
|
23
|
+
|
|
24
|
+
[tool.cibuildwheel.windows]
|
|
25
|
+
# These flags also make v0.40.0's C API available to ctypes without patching
|
|
26
|
+
# the tagged source. setup.py supplies them for future source builds.
|
|
27
|
+
environment = { CL = "/D_WINDLL", LINK = "/EXPORT:pn_yoga_callback /EXPORT:pn_yoga_measure" }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Preserve the exact distribution bytes across retries of a PyPI upload."""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import subprocess
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def sync_assets(tag: str, directory: Path) -> None:
|
|
10
|
+
"""Upload new assets and reuse existing ones without overwriting releases.
|
|
11
|
+
|
|
12
|
+
Build timestamps can change archive hashes. Store files on the GitHub
|
|
13
|
+
release before publishing to PyPI, then reuse those same bytes on recovery.
|
|
14
|
+
The workflow validates the resulting directory again before publishing.
|
|
15
|
+
"""
|
|
16
|
+
result = subprocess.run(
|
|
17
|
+
["gh", "release", "view", tag, "--json", "assets"],
|
|
18
|
+
check=True,
|
|
19
|
+
capture_output=True,
|
|
20
|
+
text=True,
|
|
21
|
+
)
|
|
22
|
+
existing = {asset["name"] for asset in json.loads(result.stdout)["assets"]}
|
|
23
|
+
for path in sorted(directory.iterdir()):
|
|
24
|
+
if path.name in existing:
|
|
25
|
+
subprocess.run(
|
|
26
|
+
["gh", "release", "download", tag, "--pattern", path.name, "--dir", str(directory), "--clobber"],
|
|
27
|
+
check=True,
|
|
28
|
+
)
|
|
29
|
+
else:
|
|
30
|
+
subprocess.run(["gh", "release", "upload", tag, str(path)], check=True)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def main() -> None:
|
|
34
|
+
"""Synchronize the selected release's distribution assets."""
|
|
35
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
36
|
+
parser.add_argument("tag")
|
|
37
|
+
parser.add_argument("directory", type=Path)
|
|
38
|
+
args = parser.parse_args()
|
|
39
|
+
sync_assets(args.tag, args.directory)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if __name__ == "__main__":
|
|
43
|
+
main()
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
# ctypes loads Yoga's C API and our measurement callbacks from
|
|
18
|
+
# the extension DLL, not just Python's module initializer.
|
|
19
|
+
define_macros=[("_WINDLL", "1")] if os.name == "nt" else [],
|
|
20
|
+
export_symbols=["pn_yoga_callback", "pn_yoga_measure"] if os.name == "nt" else [],
|
|
21
|
+
)
|
|
22
|
+
]
|
|
23
|
+
)
|