pythonnative 0.40.0__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pythonnative/__init__.py +411 -0
- pythonnative/_ios_log.py +92 -0
- pythonnative/_yoga.cp313-win_amd64.pyd +0 -0
- pythonnative/alerts.py +236 -0
- pythonnative/animated.py +1687 -0
- pythonnative/animation_graph.py +78 -0
- pythonnative/appearance.py +124 -0
- pythonnative/bootstrap.py +100 -0
- pythonnative/bridge/__init__.py +302 -0
- pythonnative/bridge/android.py +78 -0
- pythonnative/bridge/codec.py +170 -0
- pythonnative/bridge/commits.py +114 -0
- pythonnative/bridge/fake.py +243 -0
- pythonnative/bridge/ios.py +138 -0
- pythonnative/bridge/web.py +489 -0
- pythonnative/cli/__init__.py +7 -0
- pythonnative/cli/pn.py +1214 -0
- pythonnative/component.py +271 -0
- pythonnative/components/__init__.py +111 -0
- pythonnative/components/_base.py +166 -0
- pythonnative/components/controls.py +521 -0
- pythonnative/components/layout.py +518 -0
- pythonnative/components/lists.py +785 -0
- pythonnative/components/media.py +204 -0
- pythonnative/components/overlays.py +107 -0
- pythonnative/components/pressable.py +252 -0
- pythonnative/components/structural.py +167 -0
- pythonnative/components/text.py +291 -0
- pythonnative/devclient.py +824 -0
- pythonnative/devserver/__init__.py +34 -0
- pythonnative/devserver/server.py +718 -0
- pythonnative/devserver/static/animation_graph.js +82 -0
- pythonnative/devserver/static/bridge.js +147 -0
- pythonnative/devserver/static/colors.js +70 -0
- pythonnative/devserver/static/host.js +552 -0
- pythonnative/devserver/static/index.html +60 -0
- pythonnative/devserver/static/layout.js +85 -0
- pythonnative/devserver/static/preview.css +415 -0
- pythonnative/devserver/static/renderer.js +1994 -0
- pythonnative/devserver/static/shell.js +345 -0
- pythonnative/devserver/static/yoga/LICENSE +21 -0
- pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
- pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
- pythonnative/devserver/static/yoga/src/index.js +16 -0
- pythonnative/devserver/static/yoga/src/index.js.map +1 -0
- pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
- pythonnative/devserver/static/yoga/src/load.js +17 -0
- pythonnative/devserver/static/yoga/src/load.js.map +1 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
- pythonnative/devserver/watcher.py +267 -0
- pythonnative/devserver/ws.py +421 -0
- pythonnative/diagnostics.py +241 -0
- pythonnative/element.py +159 -0
- pythonnative/equality.py +19 -0
- pythonnative/events.py +231 -0
- pythonnative/gestures.py +1333 -0
- pythonnative/hooks.py +1621 -0
- pythonnative/hosts/__init__.py +63 -0
- pythonnative/hosts/base.py +596 -0
- pythonnative/hosts/native.py +302 -0
- pythonnative/hot_reload.py +585 -0
- pythonnative/layout.py +328 -0
- pythonnative/mutations.py +142 -0
- pythonnative/native/android/build.gradle +52 -0
- pythonnative/native/android/gradle.properties +3 -0
- pythonnative/native/android/settings.gradle +12 -0
- pythonnative/native/android/src/main/AndroidManifest.xml +11 -0
- pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
- pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/PNBridge.kt +261 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/PythonHost.kt +20 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +141 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +257 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +175 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +40 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +33 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +82 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +80 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +117 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +74 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +37 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +32 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +213 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +69 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +186 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +123 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +141 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +162 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +134 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PNColor.kt +201 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +86 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +55 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +122 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +214 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +113 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +52 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +131 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +250 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextManager.kt +233 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +355 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +149 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +233 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +127 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +527 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +73 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +316 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +61 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +200 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +158 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +100 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +99 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +89 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +178 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +16 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +188 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +80 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +48 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +76 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +18 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +49 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +75 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +197 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNColorTest.kt +47 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +78 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PromiseTest.kt +89 -0
- pythonnative/native/ios/Package.swift +23 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimator.swift +312 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNBridge.swift +255 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNRegistry.swift +142 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNTransaction.swift +166 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +53 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNButtonManagers.swift +207 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNColor.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNComponentManager.swift +183 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNContainerView.swift +56 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNControlManagers.swift +281 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNImageManager.swift +222 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +243 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNPressableManager.swift +114 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +197 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTabBarManager.swift +106 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextInputManager.swift +297 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextManager.swift +230 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTransform.swift +82 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewManager.swift +86 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewState.swift +87 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewStyler.swift +340 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNWebViewManager.swift +124 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +260 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/AlertModule.swift +92 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/LifecycleModules.swift +174 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/MediaModules.swift +177 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/PNNativeModule.swift +168 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/PermissionModules.swift +266 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/SystemModules.swift +251 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +8 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNViewController.swift +237 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNCompat.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNJSON.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNLog.swift +47 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNWindow.swift +51 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNColorTests.swift +50 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNGestureTests.swift +101 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNManagerTests.swift +126 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNModuleTests.swift +111 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNTransactionTests.swift +91 -0
- pythonnative/native/yoga/LICENSE +21 -0
- pythonnative/native/yoga/Package.swift +9 -0
- pythonnative/native/yoga/VENDORED.md +2 -0
- pythonnative/native/yoga/include/PNStyle.h +10 -0
- pythonnative/native/yoga/include/module.modulemap +5 -0
- pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
- pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
- pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
- pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
- pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
- pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
- pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
- pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
- pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
- pythonnative/native/yoga/python.cpp +16 -0
- pythonnative/native/yoga/style.cpp +272 -0
- pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
- pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
- pythonnative/native/yoga/yoga/YGConfig.h +158 -0
- pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
- pythonnative/native/yoga/yoga/YGEnums.h +142 -0
- pythonnative/native/yoga/yoga/YGMacros.h +99 -0
- pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
- pythonnative/native/yoga/yoga/YGNode.h +304 -0
- pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
- pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
- pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
- pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
- pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
- pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
- pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
- pythonnative/native/yoga/yoga/YGValue.h +84 -0
- pythonnative/native/yoga/yoga/Yoga.h +21 -0
- pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
- pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
- pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
- pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
- pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
- pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
- pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
- pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
- pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
- pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
- pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
- pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
- pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
- pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
- pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
- pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
- pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
- pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
- pythonnative/native/yoga/yoga/config/Config.h +92 -0
- pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
- pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
- pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
- pythonnative/native/yoga/yoga/debug/Log.h +34 -0
- pythonnative/native/yoga/yoga/enums/Align.h +47 -0
- pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
- pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
- pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
- pythonnative/native/yoga/yoga/enums/Display.h +41 -0
- pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
- pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
- pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
- pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
- pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
- pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
- pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
- pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
- pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
- pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
- pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
- pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
- pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
- pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
- pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
- pythonnative/native/yoga/yoga/event/event.cpp +87 -0
- pythonnative/native/yoga/yoga/event/event.h +130 -0
- pythonnative/native/yoga/yoga/module.modulemap +21 -0
- pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
- pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
- pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
- pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
- pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
- pythonnative/native/yoga/yoga/node/Node.h +337 -0
- pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
- pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
- pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
- pythonnative/native/yoga/yoga/style/Style.h +757 -0
- pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
- pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
- pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
- pythonnative/native_modules/__init__.py +124 -0
- pythonnative/native_modules/app_state.py +99 -0
- pythonnative/native_modules/battery.py +75 -0
- pythonnative/native_modules/biometrics.py +42 -0
- pythonnative/native_modules/camera.py +65 -0
- pythonnative/native_modules/clipboard.py +46 -0
- pythonnative/native_modules/fallback.py +324 -0
- pythonnative/native_modules/file_system.py +145 -0
- pythonnative/native_modules/haptics.py +75 -0
- pythonnative/native_modules/linking.py +123 -0
- pythonnative/native_modules/location.py +75 -0
- pythonnative/native_modules/net_info.py +112 -0
- pythonnative/native_modules/notifications.py +129 -0
- pythonnative/native_modules/permissions.py +108 -0
- pythonnative/native_modules/registry.py +526 -0
- pythonnative/native_modules/secure_store.py +52 -0
- pythonnative/native_modules/share.py +51 -0
- pythonnative/native_views/__init__.py +375 -0
- pythonnative/native_views/base.py +316 -0
- pythonnative/native_views/bridge_backend.py +277 -0
- pythonnative/navigation/__init__.py +103 -0
- pythonnative/navigation/container.py +154 -0
- pythonnative/navigation/handle.py +540 -0
- pythonnative/navigation/hooks.py +133 -0
- pythonnative/navigation/host.py +58 -0
- pythonnative/navigation/linking.py +200 -0
- pythonnative/navigation/navigators.py +659 -0
- pythonnative/navigation/screen.py +149 -0
- pythonnative/navigation/state.py +269 -0
- pythonnative/net.py +248 -0
- pythonnative/platform.py +166 -0
- pythonnative/platform_metrics.py +252 -0
- pythonnative/preview.py +287 -0
- pythonnative/profiling.py +101 -0
- pythonnative/project/__init__.py +68 -0
- pythonnative/project/android.py +557 -0
- pythonnative/project/builder.py +817 -0
- pythonnative/project/config.py +773 -0
- pythonnative/project/deps.py +719 -0
- pythonnative/project/devices.py +304 -0
- pythonnative/project/doctor.py +283 -0
- pythonnative/project/fingerprint.py +171 -0
- pythonnative/project/icons.py +247 -0
- pythonnative/project/ios.py +325 -0
- pythonnative/project/lockfile.py +100 -0
- pythonnative/project/permissions.py +361 -0
- pythonnative/project/plugins.py +519 -0
- pythonnative/project/runtime_assets.py +183 -0
- pythonnative/py.typed +0 -0
- pythonnative/query.py +153 -0
- pythonnative/reconciler/__init__.py +29 -0
- pythonnative/reconciler/boundaries.py +375 -0
- pythonnative/reconciler/children.py +88 -0
- pythonnative/reconciler/core.py +1165 -0
- pythonnative/reconciler/layout_pass.py +393 -0
- pythonnative/reconciler/vnode.py +266 -0
- pythonnative/refresh.py +55 -0
- pythonnative/runtime.py +306 -0
- pythonnative/scheduler.py +159 -0
- pythonnative/sdk/__init__.py +153 -0
- pythonnative/sdk/_components.py +427 -0
- pythonnative/sdk/builtins.py +91 -0
- pythonnative/sdk/codegen.py +149 -0
- pythonnative/sdk/module_codegen.py +184 -0
- pythonnative/sdk/schema.py +224 -0
- pythonnative/sdk/templates/contracts.kt +46 -0
- pythonnative/sdk/templates/contracts.swift +46 -0
- pythonnative/storage.py +184 -0
- pythonnative/style.py +841 -0
- pythonnative/suspense.py +183 -0
- pythonnative/templates/android_template/app/build.gradle +75 -0
- pythonnative/templates/android_template/app/proguard-rules.pro +21 -0
- pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +24 -0
- pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +7 -0
- pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +32 -0
- pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +130 -0
- pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +13 -0
- pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
- pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
- pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +10 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +22 -0
- pythonnative/templates/android_template/app/src/main/res/values/colors.xml +5 -0
- pythonnative/templates/android_template/app/src/main/res/values/strings.xml +5 -0
- pythonnative/templates/android_template/app/src/main/res/values/themes.xml +9 -0
- pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +7 -0
- pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +13 -0
- pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +19 -0
- pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +17 -0
- pythonnative/templates/android_template/build.gradle +10 -0
- pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +6 -0
- pythonnative/templates/android_template/gradle.properties +23 -0
- pythonnative/templates/android_template/gradlew +185 -0
- pythonnative/templates/android_template/gradlew.bat +89 -0
- pythonnative/templates/android_template/settings.gradle +17 -0
- pythonnative/templates/ios_template/ios_template/AppDelegate.swift +51 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +13 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +6 -0
- pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +25 -0
- pythonnative/templates/ios_template/ios_template/BridgingHeader.h +14 -0
- pythonnative/templates/ios_template/ios_template/Info.plist +28 -0
- pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +390 -0
- pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +61 -0
- pythonnative/templates/ios_template/ios_template/ViewController.swift +23 -0
- pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +745 -0
- pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +36 -0
- pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +41 -0
- pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +32 -0
- pythonnative/testing/__init__.py +53 -0
- pythonnative/testing/backend.py +276 -0
- pythonnative/testing/harness.py +369 -0
- pythonnative/utils.py +145 -0
- pythonnative-0.40.0.dist-info/DELVEWHEEL +2 -0
- pythonnative-0.40.0.dist-info/METADATA +150 -0
- pythonnative-0.40.0.dist-info/RECORD +418 -0
- pythonnative-0.40.0.dist-info/WHEEL +5 -0
- pythonnative-0.40.0.dist-info/entry_points.txt +2 -0
- pythonnative-0.40.0.dist-info/licenses/LICENSE +21 -0
- pythonnative-0.40.0.dist-info/top_level.txt +1 -0
- pythonnative.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll +0 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"""Cross-platform permission/capability catalog.
|
|
2
|
+
|
|
3
|
+
PythonNative apps declare the device capabilities they need in a single,
|
|
4
|
+
platform-agnostic ``[permissions]`` table in ``pythonnative.toml``:
|
|
5
|
+
|
|
6
|
+
```toml
|
|
7
|
+
[permissions]
|
|
8
|
+
camera = "Scan receipts with your camera."
|
|
9
|
+
location_when_in_use = "Show nearby stores."
|
|
10
|
+
notifications = true
|
|
11
|
+
face_id = "Unlock the app with Face ID."
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
This module maps each high-level capability to the concrete native
|
|
15
|
+
artifacts it requires:
|
|
16
|
+
|
|
17
|
+
- iOS: one or more ``Info.plist`` *usage description* keys (the strings
|
|
18
|
+
shown in the system permission prompt), plus optional
|
|
19
|
+
``UIBackgroundModes`` entries.
|
|
20
|
+
- Android: one or more ``<uses-permission>`` entries in
|
|
21
|
+
``AndroidManifest.xml``.
|
|
22
|
+
|
|
23
|
+
A capability's value may be either a string (used verbatim as the iOS
|
|
24
|
+
usage description) or ``true`` (use the capability's
|
|
25
|
+
[`default_reason`][pythonnative.project.permissions.Capability]). A value
|
|
26
|
+
of ``false`` disables the capability, useful for switching one off
|
|
27
|
+
without deleting the line.
|
|
28
|
+
|
|
29
|
+
The catalog is the single source of truth shared by the iOS and Android
|
|
30
|
+
configurators and by ``pn doctor``; adding a capability here is all that
|
|
31
|
+
is required to make it declarable.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
from dataclasses import dataclass, field
|
|
37
|
+
from typing import Dict, List, Mapping, Tuple, Union
|
|
38
|
+
|
|
39
|
+
PermissionValue = Union[bool, str]
|
|
40
|
+
"""Type of a value in the ``[permissions]`` table: a reason string or a bool."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class Capability:
|
|
45
|
+
"""A declarable device capability and its native requirements.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
key: The capability name as written in ``[permissions]``
|
|
49
|
+
(e.g., ``"camera"``).
|
|
50
|
+
summary: Human-readable description, shown by ``pn doctor`` and
|
|
51
|
+
the docs.
|
|
52
|
+
ios_usage_keys: ``Info.plist`` keys that receive the usage
|
|
53
|
+
description string (e.g., ``"NSCameraUsageDescription"``).
|
|
54
|
+
android_permissions: Fully-qualified Android permission names
|
|
55
|
+
(e.g., ``"android.permission.CAMERA"``).
|
|
56
|
+
ios_background_modes: ``UIBackgroundModes`` values to add
|
|
57
|
+
(e.g., ``"location"``).
|
|
58
|
+
ios_entitlements: Code-signing entitlement key/value pairs the
|
|
59
|
+
capability requires (e.g., ``aps-environment`` for remote
|
|
60
|
+
push notifications).
|
|
61
|
+
default_reason: Fallback usage description used when the
|
|
62
|
+
capability is declared as ``true`` instead of a string.
|
|
63
|
+
needs_reason: Whether iOS requires a usage description for this
|
|
64
|
+
capability. When ``False`` (e.g., notifications), declaring
|
|
65
|
+
the capability as ``true`` is sufficient and no string is
|
|
66
|
+
needed.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
key: str
|
|
70
|
+
summary: str
|
|
71
|
+
ios_usage_keys: Tuple[str, ...] = ()
|
|
72
|
+
android_permissions: Tuple[str, ...] = ()
|
|
73
|
+
ios_background_modes: Tuple[str, ...] = ()
|
|
74
|
+
ios_entitlements: Tuple[Tuple[str, object], ...] = ()
|
|
75
|
+
default_reason: str = ""
|
|
76
|
+
needs_reason: bool = True
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _cap(*args: object, **kwargs: object) -> Capability:
|
|
80
|
+
return Capability(*args, **kwargs) # type: ignore[arg-type]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# ======================================================================
|
|
84
|
+
# The catalog
|
|
85
|
+
# ======================================================================
|
|
86
|
+
|
|
87
|
+
CAPABILITIES: Dict[str, Capability] = {
|
|
88
|
+
c.key: c
|
|
89
|
+
for c in [
|
|
90
|
+
Capability(
|
|
91
|
+
key="camera",
|
|
92
|
+
summary="Capture photos and video with the device camera.",
|
|
93
|
+
ios_usage_keys=("NSCameraUsageDescription",),
|
|
94
|
+
android_permissions=("android.permission.CAMERA",),
|
|
95
|
+
default_reason="This app uses the camera.",
|
|
96
|
+
),
|
|
97
|
+
Capability(
|
|
98
|
+
key="microphone",
|
|
99
|
+
summary="Record audio from the microphone.",
|
|
100
|
+
ios_usage_keys=("NSMicrophoneUsageDescription",),
|
|
101
|
+
android_permissions=("android.permission.RECORD_AUDIO",),
|
|
102
|
+
default_reason="This app uses the microphone.",
|
|
103
|
+
),
|
|
104
|
+
Capability(
|
|
105
|
+
key="photo_library",
|
|
106
|
+
summary="Read photos and videos from the photo library.",
|
|
107
|
+
ios_usage_keys=("NSPhotoLibraryUsageDescription",),
|
|
108
|
+
android_permissions=(
|
|
109
|
+
"android.permission.READ_MEDIA_IMAGES",
|
|
110
|
+
"android.permission.READ_MEDIA_VIDEO",
|
|
111
|
+
),
|
|
112
|
+
default_reason="This app accesses your photo library.",
|
|
113
|
+
),
|
|
114
|
+
Capability(
|
|
115
|
+
key="photo_library_add",
|
|
116
|
+
summary="Save photos and videos to the photo library.",
|
|
117
|
+
ios_usage_keys=("NSPhotoLibraryAddUsageDescription",),
|
|
118
|
+
android_permissions=(),
|
|
119
|
+
default_reason="This app saves photos to your library.",
|
|
120
|
+
),
|
|
121
|
+
Capability(
|
|
122
|
+
key="location_when_in_use",
|
|
123
|
+
summary="Access location while the app is in the foreground.",
|
|
124
|
+
ios_usage_keys=("NSLocationWhenInUseUsageDescription",),
|
|
125
|
+
android_permissions=(
|
|
126
|
+
"android.permission.ACCESS_FINE_LOCATION",
|
|
127
|
+
"android.permission.ACCESS_COARSE_LOCATION",
|
|
128
|
+
),
|
|
129
|
+
default_reason="This app uses your location.",
|
|
130
|
+
),
|
|
131
|
+
Capability(
|
|
132
|
+
key="location_always",
|
|
133
|
+
summary="Access location in the foreground and background.",
|
|
134
|
+
ios_usage_keys=(
|
|
135
|
+
"NSLocationAlwaysAndWhenInUseUsageDescription",
|
|
136
|
+
"NSLocationWhenInUseUsageDescription",
|
|
137
|
+
),
|
|
138
|
+
android_permissions=(
|
|
139
|
+
"android.permission.ACCESS_FINE_LOCATION",
|
|
140
|
+
"android.permission.ACCESS_COARSE_LOCATION",
|
|
141
|
+
"android.permission.ACCESS_BACKGROUND_LOCATION",
|
|
142
|
+
),
|
|
143
|
+
ios_background_modes=("location",),
|
|
144
|
+
default_reason="This app uses your location, even in the background.",
|
|
145
|
+
),
|
|
146
|
+
Capability(
|
|
147
|
+
key="contacts",
|
|
148
|
+
summary="Read the device address book.",
|
|
149
|
+
ios_usage_keys=("NSContactsUsageDescription",),
|
|
150
|
+
android_permissions=("android.permission.READ_CONTACTS",),
|
|
151
|
+
default_reason="This app accesses your contacts.",
|
|
152
|
+
),
|
|
153
|
+
Capability(
|
|
154
|
+
key="calendars",
|
|
155
|
+
summary="Read and write calendar events.",
|
|
156
|
+
ios_usage_keys=("NSCalendarsUsageDescription",),
|
|
157
|
+
android_permissions=(
|
|
158
|
+
"android.permission.READ_CALENDAR",
|
|
159
|
+
"android.permission.WRITE_CALENDAR",
|
|
160
|
+
),
|
|
161
|
+
default_reason="This app accesses your calendar.",
|
|
162
|
+
),
|
|
163
|
+
Capability(
|
|
164
|
+
key="reminders",
|
|
165
|
+
summary="Read and write reminders (iOS only).",
|
|
166
|
+
ios_usage_keys=("NSRemindersUsageDescription",),
|
|
167
|
+
android_permissions=(),
|
|
168
|
+
default_reason="This app accesses your reminders.",
|
|
169
|
+
),
|
|
170
|
+
Capability(
|
|
171
|
+
key="motion",
|
|
172
|
+
summary="Access motion and fitness / activity data.",
|
|
173
|
+
ios_usage_keys=("NSMotionUsageDescription",),
|
|
174
|
+
android_permissions=("android.permission.ACTIVITY_RECOGNITION",),
|
|
175
|
+
default_reason="This app uses motion and fitness data.",
|
|
176
|
+
),
|
|
177
|
+
Capability(
|
|
178
|
+
key="face_id",
|
|
179
|
+
summary="Authenticate with Face ID / biometrics.",
|
|
180
|
+
ios_usage_keys=("NSFaceIDUsageDescription",),
|
|
181
|
+
android_permissions=("android.permission.USE_BIOMETRIC",),
|
|
182
|
+
default_reason="This app uses Face ID to authenticate you.",
|
|
183
|
+
),
|
|
184
|
+
Capability(
|
|
185
|
+
key="bluetooth",
|
|
186
|
+
summary="Communicate with nearby Bluetooth devices.",
|
|
187
|
+
ios_usage_keys=("NSBluetoothAlwaysUsageDescription",),
|
|
188
|
+
android_permissions=(
|
|
189
|
+
"android.permission.BLUETOOTH_CONNECT",
|
|
190
|
+
"android.permission.BLUETOOTH_SCAN",
|
|
191
|
+
),
|
|
192
|
+
default_reason="This app connects to Bluetooth devices.",
|
|
193
|
+
),
|
|
194
|
+
Capability(
|
|
195
|
+
key="speech_recognition",
|
|
196
|
+
summary="Perform speech recognition (iOS only).",
|
|
197
|
+
ios_usage_keys=("NSSpeechRecognitionUsageDescription",),
|
|
198
|
+
android_permissions=(),
|
|
199
|
+
default_reason="This app uses speech recognition.",
|
|
200
|
+
),
|
|
201
|
+
Capability(
|
|
202
|
+
key="notifications",
|
|
203
|
+
summary="Show local notifications.",
|
|
204
|
+
ios_usage_keys=(),
|
|
205
|
+
android_permissions=("android.permission.POST_NOTIFICATIONS",),
|
|
206
|
+
needs_reason=False,
|
|
207
|
+
),
|
|
208
|
+
Capability(
|
|
209
|
+
key="remote_notifications",
|
|
210
|
+
summary="Receive remote (APNs) push notifications on iOS.",
|
|
211
|
+
ios_usage_keys=(),
|
|
212
|
+
android_permissions=("android.permission.POST_NOTIFICATIONS",),
|
|
213
|
+
ios_background_modes=("remote-notification",),
|
|
214
|
+
ios_entitlements=(("aps-environment", "development"),),
|
|
215
|
+
needs_reason=False,
|
|
216
|
+
),
|
|
217
|
+
Capability(
|
|
218
|
+
key="vibration",
|
|
219
|
+
summary="Trigger haptic feedback / vibration.",
|
|
220
|
+
ios_usage_keys=(),
|
|
221
|
+
android_permissions=("android.permission.VIBRATE",),
|
|
222
|
+
needs_reason=False,
|
|
223
|
+
),
|
|
224
|
+
Capability(
|
|
225
|
+
key="background_audio",
|
|
226
|
+
summary="Continue playing audio in the background (iOS).",
|
|
227
|
+
ios_usage_keys=(),
|
|
228
|
+
ios_background_modes=("audio",),
|
|
229
|
+
android_permissions=("android.permission.FOREGROUND_SERVICE",),
|
|
230
|
+
needs_reason=False,
|
|
231
|
+
),
|
|
232
|
+
Capability(
|
|
233
|
+
key="background_fetch",
|
|
234
|
+
summary="Perform periodic background fetches (iOS).",
|
|
235
|
+
ios_usage_keys=(),
|
|
236
|
+
ios_background_modes=("fetch",),
|
|
237
|
+
android_permissions=(),
|
|
238
|
+
needs_reason=False,
|
|
239
|
+
),
|
|
240
|
+
]
|
|
241
|
+
}
|
|
242
|
+
"""Mapping of capability key → [`Capability`][pythonnative.project.permissions.Capability]."""
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
# Permissions every app gets, regardless of declared capabilities. Both are
|
|
246
|
+
# "normal" (install-time) Android permissions that never prompt the user, and
|
|
247
|
+
# nearly every PythonNative app needs the network (``fetch``, ``use_query``,
|
|
248
|
+
# ``NetInfo``, remote images).
|
|
249
|
+
BASE_ANDROID_PERMISSIONS: Tuple[str, ...] = (
|
|
250
|
+
"android.permission.INTERNET",
|
|
251
|
+
"android.permission.ACCESS_NETWORK_STATE",
|
|
252
|
+
)
|
|
253
|
+
"""Android permissions added to every app (network access)."""
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
@dataclass
|
|
257
|
+
class ResolvedPermissions:
|
|
258
|
+
"""The native permission artifacts for a resolved capability set.
|
|
259
|
+
|
|
260
|
+
Attributes:
|
|
261
|
+
ios_usage_descriptions: ``Info.plist`` usage-description keys
|
|
262
|
+
mapped to their reason strings.
|
|
263
|
+
ios_background_modes: Ordered, de-duplicated ``UIBackgroundModes``
|
|
264
|
+
values.
|
|
265
|
+
ios_entitlements: Code-signing entitlement keys mapped to their
|
|
266
|
+
values (empty when no capability needs entitlements).
|
|
267
|
+
android_permissions: Ordered, de-duplicated Android permission
|
|
268
|
+
names (including the always-on base set).
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
ios_usage_descriptions: Dict[str, str] = field(default_factory=dict)
|
|
272
|
+
ios_background_modes: List[str] = field(default_factory=list)
|
|
273
|
+
ios_entitlements: Dict[str, object] = field(default_factory=dict)
|
|
274
|
+
android_permissions: List[str] = field(default_factory=list)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def unknown_capabilities(keys: object) -> List[str]:
|
|
278
|
+
"""Return any declared capability keys that aren't in the catalog.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
keys: An iterable of capability key strings.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
The subset of ``keys`` not present in
|
|
285
|
+
[`CAPABILITIES`][pythonnative.project.permissions.CAPABILITIES],
|
|
286
|
+
in input order.
|
|
287
|
+
"""
|
|
288
|
+
result: List[str] = []
|
|
289
|
+
for key in keys:
|
|
290
|
+
if key not in CAPABILITIES:
|
|
291
|
+
result.append(str(key))
|
|
292
|
+
return result
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def resolve_permissions(
|
|
296
|
+
permissions: Mapping[str, PermissionValue],
|
|
297
|
+
*,
|
|
298
|
+
extra_android_permissions: object = (),
|
|
299
|
+
) -> ResolvedPermissions:
|
|
300
|
+
"""Resolve a declared capability map into native permission artifacts.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
permissions: The ``[permissions]`` table, capability key to a
|
|
304
|
+
reason string or boolean. ``false``/``None`` values are
|
|
305
|
+
skipped (capability disabled).
|
|
306
|
+
extra_android_permissions: Additional raw Android permission
|
|
307
|
+
names (e.g., from ``[android].permissions``) to append.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
A [`ResolvedPermissions`][pythonnative.project.permissions.ResolvedPermissions]
|
|
311
|
+
with iOS usage descriptions, iOS background modes, and the full
|
|
312
|
+
ordered Android permission list (base set first).
|
|
313
|
+
|
|
314
|
+
Raises:
|
|
315
|
+
ValueError: If an unknown capability key is present. Validate
|
|
316
|
+
earlier with
|
|
317
|
+
[`unknown_capabilities`][pythonnative.project.permissions.unknown_capabilities]
|
|
318
|
+
for a friendlier error.
|
|
319
|
+
"""
|
|
320
|
+
resolved = ResolvedPermissions()
|
|
321
|
+
android: List[str] = list(BASE_ANDROID_PERMISSIONS)
|
|
322
|
+
background: List[str] = []
|
|
323
|
+
|
|
324
|
+
for key, value in permissions.items():
|
|
325
|
+
if key not in CAPABILITIES:
|
|
326
|
+
raise ValueError(f"Unknown capability: {key!r}")
|
|
327
|
+
if value is False or value is None:
|
|
328
|
+
continue
|
|
329
|
+
cap = CAPABILITIES[key]
|
|
330
|
+
reason = value if isinstance(value, str) and value.strip() else cap.default_reason
|
|
331
|
+
for plist_key in cap.ios_usage_keys:
|
|
332
|
+
# First declaration wins for a shared key (e.g. location_*).
|
|
333
|
+
resolved.ios_usage_descriptions.setdefault(plist_key, reason)
|
|
334
|
+
for mode in cap.ios_background_modes:
|
|
335
|
+
if mode not in background:
|
|
336
|
+
background.append(mode)
|
|
337
|
+
for entitlement_key, entitlement_value in cap.ios_entitlements:
|
|
338
|
+
resolved.ios_entitlements.setdefault(entitlement_key, entitlement_value)
|
|
339
|
+
for perm in cap.android_permissions:
|
|
340
|
+
if perm not in android:
|
|
341
|
+
android.append(perm)
|
|
342
|
+
|
|
343
|
+
for perm in extra_android_permissions:
|
|
344
|
+
if perm and perm not in android:
|
|
345
|
+
android.append(str(perm))
|
|
346
|
+
|
|
347
|
+
resolved.ios_background_modes = background
|
|
348
|
+
resolved.android_permissions = android
|
|
349
|
+
return resolved
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def describe_catalog() -> str:
|
|
353
|
+
"""Return a multi-line, human-readable listing of all capabilities.
|
|
354
|
+
|
|
355
|
+
Used by ``pn doctor`` / docs tooling to show what can be declared.
|
|
356
|
+
"""
|
|
357
|
+
lines: List[str] = []
|
|
358
|
+
for key in sorted(CAPABILITIES):
|
|
359
|
+
cap = CAPABILITIES[key]
|
|
360
|
+
lines.append(f" {key:<22} {cap.summary}")
|
|
361
|
+
return "\n".join(lines)
|