From 5dbbd195bedd4a7138e75d5de0ed86c802d86598 Mon Sep 17 00:00:00 2001 From: owenthcarey Date: Mon, 19 Jun 2023 11:01:59 -0700 Subject: [PATCH 01/66] Add iOS template --- apps/templates/ios_template/.gitignore | 97 +++ .../ios_template.xcodeproj/project.pbxproj | 607 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../ios_template/AppDelegate.swift | 36 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../ios_template/Base.lproj/Main.storyboard | 24 + .../ios_template/ios_template/Info.plist | 25 + .../ios_template/SceneDelegate.swift | 52 ++ .../ios_template/ViewController.swift | 19 + .../ios_templateTests/ios_templateTests.swift | 36 ++ .../ios_templateUITests.swift | 41 ++ .../ios_templateUITestsLaunchTests.swift | 32 + 15 files changed, 1032 insertions(+) create mode 100644 apps/templates/ios_template/.gitignore create mode 100644 apps/templates/ios_template/ios_template.xcodeproj/project.pbxproj create mode 100644 apps/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 apps/templates/ios_template/ios_template/AppDelegate.swift create mode 100644 apps/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 apps/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 apps/templates/ios_template/ios_template/Assets.xcassets/Contents.json create mode 100644 apps/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard create mode 100644 apps/templates/ios_template/ios_template/Base.lproj/Main.storyboard create mode 100644 apps/templates/ios_template/ios_template/Info.plist create mode 100644 apps/templates/ios_template/ios_template/SceneDelegate.swift create mode 100644 apps/templates/ios_template/ios_template/ViewController.swift create mode 100644 apps/templates/ios_template/ios_templateTests/ios_templateTests.swift create mode 100644 apps/templates/ios_template/ios_templateUITests/ios_templateUITests.swift create mode 100644 apps/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift diff --git a/apps/templates/ios_template/.gitignore b/apps/templates/ios_template/.gitignore new file mode 100644 index 0000000..df6adc8 --- /dev/null +++ b/apps/templates/ios_template/.gitignore @@ -0,0 +1,97 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +# Xcode + +*.xcodeproj/project.xcworkspace/* +!*.xcodeproj/project.xcworkspace/xcshareddata/ +*.xcodeproj/xcuserdata/ +*.xcuserstate diff --git a/apps/templates/ios_template/ios_template.xcodeproj/project.pbxproj b/apps/templates/ios_template/ios_template.xcodeproj/project.pbxproj new file mode 100644 index 0000000..32043c3 --- /dev/null +++ b/apps/templates/ios_template/ios_template.xcodeproj/project.pbxproj @@ -0,0 +1,607 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 146EBB822A40CCC900E4A2B3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBB812A40CCC900E4A2B3 /* AppDelegate.swift */; }; + 146EBB842A40CCC900E4A2B3 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBB832A40CCC900E4A2B3 /* SceneDelegate.swift */; }; + 146EBB862A40CCC900E4A2B3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBB852A40CCC900E4A2B3 /* ViewController.swift */; }; + 146EBB892A40CCC900E4A2B3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 146EBB872A40CCC900E4A2B3 /* Main.storyboard */; }; + 146EBB8B2A40CCCE00E4A2B3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 146EBB8A2A40CCCE00E4A2B3 /* Assets.xcassets */; }; + 146EBB8E2A40CCCE00E4A2B3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 146EBB8C2A40CCCE00E4A2B3 /* LaunchScreen.storyboard */; }; + 146EBB992A40CCCE00E4A2B3 /* ios_templateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBB982A40CCCE00E4A2B3 /* ios_templateTests.swift */; }; + 146EBBA32A40CCCE00E4A2B3 /* ios_templateUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBBA22A40CCCE00E4A2B3 /* ios_templateUITests.swift */; }; + 146EBBA52A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 146EBB952A40CCCE00E4A2B3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146EBB762A40CCC900E4A2B3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 146EBB7D2A40CCC900E4A2B3; + remoteInfo = ios_template; + }; + 146EBB9F2A40CCCE00E4A2B3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146EBB762A40CCC900E4A2B3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 146EBB7D2A40CCC900E4A2B3; + remoteInfo = ios_template; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 146EBB7E2A40CCC900E4A2B3 /* ios_template.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ios_template.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 146EBB812A40CCC900E4A2B3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 146EBB832A40CCC900E4A2B3 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 146EBB852A40CCC900E4A2B3 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 146EBB882A40CCC900E4A2B3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 146EBB8A2A40CCCE00E4A2B3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 146EBB8D2A40CCCE00E4A2B3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 146EBB8F2A40CCCE00E4A2B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 146EBB942A40CCCE00E4A2B3 /* ios_templateTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ios_templateTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 146EBB982A40CCCE00E4A2B3 /* ios_templateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateTests.swift; sourceTree = ""; }; + 146EBB9E2A40CCCE00E4A2B3 /* ios_templateUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ios_templateUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 146EBBA22A40CCCE00E4A2B3 /* ios_templateUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateUITests.swift; sourceTree = ""; }; + 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateUITestsLaunchTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 146EBB7B2A40CCC900E4A2B3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 146EBB912A40CCCE00E4A2B3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 146EBB9B2A40CCCE00E4A2B3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 146EBB752A40CCC900E4A2B3 = { + isa = PBXGroup; + children = ( + 146EBB802A40CCC900E4A2B3 /* ios_template */, + 146EBB972A40CCCE00E4A2B3 /* ios_templateTests */, + 146EBBA12A40CCCE00E4A2B3 /* ios_templateUITests */, + 146EBB7F2A40CCC900E4A2B3 /* Products */, + ); + sourceTree = ""; + }; + 146EBB7F2A40CCC900E4A2B3 /* Products */ = { + isa = PBXGroup; + children = ( + 146EBB7E2A40CCC900E4A2B3 /* ios_template.app */, + 146EBB942A40CCCE00E4A2B3 /* ios_templateTests.xctest */, + 146EBB9E2A40CCCE00E4A2B3 /* ios_templateUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 146EBB802A40CCC900E4A2B3 /* ios_template */ = { + isa = PBXGroup; + children = ( + 146EBB812A40CCC900E4A2B3 /* AppDelegate.swift */, + 146EBB832A40CCC900E4A2B3 /* SceneDelegate.swift */, + 146EBB852A40CCC900E4A2B3 /* ViewController.swift */, + 146EBB872A40CCC900E4A2B3 /* Main.storyboard */, + 146EBB8A2A40CCCE00E4A2B3 /* Assets.xcassets */, + 146EBB8C2A40CCCE00E4A2B3 /* LaunchScreen.storyboard */, + 146EBB8F2A40CCCE00E4A2B3 /* Info.plist */, + ); + path = ios_template; + sourceTree = ""; + }; + 146EBB972A40CCCE00E4A2B3 /* ios_templateTests */ = { + isa = PBXGroup; + children = ( + 146EBB982A40CCCE00E4A2B3 /* ios_templateTests.swift */, + ); + path = ios_templateTests; + sourceTree = ""; + }; + 146EBBA12A40CCCE00E4A2B3 /* ios_templateUITests */ = { + isa = PBXGroup; + children = ( + 146EBBA22A40CCCE00E4A2B3 /* ios_templateUITests.swift */, + 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */, + ); + path = ios_templateUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 146EBB7D2A40CCC900E4A2B3 /* ios_template */ = { + isa = PBXNativeTarget; + buildConfigurationList = 146EBBA82A40CCCE00E4A2B3 /* Build configuration list for PBXNativeTarget "ios_template" */; + buildPhases = ( + 146EBB7A2A40CCC900E4A2B3 /* Sources */, + 146EBB7B2A40CCC900E4A2B3 /* Frameworks */, + 146EBB7C2A40CCC900E4A2B3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ios_template; + productName = ios_template; + productReference = 146EBB7E2A40CCC900E4A2B3 /* ios_template.app */; + productType = "com.apple.product-type.application"; + }; + 146EBB932A40CCCE00E4A2B3 /* ios_templateTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 146EBBAB2A40CCCE00E4A2B3 /* Build configuration list for PBXNativeTarget "ios_templateTests" */; + buildPhases = ( + 146EBB902A40CCCE00E4A2B3 /* Sources */, + 146EBB912A40CCCE00E4A2B3 /* Frameworks */, + 146EBB922A40CCCE00E4A2B3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 146EBB962A40CCCE00E4A2B3 /* PBXTargetDependency */, + ); + name = ios_templateTests; + productName = ios_templateTests; + productReference = 146EBB942A40CCCE00E4A2B3 /* ios_templateTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 146EBB9D2A40CCCE00E4A2B3 /* ios_templateUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 146EBBAE2A40CCCE00E4A2B3 /* Build configuration list for PBXNativeTarget "ios_templateUITests" */; + buildPhases = ( + 146EBB9A2A40CCCE00E4A2B3 /* Sources */, + 146EBB9B2A40CCCE00E4A2B3 /* Frameworks */, + 146EBB9C2A40CCCE00E4A2B3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 146EBBA02A40CCCE00E4A2B3 /* PBXTargetDependency */, + ); + name = ios_templateUITests; + productName = ios_templateUITests; + productReference = 146EBB9E2A40CCCE00E4A2B3 /* ios_templateUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 146EBB762A40CCC900E4A2B3 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; + TargetAttributes = { + 146EBB7D2A40CCC900E4A2B3 = { + CreatedOnToolsVersion = 14.3.1; + }; + 146EBB932A40CCCE00E4A2B3 = { + CreatedOnToolsVersion = 14.3.1; + TestTargetID = 146EBB7D2A40CCC900E4A2B3; + }; + 146EBB9D2A40CCCE00E4A2B3 = { + CreatedOnToolsVersion = 14.3.1; + TestTargetID = 146EBB7D2A40CCC900E4A2B3; + }; + }; + }; + buildConfigurationList = 146EBB792A40CCC900E4A2B3 /* Build configuration list for PBXProject "ios_template" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 146EBB752A40CCC900E4A2B3; + productRefGroup = 146EBB7F2A40CCC900E4A2B3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 146EBB7D2A40CCC900E4A2B3 /* ios_template */, + 146EBB932A40CCCE00E4A2B3 /* ios_templateTests */, + 146EBB9D2A40CCCE00E4A2B3 /* ios_templateUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 146EBB7C2A40CCC900E4A2B3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 146EBB8E2A40CCCE00E4A2B3 /* LaunchScreen.storyboard in Resources */, + 146EBB8B2A40CCCE00E4A2B3 /* Assets.xcassets in Resources */, + 146EBB892A40CCC900E4A2B3 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 146EBB922A40CCCE00E4A2B3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 146EBB9C2A40CCCE00E4A2B3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 146EBB7A2A40CCC900E4A2B3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 146EBB862A40CCC900E4A2B3 /* ViewController.swift in Sources */, + 146EBB822A40CCC900E4A2B3 /* AppDelegate.swift in Sources */, + 146EBB842A40CCC900E4A2B3 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 146EBB902A40CCCE00E4A2B3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 146EBB992A40CCCE00E4A2B3 /* ios_templateTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 146EBB9A2A40CCCE00E4A2B3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 146EBBA52A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift in Sources */, + 146EBBA32A40CCCE00E4A2B3 /* ios_templateUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 146EBB962A40CCCE00E4A2B3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 146EBB7D2A40CCC900E4A2B3 /* ios_template */; + targetProxy = 146EBB952A40CCCE00E4A2B3 /* PBXContainerItemProxy */; + }; + 146EBBA02A40CCCE00E4A2B3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 146EBB7D2A40CCC900E4A2B3 /* ios_template */; + targetProxy = 146EBB9F2A40CCCE00E4A2B3 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 146EBB872A40CCC900E4A2B3 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 146EBB882A40CCC900E4A2B3 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 146EBB8C2A40CCCE00E4A2B3 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 146EBB8D2A40CCCE00E4A2B3 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 146EBBA62A40CCCE00E4A2B3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 146EBBA72A40CCCE00E4A2B3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 146EBBA92A40CCCE00E4A2B3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VCRNX87X5M; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ios_template/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-template"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 146EBBAA2A40CCCE00E4A2B3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VCRNX87X5M; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ios_template/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-template"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 146EBBAC2A40CCCE00E4A2B3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VCRNX87X5M; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-templateTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ios_template.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ios_template"; + }; + name = Debug; + }; + 146EBBAD2A40CCCE00E4A2B3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VCRNX87X5M; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-templateTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ios_template.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ios_template"; + }; + name = Release; + }; + 146EBBAF2A40CCCE00E4A2B3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VCRNX87X5M; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-templateUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ios_template; + }; + name = Debug; + }; + 146EBBB02A40CCCE00E4A2B3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = VCRNX87X5M; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-templateUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ios_template; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 146EBB792A40CCC900E4A2B3 /* Build configuration list for PBXProject "ios_template" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 146EBBA62A40CCCE00E4A2B3 /* Debug */, + 146EBBA72A40CCCE00E4A2B3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 146EBBA82A40CCCE00E4A2B3 /* Build configuration list for PBXNativeTarget "ios_template" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 146EBBA92A40CCCE00E4A2B3 /* Debug */, + 146EBBAA2A40CCCE00E4A2B3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 146EBBAB2A40CCCE00E4A2B3 /* Build configuration list for PBXNativeTarget "ios_templateTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 146EBBAC2A40CCCE00E4A2B3 /* Debug */, + 146EBBAD2A40CCCE00E4A2B3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 146EBBAE2A40CCCE00E4A2B3 /* Build configuration list for PBXNativeTarget "ios_templateUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 146EBBAF2A40CCCE00E4A2B3 /* Debug */, + 146EBBB02A40CCCE00E4A2B3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 146EBB762A40CCC900E4A2B3 /* Project object */; +} diff --git a/apps/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/apps/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/apps/templates/ios_template/ios_template/AppDelegate.swift b/apps/templates/ios_template/ios_template/AppDelegate.swift new file mode 100644 index 0000000..7eea5b5 --- /dev/null +++ b/apps/templates/ios_template/ios_template/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// ios_template +// +// Created by Owen Carey on 6/19/23. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/apps/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json b/apps/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/apps/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/apps/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/templates/ios_template/ios_template/Assets.xcassets/Contents.json b/apps/templates/ios_template/ios_template/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/apps/templates/ios_template/ios_template/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard b/apps/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/apps/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/templates/ios_template/ios_template/Base.lproj/Main.storyboard b/apps/templates/ios_template/ios_template/Base.lproj/Main.storyboard new file mode 100644 index 0000000..25a7638 --- /dev/null +++ b/apps/templates/ios_template/ios_template/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/templates/ios_template/ios_template/Info.plist b/apps/templates/ios_template/ios_template/Info.plist new file mode 100644 index 0000000..dd3c9af --- /dev/null +++ b/apps/templates/ios_template/ios_template/Info.plist @@ -0,0 +1,25 @@ + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + + diff --git a/apps/templates/ios_template/ios_template/SceneDelegate.swift b/apps/templates/ios_template/ios_template/SceneDelegate.swift new file mode 100644 index 0000000..1302535 --- /dev/null +++ b/apps/templates/ios_template/ios_template/SceneDelegate.swift @@ -0,0 +1,52 @@ +// +// SceneDelegate.swift +// ios_template +// +// Created by Owen Carey on 6/19/23. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/apps/templates/ios_template/ios_template/ViewController.swift b/apps/templates/ios_template/ios_template/ViewController.swift new file mode 100644 index 0000000..59beb91 --- /dev/null +++ b/apps/templates/ios_template/ios_template/ViewController.swift @@ -0,0 +1,19 @@ +// +// ViewController.swift +// ios_template +// +// Created by Owen Carey on 6/19/23. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + + +} + diff --git a/apps/templates/ios_template/ios_templateTests/ios_templateTests.swift b/apps/templates/ios_template/ios_templateTests/ios_templateTests.swift new file mode 100644 index 0000000..a9d85dd --- /dev/null +++ b/apps/templates/ios_template/ios_templateTests/ios_templateTests.swift @@ -0,0 +1,36 @@ +// +// ios_templateTests.swift +// ios_templateTests +// +// Created by Owen Carey on 6/19/23. +// + +import XCTest +@testable import ios_template + +final class ios_templateTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/apps/templates/ios_template/ios_templateUITests/ios_templateUITests.swift b/apps/templates/ios_template/ios_templateUITests/ios_templateUITests.swift new file mode 100644 index 0000000..a4180a9 --- /dev/null +++ b/apps/templates/ios_template/ios_templateUITests/ios_templateUITests.swift @@ -0,0 +1,41 @@ +// +// ios_templateUITests.swift +// ios_templateUITests +// +// Created by Owen Carey on 6/19/23. +// + +import XCTest + +final class ios_templateUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/apps/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift b/apps/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift new file mode 100644 index 0000000..41c43d5 --- /dev/null +++ b/apps/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift @@ -0,0 +1,32 @@ +// +// ios_templateUITestsLaunchTests.swift +// ios_templateUITests +// +// Created by Owen Carey on 6/19/23. +// + +import XCTest + +final class ios_templateUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} From 25a14adcfd4368ac6ad5d1102384a44c62e6bb2b Mon Sep 17 00:00:00 2001 From: owenthcarey Date: Mon, 19 Jun 2023 11:21:25 -0700 Subject: [PATCH 02/66] Add Android template --- apps/templates/android_template/.gitignore | 15 ++ .../templates/android_template/app/.gitignore | 1 + .../android_template/app/build.gradle | 44 +++++ .../android_template/app/proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.kt | 24 +++ .../app/src/main/AndroidManifest.xml | 26 +++ .../android_template/MainActivity.kt | 11 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ .../app/src/main/res/layout/activity_main.xml | 18 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/values-night/themes.xml | 7 + .../app/src/main/res/values/colors.xml | 5 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 9 + .../app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../android_template/ExampleUnitTest.kt | 17 ++ apps/templates/android_template/build.gradle | 6 + .../android_template/gradle.properties | 23 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + apps/templates/android_template/gradlew | 185 ++++++++++++++++++ apps/templates/android_template/gradlew.bat | 89 +++++++++ .../android_template/settings.gradle | 16 ++ 36 files changed, 770 insertions(+) create mode 100644 apps/templates/android_template/.gitignore create mode 100644 apps/templates/android_template/app/.gitignore create mode 100644 apps/templates/android_template/app/build.gradle create mode 100644 apps/templates/android_template/app/proguard-rules.pro create mode 100644 apps/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt create mode 100644 apps/templates/android_template/app/src/main/AndroidManifest.xml create mode 100644 apps/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt create mode 100644 apps/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 apps/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 apps/templates/android_template/app/src/main/res/layout/activity_main.xml create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 apps/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 apps/templates/android_template/app/src/main/res/values-night/themes.xml create mode 100644 apps/templates/android_template/app/src/main/res/values/colors.xml create mode 100644 apps/templates/android_template/app/src/main/res/values/strings.xml create mode 100644 apps/templates/android_template/app/src/main/res/values/themes.xml create mode 100644 apps/templates/android_template/app/src/main/res/xml/backup_rules.xml create mode 100644 apps/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 apps/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt create mode 100644 apps/templates/android_template/build.gradle create mode 100644 apps/templates/android_template/gradle.properties create mode 100644 apps/templates/android_template/gradle/wrapper/gradle-wrapper.jar create mode 100644 apps/templates/android_template/gradle/wrapper/gradle-wrapper.properties create mode 100755 apps/templates/android_template/gradlew create mode 100644 apps/templates/android_template/gradlew.bat create mode 100644 apps/templates/android_template/settings.gradle diff --git a/apps/templates/android_template/.gitignore b/apps/templates/android_template/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/apps/templates/android_template/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/apps/templates/android_template/app/.gitignore b/apps/templates/android_template/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/apps/templates/android_template/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/apps/templates/android_template/app/build.gradle b/apps/templates/android_template/app/build.gradle new file mode 100644 index 0000000..50c047f --- /dev/null +++ b/apps/templates/android_template/app/build.gradle @@ -0,0 +1,44 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.pythonnative.android_template' + compileSdk 33 + + defaultConfig { + applicationId "com.pythonnative.android_template" + minSdk 24 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/apps/templates/android_template/app/proguard-rules.pro b/apps/templates/android_template/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/apps/templates/android_template/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/apps/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt b/apps/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..33b2b12 --- /dev/null +++ b/apps/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.pythonnative.android_template + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.pythonnative.android_template", appContext.packageName) + } +} \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/AndroidManifest.xml b/apps/templates/android_template/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..52e4ce3 --- /dev/null +++ b/apps/templates/android_template/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt b/apps/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt new file mode 100644 index 0000000..758dec6 --- /dev/null +++ b/apps/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt @@ -0,0 +1,11 @@ +package com.pythonnative.android_template + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/apps/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml b/apps/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/templates/android_template/app/src/main/res/layout/activity_main.xml b/apps/templates/android_template/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..17eab17 --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/apps/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/apps/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/apps/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/apps/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/apps/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/apps/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/apps/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/apps/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/apps/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/apps/templates/android_template/app/src/main/res/values-night/themes.xml b/apps/templates/android_template/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..27c7264 --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/values/colors.xml b/apps/templates/android_template/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..c8524cd --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/values/strings.xml b/apps/templates/android_template/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..eac65ba --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + android_template + \ No newline at end of file diff --git a/apps/templates/android_template/app/src/main/res/values/themes.xml b/apps/templates/android_template/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..d44785c --- /dev/null +++ b/apps/templates/android_template/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + + - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/main/res/values/colors.xml b/apps/android_pythonnative_2/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127..0000000 --- a/apps/android_pythonnative_2/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/main/res/values/dimens.xml b/apps/android_pythonnative_2/app/src/main/res/values/dimens.xml deleted file mode 100644 index e00c2dd..0000000 --- a/apps/android_pythonnative_2/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - 16dp - 16dp - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/main/res/values/strings.xml b/apps/android_pythonnative_2/app/src/main/res/values/strings.xml deleted file mode 100644 index 93b11db..0000000 --- a/apps/android_pythonnative_2/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - pythonnative - Home - Dashboard - Notifications - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/main/res/values/themes.xml b/apps/android_pythonnative_2/app/src/main/res/values/themes.xml deleted file mode 100644 index 7566594..0000000 --- a/apps/android_pythonnative_2/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/main/res/xml/backup_rules.xml b/apps/android_pythonnative_2/app/src/main/res/xml/backup_rules.xml deleted file mode 100644 index fa0f996..0000000 --- a/apps/android_pythonnative_2/app/src/main/res/xml/backup_rules.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/main/res/xml/data_extraction_rules.xml b/apps/android_pythonnative_2/app/src/main/res/xml/data_extraction_rules.xml deleted file mode 100644 index 9ee9997..0000000 --- a/apps/android_pythonnative_2/app/src/main/res/xml/data_extraction_rules.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_2/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt b/apps/android_pythonnative_2/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt deleted file mode 100644 index 1bb2d2b..0000000 --- a/apps/android_pythonnative_2/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.pythonnative.pythonnative - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/apps/android_pythonnative_2/gradle.properties b/apps/android_pythonnative_2/gradle.properties deleted file mode 100644 index 3c5031e..0000000 --- a/apps/android_pythonnative_2/gradle.properties +++ /dev/null @@ -1,23 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file diff --git a/apps/android_pythonnative_2/gradle/wrapper/gradle-wrapper.jar b/apps/android_pythonnative_2/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/apps/android_pythonnative_2/gradle/wrapper/gradle-wrapper.properties b/apps/android_pythonnative_2/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index ec5b26f..0000000 --- a/apps/android_pythonnative_2/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Sat May 27 19:46:05 PDT 2023 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/apps/android_pythonnative_2/gradlew b/apps/android_pythonnative_2/gradlew deleted file mode 100755 index 4f906e0..0000000 --- a/apps/android_pythonnative_2/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/apps/android_pythonnative_2/settings.gradle b/apps/android_pythonnative_2/settings.gradle deleted file mode 100644 index 8d1d42f..0000000 --- a/apps/android_pythonnative_2/settings.gradle +++ /dev/null @@ -1,16 +0,0 @@ -pluginManagement { - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - } -} -rootProject.name = "pythonnative" -include ':app' diff --git a/apps/android_pythonnative_3/.gitignore b/apps/android_pythonnative_3/.gitignore deleted file mode 100644 index aa724b7..0000000 --- a/apps/android_pythonnative_3/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cxx -local.properties diff --git a/apps/android_pythonnative_3/app/.gitignore b/apps/android_pythonnative_3/app/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/apps/android_pythonnative_3/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/proguard-rules.pro b/apps/android_pythonnative_3/app/proguard-rules.pro deleted file mode 100644 index 481bb43..0000000 --- a/apps/android_pythonnative_3/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt b/apps/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt deleted file mode 100644 index e2269ba..0000000 --- a/apps/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.pythonnative.pythonnative - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.pythonnative.pythonnative", appContext.packageName) - } -} \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/main/python/plot.py b/apps/android_pythonnative_3/app/src/main/python/plot.py deleted file mode 100644 index fdfdf94..0000000 --- a/apps/android_pythonnative_3/app/src/main/python/plot.py +++ /dev/null @@ -1,14 +0,0 @@ -import io -import matplotlib.pyplot as plt - - -def plot(x, y): - xa = [float(word) for word in x.split()] - ya = [float(word) for word in y.split()] - - fig, ax = plt.subplots() - ax.plot(xa, ya) - - f = io.BytesIO() - plt.savefig(f, format="png") - return f.getvalue() diff --git a/apps/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/apps/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml b/apps/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 6f3b755..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/apps/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 6f3b755..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/apps/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/apps/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/apps/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/apps/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070fe34c611c42c0d3ad3013a0dce358be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/apps/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/apps/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/apps/android_pythonnative_3/app/src/main/res/values/strings.xml b/apps/android_pythonnative_3/app/src/main/res/values/strings.xml deleted file mode 100644 index 115bda4..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - pythonnative - \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml b/apps/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml deleted file mode 100644 index fa0f996..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml b/apps/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml deleted file mode 100644 index 9ee9997..0000000 --- a/apps/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/apps/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt b/apps/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt deleted file mode 100644 index 1bb2d2b..0000000 --- a/apps/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.pythonnative.pythonnative - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/apps/android_pythonnative_3/build.gradle b/apps/android_pythonnative_3/build.gradle deleted file mode 100644 index ff78675..0000000 --- a/apps/android_pythonnative_3/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -plugins { - id 'com.android.application' version '8.0.2' apply false - id 'com.android.library' version '8.0.2' apply false - id 'org.jetbrains.kotlin.android' version '1.8.20' apply false - id 'com.chaquo.python' version '14.0.2' apply false -} \ No newline at end of file diff --git a/apps/android_pythonnative_3/gradle.properties b/apps/android_pythonnative_3/gradle.properties deleted file mode 100644 index 3c5031e..0000000 --- a/apps/android_pythonnative_3/gradle.properties +++ /dev/null @@ -1,23 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file diff --git a/apps/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar b/apps/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/apps/android_pythonnative_3/gradlew b/apps/android_pythonnative_3/gradlew deleted file mode 100755 index 4f906e0..0000000 --- a/apps/android_pythonnative_3/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/apps/android_pythonnative_3/gradlew.bat b/apps/android_pythonnative_3/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/apps/android_pythonnative_3/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/apps/android_pythonnative_3/settings.gradle b/apps/android_pythonnative_3/settings.gradle deleted file mode 100644 index 8d1d42f..0000000 --- a/apps/android_pythonnative_3/settings.gradle +++ /dev/null @@ -1,16 +0,0 @@ -pluginManagement { - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - } -} -rootProject.name = "pythonnative" -include ':app' diff --git a/apps/android_pythonnative/.gitignore b/apps/experiments/android_pythonnative_3/.gitignore similarity index 100% rename from apps/android_pythonnative/.gitignore rename to apps/experiments/android_pythonnative_3/.gitignore diff --git a/apps/android_pythonnative/app/.gitignore b/apps/experiments/android_pythonnative_3/app/.gitignore similarity index 100% rename from apps/android_pythonnative/app/.gitignore rename to apps/experiments/android_pythonnative_3/app/.gitignore diff --git a/apps/android_pythonnative_3/app/build.gradle b/apps/experiments/android_pythonnative_3/app/build.gradle similarity index 100% rename from apps/android_pythonnative_3/app/build.gradle rename to apps/experiments/android_pythonnative_3/app/build.gradle diff --git a/apps/android_pythonnative/app/proguard-rules.pro b/apps/experiments/android_pythonnative_3/app/proguard-rules.pro similarity index 100% rename from apps/android_pythonnative/app/proguard-rules.pro rename to apps/experiments/android_pythonnative_3/app/proguard-rules.pro diff --git a/apps/android_pythonnative/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt b/apps/experiments/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt similarity index 100% rename from apps/android_pythonnative/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt rename to apps/experiments/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt diff --git a/apps/android_pythonnative_3/app/src/main/AndroidManifest.xml b/apps/experiments/android_pythonnative_3/app/src/main/AndroidManifest.xml similarity index 100% rename from apps/android_pythonnative_3/app/src/main/AndroidManifest.xml rename to apps/experiments/android_pythonnative_3/app/src/main/AndroidManifest.xml diff --git a/apps/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt b/apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt similarity index 100% rename from apps/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt rename to apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt diff --git a/apps/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt b/apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt similarity index 100% rename from apps/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt rename to apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt diff --git a/apps/android_pythonnative_3/app/src/main/python/app/__init__.py b/apps/experiments/android_pythonnative_3/app/src/main/python/app/__init__.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/app/__init__.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/app/__init__.py diff --git a/apps/android_pythonnative_3/app/src/main/python/app/main.py b/apps/experiments/android_pythonnative_3/app/src/main/python/app/main.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/app/main.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/app/main.py diff --git a/apps/android_pythonnative_3/app/src/main/python/app/main_2.py b/apps/experiments/android_pythonnative_3/app/src/main/python/app/main_2.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/app/main_2.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/app/main_2.py diff --git a/apps/android_pythonnative_3/app/src/main/python/app/main_3.py b/apps/experiments/android_pythonnative_3/app/src/main/python/app/main_3.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/app/main_3.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/app/main_3.py diff --git a/apps/android_pythonnative_3/app/src/main/python/app/second_page.py b/apps/experiments/android_pythonnative_3/app/src/main/python/app/second_page.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/app/second_page.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/app/second_page.py diff --git a/apps/android_pythonnative_3/app/src/main/python/create_button.py b/apps/experiments/android_pythonnative_3/app/src/main/python/create_button.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/create_button.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/create_button.py diff --git a/apps/android_pythonnative_3/app/src/main/python/create_constraint_layout.py b/apps/experiments/android_pythonnative_3/app/src/main/python/create_constraint_layout.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/create_constraint_layout.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/create_constraint_layout.py diff --git a/apps/android_pythonnative_3/app/src/main/python/create_pn_layout.py b/apps/experiments/android_pythonnative_3/app/src/main/python/create_pn_layout.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/create_pn_layout.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/create_pn_layout.py diff --git a/apps/android_pythonnative_3/app/src/main/python/create_recycler_view.py b/apps/experiments/android_pythonnative_3/app/src/main/python/create_recycler_view.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/create_recycler_view.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/create_recycler_view.py diff --git a/apps/android_pythonnative_3/app/src/main/python/create_widgets.py b/apps/experiments/android_pythonnative_3/app/src/main/python/create_widgets.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/create_widgets.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/create_widgets.py diff --git a/apps/android_pythonnative/app/src/main/python/plot.py b/apps/experiments/android_pythonnative_3/app/src/main/python/plot.py similarity index 100% rename from apps/android_pythonnative/app/src/main/python/plot.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/plot.py diff --git a/apps/android_pythonnative_3/app/src/main/python/ui_layout.py b/apps/experiments/android_pythonnative_3/app/src/main/python/ui_layout.py similarity index 100% rename from apps/android_pythonnative_3/app/src/main/python/ui_layout.py rename to apps/experiments/android_pythonnative_3/app/src/main/python/ui_layout.py diff --git a/apps/android_pythonnative/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/apps/android_pythonnative/app/src/main/res/drawable/ic_launcher_background.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/drawable/ic_launcher_background.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/apps/android_pythonnative_3/app/src/main/res/layout/activity_main.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_main.xml similarity index 100% rename from apps/android_pythonnative_3/app/src/main/res/layout/activity_main.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_main.xml diff --git a/apps/android_pythonnative_3/app/src/main/res/layout/activity_second.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_second.xml similarity index 100% rename from apps/android_pythonnative_3/app/src/main/res/layout/activity_second.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_second.xml diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/apps/android_pythonnative/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from apps/android_pythonnative/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/apps/android_pythonnative_3/app/src/main/res/values-night/themes.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/values-night/themes.xml similarity index 100% rename from apps/android_pythonnative_3/app/src/main/res/values-night/themes.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/values-night/themes.xml diff --git a/apps/android_pythonnative_3/app/src/main/res/values/colors.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/values/colors.xml similarity index 100% rename from apps/android_pythonnative_3/app/src/main/res/values/colors.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/values/colors.xml diff --git a/apps/android_pythonnative/app/src/main/res/values/strings.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/values/strings.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/values/strings.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/values/strings.xml diff --git a/apps/android_pythonnative_3/app/src/main/res/values/themes.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/values/themes.xml similarity index 100% rename from apps/android_pythonnative_3/app/src/main/res/values/themes.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/values/themes.xml diff --git a/apps/android_pythonnative/app/src/main/res/xml/backup_rules.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/xml/backup_rules.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml diff --git a/apps/android_pythonnative/app/src/main/res/xml/data_extraction_rules.xml b/apps/experiments/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from apps/android_pythonnative/app/src/main/res/xml/data_extraction_rules.xml rename to apps/experiments/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml diff --git a/apps/android_pythonnative/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt b/apps/experiments/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt similarity index 100% rename from apps/android_pythonnative/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt rename to apps/experiments/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt diff --git a/apps/android_pythonnative_2/build.gradle b/apps/experiments/android_pythonnative_3/build.gradle similarity index 100% rename from apps/android_pythonnative_2/build.gradle rename to apps/experiments/android_pythonnative_3/build.gradle diff --git a/apps/android_pythonnative/gradle.properties b/apps/experiments/android_pythonnative_3/gradle.properties similarity index 100% rename from apps/android_pythonnative/gradle.properties rename to apps/experiments/android_pythonnative_3/gradle.properties diff --git a/apps/android_pythonnative/gradle/wrapper/gradle-wrapper.jar b/apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from apps/android_pythonnative/gradle/wrapper/gradle-wrapper.jar rename to apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar diff --git a/apps/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties b/apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from apps/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties rename to apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties diff --git a/apps/android_pythonnative/gradlew b/apps/experiments/android_pythonnative_3/gradlew similarity index 100% rename from apps/android_pythonnative/gradlew rename to apps/experiments/android_pythonnative_3/gradlew diff --git a/apps/android_pythonnative_2/gradlew.bat b/apps/experiments/android_pythonnative_3/gradlew.bat similarity index 100% rename from apps/android_pythonnative_2/gradlew.bat rename to apps/experiments/android_pythonnative_3/gradlew.bat diff --git a/apps/android_pythonnative/settings.gradle b/apps/experiments/android_pythonnative_3/settings.gradle similarity index 100% rename from apps/android_pythonnative/settings.gradle rename to apps/experiments/android_pythonnative_3/settings.gradle diff --git a/apps/beeware_pythonnative/.gitignore b/apps/experiments/beeware_pythonnative/.gitignore similarity index 100% rename from apps/beeware_pythonnative/.gitignore rename to apps/experiments/beeware_pythonnative/.gitignore diff --git a/apps/beeware_pythonnative/CHANGELOG b/apps/experiments/beeware_pythonnative/CHANGELOG similarity index 100% rename from apps/beeware_pythonnative/CHANGELOG rename to apps/experiments/beeware_pythonnative/CHANGELOG diff --git a/apps/beeware_pythonnative/LICENSE b/apps/experiments/beeware_pythonnative/LICENSE similarity index 100% rename from apps/beeware_pythonnative/LICENSE rename to apps/experiments/beeware_pythonnative/LICENSE diff --git a/apps/beeware_pythonnative/README.rst b/apps/experiments/beeware_pythonnative/README.rst similarity index 100% rename from apps/beeware_pythonnative/README.rst rename to apps/experiments/beeware_pythonnative/README.rst diff --git a/apps/beeware_pythonnative/pyproject.toml b/apps/experiments/beeware_pythonnative/pyproject.toml similarity index 100% rename from apps/beeware_pythonnative/pyproject.toml rename to apps/experiments/beeware_pythonnative/pyproject.toml diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/__init__.py b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/__init__.py rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/__main__.py b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/__main__.py rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/app.py b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/app.py rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico diff --git a/apps/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png b/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png similarity index 100% rename from apps/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png rename to apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png diff --git a/apps/beeware_pythonnative/tests/__init__.py b/apps/experiments/beeware_pythonnative/tests/__init__.py similarity index 100% rename from apps/beeware_pythonnative/tests/__init__.py rename to apps/experiments/beeware_pythonnative/tests/__init__.py diff --git a/apps/beeware_pythonnative/tests/beeware_pythonnative.py b/apps/experiments/beeware_pythonnative/tests/beeware_pythonnative.py similarity index 100% rename from apps/beeware_pythonnative/tests/beeware_pythonnative.py rename to apps/experiments/beeware_pythonnative/tests/beeware_pythonnative.py diff --git a/apps/beeware_pythonnative/tests/test_app.py b/apps/experiments/beeware_pythonnative/tests/test_app.py similarity index 100% rename from apps/beeware_pythonnative/tests/test_app.py rename to apps/experiments/beeware_pythonnative/tests/test_app.py diff --git a/libs/metadata_generators/__init__.py b/libs/experiments/metadata_generators/__init__.py similarity index 100% rename from libs/metadata_generators/__init__.py rename to libs/experiments/metadata_generators/__init__.py diff --git a/libs/metadata_generators/android_metadata_generator.py b/libs/experiments/metadata_generators/android_metadata_generator.py similarity index 100% rename from libs/metadata_generators/android_metadata_generator.py rename to libs/experiments/metadata_generators/android_metadata_generator.py diff --git a/libs/metadata_generators/ios_metadata_generator.py b/libs/experiments/metadata_generators/ios_metadata_generator.py similarity index 100% rename from libs/metadata_generators/ios_metadata_generator.py rename to libs/experiments/metadata_generators/ios_metadata_generator.py diff --git a/libs/rubicon_tests/__init__.py b/libs/experiments/rubicon_tests/__init__.py similarity index 100% rename from libs/rubicon_tests/__init__.py rename to libs/experiments/rubicon_tests/__init__.py diff --git a/libs/rubicon_tests/rubicon_java_tests.py b/libs/experiments/rubicon_tests/rubicon_java_tests.py similarity index 100% rename from libs/rubicon_tests/rubicon_java_tests.py rename to libs/experiments/rubicon_tests/rubicon_java_tests.py diff --git a/libs/rubicon_tests/rubicon_objc_test.py b/libs/experiments/rubicon_tests/rubicon_objc_test.py similarity index 100% rename from libs/rubicon_tests/rubicon_objc_test.py rename to libs/experiments/rubicon_tests/rubicon_objc_test.py diff --git a/libs/ui_elements/__init__.py b/libs/experiments/ui_elements/__init__.py similarity index 100% rename from libs/ui_elements/__init__.py rename to libs/experiments/ui_elements/__init__.py diff --git a/libs/ui_elements/android_ui_elements.py b/libs/experiments/ui_elements/android_ui_elements.py similarity index 100% rename from libs/ui_elements/android_ui_elements.py rename to libs/experiments/ui_elements/android_ui_elements.py diff --git a/libs/ui_elements/ios_ui_elements.py b/libs/experiments/ui_elements/ios_ui_elements.py similarity index 100% rename from libs/ui_elements/ios_ui_elements.py rename to libs/experiments/ui_elements/ios_ui_elements.py diff --git a/libs/notes/jetpack_compose.md b/libs/notes/jetpack_compose.md deleted file mode 100644 index 58691e6..0000000 --- a/libs/notes/jetpack_compose.md +++ /dev/null @@ -1,3 +0,0 @@ -- UI: https://developer.android.com/develop/ui -- Views-based UIs: https://developer.android.com/develop/ui/views/layout/declaring-layout -- Jetpack Compose: https://developer.android.com/jetpack/compose diff --git a/libs/notes/swiftui.md b/libs/notes/swiftui.md deleted file mode 100644 index e9855ad..0000000 --- a/libs/notes/swiftui.md +++ /dev/null @@ -1,260 +0,0 @@ -This is from the Apple UIKit docs -(https://developer.apple.com/documentation/uikit): - -"UIKit works seamlessly with the SwiftUI framework, so you can implement parts of -your UIKit app in SwiftUI or mix interface elements between the two frameworks. -For example, you can place UIKit views and view controllers inside SwiftUI -views, and vice versa." - -Could you show me how to do this? - ---- - -Sure, I can help with that. You can use UIKit views in SwiftUI by conforming to -the `UIViewRepresentable` protocol, and you can use SwiftUI views in UIKit by -wrapping them in a `UIHostingController`. Here's an example of each. - -## UIKit views in SwiftUI - -First, let's show how to use a UIKit view in a SwiftUI view. We'll use a -`UISlider` as an example: - -```swift -import SwiftUI -import UIKit - -struct UIKitSlider: UIViewRepresentable { - @Binding var value: Float - - func makeUIView(context: Context) -> UISlider { - let slider = UISlider(frame: .zero) - slider.value = value - slider.addTarget(context.coordinator, action: #selector(Coordinator.valueChanged(_:)), for: .valueChanged) - return slider - } - - func updateUIView(_ uiView: UISlider, context: Context) { - uiView.value = value - } - - func makeCoordinator() -> Coordinator { - Coordinator(value: $value) - } - - class Coordinator: NSObject { - var value: Binding - - init(value: Binding) { - self.value = value - } - - @objc func valueChanged(_ sender: UISlider) { - self.value.wrappedValue = sender.value - } - } -} -``` - -You can then use `UIKitSlider` in your SwiftUI views like this: - -```swift -struct ContentView: View { - @State private var sliderValue: Float = 0.5 - - var body: some View { - VStack { - Text("Slider Value: \(sliderValue)") - UIKitSlider(value: $sliderValue) - } - } -} -``` - -## SwiftUI views in UIKit - -You can also embed SwiftUI views in your UIKit code by using a -UIHostingController. Here's an example of how to do that: - -```swift -import SwiftUI -import UIKit - -struct SwiftUIView: View { - var body: some View { - Text("Hello, SwiftUI!") - .padding() - .background(Color.green) - .foregroundColor(.white) - .cornerRadius(10) - } -} - -class ViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - - let hostingController = UIHostingController(rootView: SwiftUIView()) - addChild(hostingController) - hostingController.view.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(hostingController.view) - - NSLayoutConstraint.activate([ - hostingController.view.centerXAnchor.constraint(equalTo: view.centerXAnchor), - hostingController.view.centerYAnchor.constraint(equalTo: view.centerYAnchor), - ]) - } -} -``` - -In this example, `SwiftUIView` is embedded in a `ViewController`. It will -display a text "Hello, SwiftUI!" with a green background in the center of the -screen. - ---- - -Could you show me how to place a `UIViewController` (instead of just a `UIView`) -inside SwiftUI views? - ---- - -## UIKit UIViewControllers in SwiftUI - -Yes, absolutely! In order to use a `UIViewController` in a SwiftUI view, you -need to use the `UIViewControllerRepresentable` protocol. Here's an example of -how to use a `UIImagePickerController` (which is a subclass of -`UIViewController`) inside a SwiftUI view: - -```swift -import SwiftUI -import UIKit - -struct ImagePicker: UIViewControllerRepresentable { - @Binding var selectedImage: UIImage? - @Environment(\.presentationMode) private var presentationMode - - class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { - var parent: ImagePicker - - init(_ parent: ImagePicker) { - self.parent = parent - } - - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { - if let uiImage = info[.originalImage] as? UIImage { - parent.selectedImage = uiImage - } - - parent.presentationMode.wrappedValue.dismiss() - } - } - - func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIImagePickerController { - let picker = UIImagePickerController() - picker.delegate = context.coordinator - return picker - } - - func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext) { - // update function implementation - } - - func makeCoordinator() -> Coordinator { - Coordinator(self) - } -} -``` - -You can then use `ImagePicker` in your SwiftUI views like this: - -```swift -struct ContentView: View { - @State private var isShowingImagePicker = false - @State private var selectedImage: UIImage? - - var body: some View { - VStack { - Button(action: { - isShowingImagePicker = true - }) { - Text("Open Image Picker") - } - - selectedImage.map { Image(uiImage: $0).resizable().scaledToFit() } - } - .sheet(isPresented: $isShowingImagePicker) { - ImagePicker(selectedImage: $selectedImage) - } - } -} -``` - -In this example, when you press the "Open Image Picker" button, it opens up an -image picker. Once an image is selected, it is displayed on the screen. - ---- - -Does SwiftUI render to UIKit on mobile and AppKit on desktop? - ---- - -In essence, yes. SwiftUI operates at a higher level of abstraction than UIKit or -AppKit. When you define interfaces in SwiftUI, you describe them in a -platform-agnostic way, but when those interfaces are rendered on a particular -platform, SwiftUI uses the native rendering engine of that platform. - -On iOS and iPadOS, SwiftUI uses UIKit (more specifically, underlying -technologies like Core Animation and Core Graphics) for rendering. On macOS, -SwiftUI uses AppKit. Similarly, on watchOS, it uses WatchKit, and on tvOS, it -uses TVUIKit. - -However, it's important to note that SwiftUI doesn't directly convert your -SwiftUI views into UIKit or AppKit components. Instead, SwiftUI works directly -with the underlying rendering and layout engines to create UIs that match the -capabilities and conventions of each platform. - -This means, for instance, that a SwiftUI `Button` does not become a `UIButton` -on iOS or a `NSButton` on macOS. It remains a SwiftUI `Button`, but it is drawn -and behaves appropriately for the platform it's running on, thanks to the -rendering done by SwiftUI using the native technologies. - ---- - -A vanilla SwiftUI `Button` (rendered on iOS) and a vanilla `UIButton` won't look -the same, will they (without additional styling)? - ---- - -Without additional styling, a SwiftUI `Button` and a UIKit `UIButton` will look -different. By default, SwiftUI `Button` on iOS has a plain text look, without -the rounded-rect border that a UIButton has in its default state. - -Here's an example: - -SwiftUI `Button`: - -```swift -Button("Hello SwiftUI") { - print("Button tapped!") -} -``` - -UIKit `UIButton`: - -```swift -let button = UIButton(type: .system) -button.setTitle("Hello UIKit", for: .normal) -button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) -``` - -The SwiftUI `Button` will show just the text "Hello SwiftUI", whereas the UIKit -`UIButton` will show the text "Hello UIKit" inside a rounded-rect border. - -This difference is part of SwiftUI's design. In SwiftUI, a `Button` is a role, -not a specific look or behavior. The look and behavior of a SwiftUI `Button` are -determined by the context in which the button is used, and you can easily -customize the button's appearance using modifiers. - -That said, it's also worth noting that the look of UI elements can be affected -by many factors, including iOS version, device settings, and app-specific -settings. The details I've provided are typical, but there might be cases where -SwiftUI `Button` and UIKit `UIButton` look similar or even identical. From e8395855acf5d38a0e5987475900f4eeb1eee313 Mon Sep 17 00:00:00 2001 From: owenthcarey Date: Mon, 19 Aug 2024 15:55:11 -0700 Subject: [PATCH 46/66] feat: update README --- README.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6a6dc0b..d6e576a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,74 @@ -This project leverages two different tools to integrate Python into mobile applications: +# PythonNative -1. Rubicon for iOS -2. Chaquopy for Android +**PythonNative** is a cross-platform toolkit that allows you to create native Android and iOS apps using Python. Inspired by frameworks like React Native and NativeScript, PythonNative provides a Pythonic interface for building native UI elements, handling lifecycle events, and accessing platform-specific APIs. + +## Features + +- **Native UI Components**: Create and manage native buttons, labels, lists, and more, all from Python. +- **Cross-Platform**: Write once, run on both Android and iOS. +- **Lifecycle Management**: Handle app lifecycle events with ease. +- **Native API Access**: Access device features like Camera, Geolocation, and Notifications. +- **Powered by Proven Tools**: PythonNative integrates seamlessly with [Rubicon](https://beeware.org/project/projects/bridges/rubicon/) for iOS and [Chaquopy](https://chaquo.com/chaquopy/) for Android, ensuring robust native performance. + +## Quick Start + +### Installation + +First, install PythonNative via pip: + +```bash +pip install pythonnative +``` + +### Create Your First App + +Initialize a new PythonNative app: + +```bash +pn init my_app +``` + +Your app directory will look like this: + +```text +my_app/ +├── README.md +├── app +│ ├── __init__.py +│ ├── main_page.py +│ └── resources +├── pythonnative.json +├── requirements.txt +└── tests +``` + +### Writing Views + +In PythonNative, everything is a view. Here's a simple example of how to create a main page with a list view: + +```python +import pythonnative as pn + +class MainPage(pn.Page): + def __init__(self, native_instance): + super().__init__(native_instance) + + def on_create(self): + super().on_create() + stack_view = pn.StackView(self.native_instance) + list_data = ["item_{}".format(i) for i in range(100)] + list_view = pn.ListView(self.native_instance, list_data) + stack_view.add_view(list_view) + self.set_root_view(stack_view) +``` + +### Run the app + +```bash +pn run android +pn run ios +``` + +## Documentation + +For detailed guides and API references, visit the [PythonNative documentation](https://pythonnative.com/docs/introduction). From f61cb85301c7bff57299b4c814319e9262f0f5ef Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Thu, 4 Sep 2025 19:32:18 -0700 Subject: [PATCH 47/66] docs(repo): add CONTRIBUTING.md --- CONTRIBUTING.md | 256 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..97e60e0 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,256 @@ +### Contributing to PythonNative + +Thanks for your interest in contributing. This repository contains the PythonNative library, CLI, templates, a demo app, and a Django site used for docs/demo hosting and E2E. Contributions should keep the code reliable, cross‑platform, and easy to use. + +## Quick start + +Development uses Python ≥ 3.9. + +```bash +# create and activate a venv (recommended) +python3 -m venv .venv && source .venv/bin/activate + +# install root tooling (lint/format/test) +pip install -r requirements.txt + +# install library (editable) and CLI +pip install -e libs/pythonnative + +# run tests +pytest -q + +# format and lint +black libs apps tests || true +ruff check . +``` + +Common library and CLI entry points: + +```bash +# CLI help +pn --help + +# create a new sample app (template fetch is remote) +pn init my_app + +# run a local demo app skeleton +cd apps/pythonnative_demo && pn run android +``` + +## Project layout (high‑level) + +- `libs/pythonnative/` – installable library and CLI + - `pythonnative/` – core cross‑platform UI components and utilities + - `cli/` – `pn` command + - `tests/` – unit tests for the library +- `libs/templates/` – Android/iOS project templates and zips +- `apps/` – application projects + - `django_pythonnative/` – Django project for docs/demo hosting and E2E + - `experiments/` – platform experiments (Android/iOS/Briefcase) + - `pythonnative_demo/` – minimal demo app using the library +- `README.md`, `requirements.txt` – repo docs and dev tooling + +## Coding guidelines + +- Style: Black; lint: Ruff; typing where useful. Keep APIs stable. +- Prefer explicit, descriptive names; keep platform abstractions clean. +- Add/extend tests under `libs/pythonnative/tests/` for new behavior. +- Do not commit generated artifacts or large binaries; templates live under `libs/templates/`. + +Common commands: + +```bash +pytest -q # run tests +ruff check . # lint +black libs apps # format +``` + +## Conventional Commits + +This project uses Conventional Commits. Use the form: + +``` +(): + +[optional body] + +[optional footer(s)] +``` + +### Commit message character set + +- Encoding: UTF‑8 is allowed and preferred across subjects and bodies. +- Keep the subject ≤ 72 chars; avoid emoji. + +Accepted types (standard): + +- `build` – build system or external dependencies (e.g., requirements, packaging) +- `chore` – maintenance (no library behavior change) +- `ci` – continuous integration configuration (workflows, pipelines) +- `docs` – documentation only +- `feat` – user‑facing feature or capability +- `fix` – bug fix +- `perf` – performance improvements +- `refactor` – code change that neither fixes a bug nor adds a feature +- `revert` – revert of a previous commit +- `style` – formatting/whitespace (no code behavior) +- `test` – add/adjust tests only + +Recommended scopes (match the smallest accurate directory/module): + +- Library/CLI scopes: + - `cli` – `libs/pythonnative/cli/` (the `pn` command) + - `core` – `libs/pythonnative/pythonnative/` package internals + - `components` – UI view modules under `libs/pythonnative/pythonnative/` (e.g., `button.py`, `label.py`) + - `utils` – utilities like `utils.py` + - `tests` – `libs/pythonnative/tests/` + +- Templates and examples: + - `templates` – `libs/templates/` (Android/iOS templates, zips) + - `demo` – `apps/pythonnative_demo/` + - `experiments` – `apps/experiments/` + +- Django app and site: + - `django` – `apps/django_pythonnative/` (site, docs pages, E2E harness) + +- Repo‑level and ops: + - `deps` – dependency updates and version pins + - `docker` – containerization files (e.g., `Dockerfile`) + - `repo` – top‑level files (`README.md`, `CONTRIBUTING.md`, `.gitignore`, licenses) + - `workflows` – CI pipelines (e.g., `.github/workflows/`) + +Note: Avoid redundant type==scope pairs (e.g., `docs(docs)`). Prefer a module scope (e.g., `docs(core)`) or `docs(repo)` for top‑level updates. + +Examples: + +```text +build(deps): refresh pinned versions +chore(repo): add contributing guidelines +ci(workflows): add publish job +docs(core): clarify ListView data contract +feat(components): add MaterialSearchBar +fix(cli): handle missing Android SDK gracefully +perf(core): reduce allocations in list diffing +refactor(utils): extract path helpers +test(tests): cover ios template copy flow +``` + +Examples (no scope): + +```text +build: update packaging metadata +chore: update .gitignore patterns +docs: add project overview +``` + +Breaking changes: + +- Use `!` after the type/scope or a `BREAKING CHANGE:` footer. + +```text +feat(core)!: rename Page.set_root_view to set_root + +BREAKING CHANGE: API renamed; update app code and templates. +``` + +### Multiple scopes (optional) + +- Comma‑separate scopes without spaces: `type(scope1,scope2): ...` +- Prefer a single scope when possible; use multiple only when the change genuinely spans tightly related areas. + +Example: + +```text +feat(templates,cli): add ios template and wire pn init +``` + +## Pull requests and squash merges + +- PR title: use Conventional Commit format. + - Example: `feat(cli): add init subcommand` + - Imperative mood; no trailing period; ≤ 72 chars; `!` for breaking changes. +- PR description: include brief sections: What, Why, How (brief), Testing, Risks/Impact, Docs/Follow‑ups. + - Link issues with keywords (e.g., `Closes #123`). +- Merging: prefer “Squash and merge” with “Pull request title and description”. +- Keep PRs focused; avoid unrelated changes in the same PR. + +Recommended PR template: + +```text +What +- Short summary of the change + +Why +- Motivation/user value + +How (brief) +- Key implementation notes or decisions + +Testing +- Local/CI coverage; links to tests if relevant + +Risks/Impact +- Compat, rollout, perf, security; mitigations + +Docs/Follow-ups +- Docs updated or TODO next steps + +Closes #123 +BREAKING CHANGE:

+Co-authored-by: Name +``` + +## Pull request checklist + +- Tests: added/updated; `pytest` passes. +- Lint/format: `ruff check .`, `black` pass. +- Docs: update `README.md` and any Django docs pages if behavior changes. +- Templates: update `libs/templates/` if generator output changes. +- No generated artifacts committed. + +## Versioning and releases + +- The library version is tracked in `libs/pythonnative/setup.py`. Use SemVer. +- Workflow: + - Contributors: branch off `main` (or `dev` if used) and open PRs. + - Maintainer (release): bump version, tag, and publish to PyPI. + - Tag on `main`: `git tag -a vX.Y.Z -m "Release vX.Y.Z" && git push --tags`. + +### Branch naming (suggested) + +- Use lowercase kebab‑case; concise (≤ 40 chars). +- Prefix conventions: + - `feature/-` + - `fix/-` + - `chore/` + - `docs/` + - `ci/` + - `refactor/-` + - `test/` + - `perf/` + - `build/` + - `release/vX.Y.Z` + - `hotfix/` + +Examples: + +```text +feature/cli-init +fix/core-threading-deadlock-123 +docs/contributing +ci/publish-pypi +build/lock-versions +refactor/utils-paths +test/templates-android +release/v0.2.0 +hotfix/cli-regression +``` + +## Security and provenance + +- Avoid bundling secrets or credentials in templates or code. +- Prefer runtime configuration via environment variables for Django and CI. + +## License + +By contributing, you agree that your contributions are licensed under the repository’s MIT License. From f273922e8a0494df7ba2cd59a3ad2ef54f918d3e Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Sat, 4 Oct 2025 11:54:58 -0700 Subject: [PATCH 48/66] feat(repo,mkdocs,workflows): migrate to src layout; add pyproject and docs scaffold --- .github/workflows/ci.yml | 48 +++++++++ .github/workflows/docs.yml | 29 +++++ .github/workflows/release.yml | 31 ++++++ CONTRIBUTING.md | 41 ++++---- libs/pythonnative/LICENSE => LICENSE | 4 +- README.md | 2 +- docs/api/pythonnative.md | 3 + docs/concepts/components.md | 3 + docs/examples.md | 3 + docs/examples/hello-world.md | 3 + docs/getting-started.md | 10 ++ docs/guides/android.md | 3 + docs/guides/ios.md | 3 + docs/index.md | 3 + docs/meta/contributing.md | 3 + docs/styles/brand.css | 11 ++ .../android_pythonnative_3/.gitignore | 0 .../android_pythonnative_3/app/.gitignore | 0 .../android_pythonnative_3/app/build.gradle | 0 .../app/proguard-rules.pro | 0 .../pythonnative/ExampleInstrumentedTest.kt | 0 .../app/src/main/AndroidManifest.xml | 0 .../pythonnative/pythonnative/MainActivity.kt | 0 .../pythonnative/SecondActivity.kt | 0 .../app/src/main/python/app/__init__.py | 0 .../app/src/main/python/app/main.py | 0 .../app/src/main/python/app/main_2.py | 0 .../app/src/main/python/app/main_3.py | 0 .../app/src/main/python/app/second_page.py | 0 .../app/src/main/python/create_button.py | 0 .../main/python/create_constraint_layout.py | 0 .../app/src/main/python/create_pn_layout.py | 0 .../src/main/python/create_recycler_view.py | 0 .../app/src/main/python/create_widgets.py | 0 .../app/src/main/python/plot.py | 0 .../app/src/main/python/ui_layout.py | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../src/main/res/layout/activity_second.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin .../res/mipmap-hdpi/ic_launcher_round.webp | Bin .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin .../res/mipmap-mdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin .../app/src/main/res/values-night/themes.xml | 0 .../app/src/main/res/values/colors.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/themes.xml | 0 .../app/src/main/res/xml/backup_rules.xml | 0 .../main/res/xml/data_extraction_rules.xml | 0 .../pythonnative/ExampleUnitTest.kt | 0 .../android_pythonnative_3/build.gradle | 0 .../android_pythonnative_3/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../android_pythonnative_3/gradlew | 0 .../android_pythonnative_3/gradlew.bat | 0 .../android_pythonnative_3/settings.gradle | 0 .../beeware_pythonnative/.gitignore | 0 .../beeware_pythonnative/CHANGELOG | 0 .../beeware_pythonnative/LICENSE | 0 .../beeware_pythonnative/README.rst | 0 .../beeware_pythonnative/pyproject.toml | 0 .../src/beeware_pythonnative/__init__.py | 0 .../src/beeware_pythonnative/__main__.py | 0 .../src/beeware_pythonnative/app.py | 0 .../resources/__init__.py | 0 .../resources/beeware_pythonnative.icns | Bin .../resources/beeware_pythonnative.ico | Bin .../resources/beeware_pythonnative.png | Bin .../beeware_pythonnative/tests/__init__.py | 0 .../tests/beeware_pythonnative.py | 0 .../beeware_pythonnative/tests/test_app.py | 0 .../metadata_generators/__init__.py | 0 .../android_metadata_generator.py | 0 .../ios_metadata_generator.py | 0 .../rubicon_tests/__init__.py | 0 .../rubicon_tests/rubicon_java_tests.py | 0 .../rubicon_tests/rubicon_objc_test.py | 0 .../ui_elements/__init__.py | 0 .../ui_elements/android_ui_elements.py | 0 .../ui_elements/ios_ui_elements.py | 0 libs/pythonnative/.gitignore | 0 libs/pythonnative/README.md | 33 ------ libs/pythonnative/install_locally.sh | 4 - libs/pythonnative/publish_to_pypi.sh | 12 --- libs/pythonnative/setup.py | 28 ----- libs/pythonnative/tests/__init__.py | 0 libs/pythonnative/tests/test_pythonnative.py | 0 mkdocs.yml | 43 ++++++++ mypy.ini | 9 ++ pyproject.toml | 79 ++++++++++++++ pytest.ini | 2 + requirements.txt | 99 ------------------ .../pythonnative/__init__.py | 0 .../pythonnative/activity_indicator_view.py | 0 .../pythonnative/bottom_navigation_view.py | 0 .../pythonnative/button.py | 0 {libs => src}/pythonnative/cli/__init__.py | 0 {libs => src}/pythonnative/cli/pn.py | 0 .../pythonnative/collection_view.py | 0 .../pythonnative/date_picker.py | 0 .../pythonnative/image_view.py | 0 .../pythonnative/label.py | 0 .../pythonnative/list_view.py | 0 .../material_activity_inidicator_view.py | 0 .../pythonnative/material_button.py | 0 .../pythonnative/material_date_picker.py | 0 .../pythonnative/material_progress_view.py | 0 .../pythonnative/material_search_bar.py | 0 .../pythonnative/material_switch.py | 0 .../pythonnative/material_time_picker.py | 0 .../pythonnative => src}/pythonnative/page.py | 0 .../pythonnative/picker_view.py | 0 .../pythonnative/progress_view.py | 0 .../pythonnative/scroll_view.py | 0 .../pythonnative/search_bar.py | 0 .../pythonnative/stack_view.py | 0 .../pythonnative/switch.py | 0 .../pythonnative/text_field.py | 0 .../pythonnative/text_view.py | 0 .../pythonnative/time_picker.py | 0 .../pythonnative/top_navigation_view.py | 0 .../pythonnative/utils.py | 0 .../pythonnative => src}/pythonnative/view.py | 0 .../pythonnative/web_view.py | 0 .../android_template/.gitignore | 0 .../android_template/app/.gitignore | 0 .../android_template/app/build.gradle | 0 .../android_template/app/proguard-rules.pro | 0 .../ExampleInstrumentedTest.kt | 0 .../app/src/main/AndroidManifest.xml | 0 .../android_template/MainActivity.kt | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin .../res/mipmap-hdpi/ic_launcher_round.webp | Bin .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin .../res/mipmap-mdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin .../app/src/main/res/values-night/themes.xml | 0 .../app/src/main/res/values/colors.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/themes.xml | 0 .../app/src/main/res/xml/backup_rules.xml | 0 .../main/res/xml/data_extraction_rules.xml | 0 .../android_template/ExampleUnitTest.kt | 0 .../android_template/build.gradle | 0 .../android_template/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../android_template/gradlew | 0 .../android_template/gradlew.bat | 0 .../android_template/settings.gradle | 0 .../ios_template/.gitignore | 0 .../ios_template.xcodeproj/project.pbxproj | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../ios_template/AppDelegate.swift | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../ios_template/Base.lproj/Main.storyboard | 0 .../ios_template/ios_template/Info.plist | 0 .../ios_template/SceneDelegate.swift | 0 .../ios_template/ViewController.swift | 0 .../ios_templateTests/ios_templateTests.swift | 0 .../ios_templateUITests.swift | 0 .../ios_templateUITestsLaunchTests.swift | 0 {libs/templates => templates}/zip_android.sh | 0 {libs/templates => templates}/zip_ios.sh | 0 tests/test_smoke.py | 2 + 188 files changed, 312 insertions(+), 199 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/release.yml rename libs/pythonnative/LICENSE => LICENSE (95%) create mode 100644 docs/api/pythonnative.md create mode 100644 docs/concepts/components.md create mode 100644 docs/examples.md create mode 100644 docs/examples/hello-world.md create mode 100644 docs/getting-started.md create mode 100644 docs/guides/android.md create mode 100644 docs/guides/ios.md create mode 100644 docs/index.md create mode 100644 docs/meta/contributing.md create mode 100644 docs/styles/brand.css rename {apps/experiments => experiments}/android_pythonnative_3/.gitignore (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/.gitignore (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/build.gradle (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/proguard-rules.pro (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/AndroidManifest.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/app/__init__.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/app/main.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/app/main_2.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/app/main_3.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/app/second_page.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/create_button.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/create_constraint_layout.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/create_pn_layout.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/create_recycler_view.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/create_widgets.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/plot.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/python/ui_layout.py (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/layout/activity_main.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/layout/activity_second.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/values-night/themes.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/values/colors.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/values/strings.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/values/themes.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml (100%) rename {apps/experiments => experiments}/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt (100%) rename {apps/experiments => experiments}/android_pythonnative_3/build.gradle (100%) rename {apps/experiments => experiments}/android_pythonnative_3/gradle.properties (100%) rename {apps/experiments => experiments}/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar (100%) rename {apps/experiments => experiments}/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties (100%) rename {apps/experiments => experiments}/android_pythonnative_3/gradlew (100%) rename {apps/experiments => experiments}/android_pythonnative_3/gradlew.bat (100%) rename {apps/experiments => experiments}/android_pythonnative_3/settings.gradle (100%) rename {apps/experiments => experiments}/beeware_pythonnative/.gitignore (100%) rename {apps/experiments => experiments}/beeware_pythonnative/CHANGELOG (100%) rename {apps/experiments => experiments}/beeware_pythonnative/LICENSE (100%) rename {apps/experiments => experiments}/beeware_pythonnative/README.rst (100%) rename {apps/experiments => experiments}/beeware_pythonnative/pyproject.toml (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/__init__.py (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/__main__.py (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/app.py (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico (100%) rename {apps/experiments => experiments}/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png (100%) rename {apps/experiments => experiments}/beeware_pythonnative/tests/__init__.py (100%) rename {apps/experiments => experiments}/beeware_pythonnative/tests/beeware_pythonnative.py (100%) rename {apps/experiments => experiments}/beeware_pythonnative/tests/test_app.py (100%) rename {libs/experiments => experiments}/metadata_generators/__init__.py (100%) rename {libs/experiments => experiments}/metadata_generators/android_metadata_generator.py (100%) rename {libs/experiments => experiments}/metadata_generators/ios_metadata_generator.py (100%) rename {libs/experiments => experiments}/rubicon_tests/__init__.py (100%) rename {libs/experiments => experiments}/rubicon_tests/rubicon_java_tests.py (100%) rename {libs/experiments => experiments}/rubicon_tests/rubicon_objc_test.py (100%) rename {libs/experiments => experiments}/ui_elements/__init__.py (100%) rename {libs/experiments => experiments}/ui_elements/android_ui_elements.py (100%) rename {libs/experiments => experiments}/ui_elements/ios_ui_elements.py (100%) delete mode 100644 libs/pythonnative/.gitignore delete mode 100644 libs/pythonnative/README.md delete mode 100644 libs/pythonnative/install_locally.sh delete mode 100644 libs/pythonnative/publish_to_pypi.sh delete mode 100644 libs/pythonnative/setup.py delete mode 100644 libs/pythonnative/tests/__init__.py delete mode 100644 libs/pythonnative/tests/test_pythonnative.py create mode 100644 mkdocs.yml create mode 100644 mypy.ini create mode 100644 pyproject.toml create mode 100644 pytest.ini delete mode 100644 requirements.txt rename {libs/pythonnative => src}/pythonnative/__init__.py (100%) rename {libs/pythonnative => src}/pythonnative/activity_indicator_view.py (100%) rename {libs/pythonnative => src}/pythonnative/bottom_navigation_view.py (100%) rename {libs/pythonnative => src}/pythonnative/button.py (100%) rename {libs => src}/pythonnative/cli/__init__.py (100%) rename {libs => src}/pythonnative/cli/pn.py (100%) rename {libs/pythonnative => src}/pythonnative/collection_view.py (100%) rename {libs/pythonnative => src}/pythonnative/date_picker.py (100%) rename {libs/pythonnative => src}/pythonnative/image_view.py (100%) rename {libs/pythonnative => src}/pythonnative/label.py (100%) rename {libs/pythonnative => src}/pythonnative/list_view.py (100%) rename {libs/pythonnative => src}/pythonnative/material_activity_inidicator_view.py (100%) rename {libs/pythonnative => src}/pythonnative/material_button.py (100%) rename {libs/pythonnative => src}/pythonnative/material_date_picker.py (100%) rename {libs/pythonnative => src}/pythonnative/material_progress_view.py (100%) rename {libs/pythonnative => src}/pythonnative/material_search_bar.py (100%) rename {libs/pythonnative => src}/pythonnative/material_switch.py (100%) rename {libs/pythonnative => src}/pythonnative/material_time_picker.py (100%) rename {libs/pythonnative => src}/pythonnative/page.py (100%) rename {libs/pythonnative => src}/pythonnative/picker_view.py (100%) rename {libs/pythonnative => src}/pythonnative/progress_view.py (100%) rename {libs/pythonnative => src}/pythonnative/scroll_view.py (100%) rename {libs/pythonnative => src}/pythonnative/search_bar.py (100%) rename {libs/pythonnative => src}/pythonnative/stack_view.py (100%) rename {libs/pythonnative => src}/pythonnative/switch.py (100%) rename {libs/pythonnative => src}/pythonnative/text_field.py (100%) rename {libs/pythonnative => src}/pythonnative/text_view.py (100%) rename {libs/pythonnative => src}/pythonnative/time_picker.py (100%) rename {libs/pythonnative => src}/pythonnative/top_navigation_view.py (100%) rename {libs/pythonnative => src}/pythonnative/utils.py (100%) rename {libs/pythonnative => src}/pythonnative/view.py (100%) rename {libs/pythonnative => src}/pythonnative/web_view.py (100%) rename {libs/templates => templates}/android_template/.gitignore (100%) rename {libs/templates => templates}/android_template/app/.gitignore (100%) rename {libs/templates => templates}/android_template/app/build.gradle (100%) rename {libs/templates => templates}/android_template/app/proguard-rules.pro (100%) rename {libs/templates => templates}/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt (100%) rename {libs/templates => templates}/android_template/app/src/main/AndroidManifest.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt (100%) rename {libs/templates => templates}/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/layout/activity_main.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp (100%) rename {libs/templates => templates}/android_template/app/src/main/res/values-night/themes.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/values/colors.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/values/strings.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/values/themes.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/xml/backup_rules.xml (100%) rename {libs/templates => templates}/android_template/app/src/main/res/xml/data_extraction_rules.xml (100%) rename {libs/templates => templates}/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt (100%) rename {libs/templates => templates}/android_template/build.gradle (100%) rename {libs/templates => templates}/android_template/gradle.properties (100%) rename {libs/templates => templates}/android_template/gradle/wrapper/gradle-wrapper.jar (100%) rename {libs/templates => templates}/android_template/gradle/wrapper/gradle-wrapper.properties (100%) rename {libs/templates => templates}/android_template/gradlew (100%) rename {libs/templates => templates}/android_template/gradlew.bat (100%) rename {libs/templates => templates}/android_template/settings.gradle (100%) rename {libs/templates => templates}/ios_template/.gitignore (100%) rename {libs/templates => templates}/ios_template/ios_template.xcodeproj/project.pbxproj (100%) rename {libs/templates => templates}/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {libs/templates => templates}/ios_template/ios_template/AppDelegate.swift (100%) rename {libs/templates => templates}/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {libs/templates => templates}/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {libs/templates => templates}/ios_template/ios_template/Assets.xcassets/Contents.json (100%) rename {libs/templates => templates}/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard (100%) rename {libs/templates => templates}/ios_template/ios_template/Base.lproj/Main.storyboard (100%) rename {libs/templates => templates}/ios_template/ios_template/Info.plist (100%) rename {libs/templates => templates}/ios_template/ios_template/SceneDelegate.swift (100%) rename {libs/templates => templates}/ios_template/ios_template/ViewController.swift (100%) rename {libs/templates => templates}/ios_template/ios_templateTests/ios_templateTests.swift (100%) rename {libs/templates => templates}/ios_template/ios_templateUITests/ios_templateUITests.swift (100%) rename {libs/templates => templates}/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift (100%) rename {libs/templates => templates}/zip_android.sh (100%) rename {libs/templates => templates}/zip_ios.sh (100%) create mode 100644 tests/test_smoke.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..1a13307 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,48 @@ +name: CI + +on: + push: + branches: [ '**' ] + pull_request: + branches: [ '**' ] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.9', '3.10', '3.11'] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install tools + run: | + python -m pip install --upgrade pip + pip install -e ".[ci]" + + - name: Lint (Ruff) + run: | + ruff check . + + - name: Format check (Black) + run: | + black --check . + + - name: Type check (MyPy) + run: | + mypy --install-types --non-interactive + + - name: Install package + run: | + pip install . + + - name: Run tests + run: | + pytest -q diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..f1423ad --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,29 @@ +name: Docs + +on: + push: + branches: [ main ] + +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Install docs deps + run: | + python -m pip install --upgrade pip + pip install -e ".[docs]" + - name: Build site + run: | + python -m mkdocs build --strict + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..07450cc --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,31 @@ +name: Release to PyPI + +on: + push: + tags: + - 'v*.*.*' + +jobs: + build-and-publish: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.9' + + - name: Build sdist and wheel + run: | + python -m pip install -U pip build + python -m build + + - name: Publish package to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + skip-existing: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 97e60e0..eb3d2d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,17 +10,17 @@ Development uses Python ≥ 3.9. # create and activate a venv (recommended) python3 -m venv .venv && source .venv/bin/activate -# install root tooling (lint/format/test) -pip install -r requirements.txt +# install dev tools (lint/format/test) +pip install -e ".[dev]" # install library (editable) and CLI -pip install -e libs/pythonnative +pip install -e . # run tests pytest -q # format and lint -black libs apps tests || true +black src apps tests || true ruff check . ``` @@ -39,30 +39,30 @@ cd apps/pythonnative_demo && pn run android ## Project layout (high‑level) -- `libs/pythonnative/` – installable library and CLI +- `src/pythonnative/` – installable library and CLI - `pythonnative/` – core cross‑platform UI components and utilities - `cli/` – `pn` command - - `tests/` – unit tests for the library -- `libs/templates/` – Android/iOS project templates and zips +- `tests/` – unit tests for the library +- `templates/` – Android/iOS project templates and zips - `apps/` – application projects - `django_pythonnative/` – Django project for docs/demo hosting and E2E - - `experiments/` – platform experiments (Android/iOS/Briefcase) - `pythonnative_demo/` – minimal demo app using the library -- `README.md`, `requirements.txt` – repo docs and dev tooling +- `experiments/` – platform experiments (Android/iOS/Briefcase) +- `README.md`, `pyproject.toml` – repo docs and packaging ## Coding guidelines - Style: Black; lint: Ruff; typing where useful. Keep APIs stable. - Prefer explicit, descriptive names; keep platform abstractions clean. -- Add/extend tests under `libs/pythonnative/tests/` for new behavior. -- Do not commit generated artifacts or large binaries; templates live under `libs/templates/`. +- Add/extend tests under `tests/` for new behavior. +- Do not commit generated artifacts or large binaries; templates live under `templates/`. Common commands: ```bash pytest -q # run tests ruff check . # lint -black libs apps # format +black src apps tests # format ``` ## Conventional Commits @@ -99,16 +99,16 @@ Accepted types (standard): Recommended scopes (match the smallest accurate directory/module): - Library/CLI scopes: - - `cli` – `libs/pythonnative/cli/` (the `pn` command) - - `core` – `libs/pythonnative/pythonnative/` package internals - - `components` – UI view modules under `libs/pythonnative/pythonnative/` (e.g., `button.py`, `label.py`) + - `cli` – `src/pythonnative/cli/` (the `pn` command) + - `core` – `src/pythonnative/pythonnative/` package internals + - `components` – UI view modules under `src/pythonnative/pythonnative/` (e.g., `button.py`, `label.py`) - `utils` – utilities like `utils.py` - - `tests` – `libs/pythonnative/tests/` + - `tests` – `tests/` - Templates and examples: - - `templates` – `libs/templates/` (Android/iOS templates, zips) + - `templates` – `templates/` (Android/iOS templates, zips) - `demo` – `apps/pythonnative_demo/` - - `experiments` – `apps/experiments/` + - `experiments` – `experiments/` - Django app and site: - `django` – `apps/django_pythonnative/` (site, docs pages, E2E harness) @@ -117,6 +117,7 @@ Recommended scopes (match the smallest accurate directory/module): - `deps` – dependency updates and version pins - `docker` – containerization files (e.g., `Dockerfile`) - `repo` – top‑level files (`README.md`, `CONTRIBUTING.md`, `.gitignore`, licenses) + - `mkdocs` – documentation site (MkDocs/Material) configuration and content under `docs/` - `workflows` – CI pipelines (e.g., `.github/workflows/`) Note: Avoid redundant type==scope pairs (e.g., `docs(docs)`). Prefer a module scope (e.g., `docs(core)`) or `docs(repo)` for top‑level updates. @@ -205,12 +206,12 @@ Co-authored-by: Name - Tests: added/updated; `pytest` passes. - Lint/format: `ruff check .`, `black` pass. - Docs: update `README.md` and any Django docs pages if behavior changes. -- Templates: update `libs/templates/` if generator output changes. +- Templates: update `templates/` if generator output changes. - No generated artifacts committed. ## Versioning and releases -- The library version is tracked in `libs/pythonnative/setup.py`. Use SemVer. +- The library version is tracked in `pyproject.toml` (`project.version`). Use SemVer. - Workflow: - Contributors: branch off `main` (or `dev` if used) and open PRs. - Maintainer (release): bump version, tag, and publish to PyPI. diff --git a/libs/pythonnative/LICENSE b/LICENSE similarity index 95% rename from libs/pythonnative/LICENSE rename to LICENSE index 783dd5e..18fff31 100644 --- a/libs/pythonnative/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 PythonNative +Copyright (c) 2025 PythonNative Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +THE SOFTWARE. diff --git a/README.md b/README.md index d6e576a..4418c1b 100644 --- a/README.md +++ b/README.md @@ -71,4 +71,4 @@ pn run ios ## Documentation -For detailed guides and API references, visit the [PythonNative documentation](https://pythonnative.com/docs/introduction). +For detailed guides and API references, visit the [PythonNative documentation](https://docs.pythonnative.com/). diff --git a/docs/api/pythonnative.md b/docs/api/pythonnative.md new file mode 100644 index 0000000..c472f3c --- /dev/null +++ b/docs/api/pythonnative.md @@ -0,0 +1,3 @@ +# pythonnative package + +API reference will be generated here via mkdocstrings. diff --git a/docs/concepts/components.md b/docs/concepts/components.md new file mode 100644 index 0000000..fdcd235 --- /dev/null +++ b/docs/concepts/components.md @@ -0,0 +1,3 @@ +# Components + +High-level overview of PythonNative components and how they map to native UI. diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 0000000..821ee4a --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,3 @@ +# Examples + +A collection of simple examples showing PythonNative components and patterns. diff --git a/docs/examples/hello-world.md b/docs/examples/hello-world.md new file mode 100644 index 0000000..c513a9b --- /dev/null +++ b/docs/examples/hello-world.md @@ -0,0 +1,3 @@ +# Hello World + +A minimal placeholder example. Replace with a real example later. diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..5227549 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,10 @@ +# Getting Started + +```bash +pip install pythonnative +pn --help +``` + +- Install: `pip install pythonnative` +- Create a project: `pn init my_app` +- Run: `pn run android` or `pn run ios` diff --git a/docs/guides/android.md b/docs/guides/android.md new file mode 100644 index 0000000..d632bef --- /dev/null +++ b/docs/guides/android.md @@ -0,0 +1,3 @@ +# Android Guide + +Basic steps to build and run an Android project generated by `pn`. diff --git a/docs/guides/ios.md b/docs/guides/ios.md new file mode 100644 index 0000000..5ff485d --- /dev/null +++ b/docs/guides/ios.md @@ -0,0 +1,3 @@ +# iOS Guide + +Basic steps to build and run an iOS project generated by `pn`. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..97b6b2b --- /dev/null +++ b/docs/index.md @@ -0,0 +1,3 @@ +# PythonNative + +Build native Android and iOS apps with Python. PythonNative provides a Pythonic API for native UI components and a simple CLI to scaffold and run projects. diff --git a/docs/meta/contributing.md b/docs/meta/contributing.md new file mode 100644 index 0000000..1189adb --- /dev/null +++ b/docs/meta/contributing.md @@ -0,0 +1,3 @@ +# Contributing + +See repository CONTRIBUTING.md for full guidelines. diff --git a/docs/styles/brand.css b/docs/styles/brand.css new file mode 100644 index 0000000..e9ca30e --- /dev/null +++ b/docs/styles/brand.css @@ -0,0 +1,11 @@ +:root{ + --md-primary-fg-color:#f9d253; + --md-primary-fg-color--light:#fbe18c; + --md-primary-fg-color--dark:#e6be3b; + --md-accent-fg-color:#85c0e0; + --md-accent-fg-color--transparent:rgba(133,192,224,.1); +} + +/* Hide the bottom footer bar entirely */ +.md-footer{display:none} +.md-main__inner{margin-bottom:2rem} diff --git a/apps/experiments/android_pythonnative_3/.gitignore b/experiments/android_pythonnative_3/.gitignore similarity index 100% rename from apps/experiments/android_pythonnative_3/.gitignore rename to experiments/android_pythonnative_3/.gitignore diff --git a/apps/experiments/android_pythonnative_3/app/.gitignore b/experiments/android_pythonnative_3/app/.gitignore similarity index 100% rename from apps/experiments/android_pythonnative_3/app/.gitignore rename to experiments/android_pythonnative_3/app/.gitignore diff --git a/apps/experiments/android_pythonnative_3/app/build.gradle b/experiments/android_pythonnative_3/app/build.gradle similarity index 100% rename from apps/experiments/android_pythonnative_3/app/build.gradle rename to experiments/android_pythonnative_3/app/build.gradle diff --git a/apps/experiments/android_pythonnative_3/app/proguard-rules.pro b/experiments/android_pythonnative_3/app/proguard-rules.pro similarity index 100% rename from apps/experiments/android_pythonnative_3/app/proguard-rules.pro rename to experiments/android_pythonnative_3/app/proguard-rules.pro diff --git a/apps/experiments/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt b/experiments/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt rename to experiments/android_pythonnative_3/app/src/androidTest/java/com/pythonnative/pythonnative/ExampleInstrumentedTest.kt diff --git a/apps/experiments/android_pythonnative_3/app/src/main/AndroidManifest.xml b/experiments/android_pythonnative_3/app/src/main/AndroidManifest.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/AndroidManifest.xml rename to experiments/android_pythonnative_3/app/src/main/AndroidManifest.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt b/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt rename to experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/MainActivity.kt diff --git a/apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt b/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt rename to experiments/android_pythonnative_3/app/src/main/java/com/pythonnative/pythonnative/SecondActivity.kt diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/app/__init__.py b/experiments/android_pythonnative_3/app/src/main/python/app/__init__.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/app/__init__.py rename to experiments/android_pythonnative_3/app/src/main/python/app/__init__.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/app/main.py b/experiments/android_pythonnative_3/app/src/main/python/app/main.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/app/main.py rename to experiments/android_pythonnative_3/app/src/main/python/app/main.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/app/main_2.py b/experiments/android_pythonnative_3/app/src/main/python/app/main_2.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/app/main_2.py rename to experiments/android_pythonnative_3/app/src/main/python/app/main_2.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/app/main_3.py b/experiments/android_pythonnative_3/app/src/main/python/app/main_3.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/app/main_3.py rename to experiments/android_pythonnative_3/app/src/main/python/app/main_3.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/app/second_page.py b/experiments/android_pythonnative_3/app/src/main/python/app/second_page.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/app/second_page.py rename to experiments/android_pythonnative_3/app/src/main/python/app/second_page.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/create_button.py b/experiments/android_pythonnative_3/app/src/main/python/create_button.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/create_button.py rename to experiments/android_pythonnative_3/app/src/main/python/create_button.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/create_constraint_layout.py b/experiments/android_pythonnative_3/app/src/main/python/create_constraint_layout.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/create_constraint_layout.py rename to experiments/android_pythonnative_3/app/src/main/python/create_constraint_layout.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/create_pn_layout.py b/experiments/android_pythonnative_3/app/src/main/python/create_pn_layout.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/create_pn_layout.py rename to experiments/android_pythonnative_3/app/src/main/python/create_pn_layout.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/create_recycler_view.py b/experiments/android_pythonnative_3/app/src/main/python/create_recycler_view.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/create_recycler_view.py rename to experiments/android_pythonnative_3/app/src/main/python/create_recycler_view.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/create_widgets.py b/experiments/android_pythonnative_3/app/src/main/python/create_widgets.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/create_widgets.py rename to experiments/android_pythonnative_3/app/src/main/python/create_widgets.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/plot.py b/experiments/android_pythonnative_3/app/src/main/python/plot.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/plot.py rename to experiments/android_pythonnative_3/app/src/main/python/plot.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/python/ui_layout.py b/experiments/android_pythonnative_3/app/src/main/python/ui_layout.py similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/python/ui_layout.py rename to experiments/android_pythonnative_3/app/src/main/python/ui_layout.py diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/experiments/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to experiments/android_pythonnative_3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml b/experiments/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml rename to experiments/android_pythonnative_3/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_main.xml b/experiments/android_pythonnative_3/app/src/main/res/layout/activity_main.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_main.xml rename to experiments/android_pythonnative_3/app/src/main/res/layout/activity_main.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_second.xml b/experiments/android_pythonnative_3/app/src/main/res/layout/activity_second.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/layout/activity_second.xml rename to experiments/android_pythonnative_3/app/src/main/res/layout/activity_second.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to experiments/android_pythonnative_3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/values-night/themes.xml b/experiments/android_pythonnative_3/app/src/main/res/values-night/themes.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/values-night/themes.xml rename to experiments/android_pythonnative_3/app/src/main/res/values-night/themes.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/values/colors.xml b/experiments/android_pythonnative_3/app/src/main/res/values/colors.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/values/colors.xml rename to experiments/android_pythonnative_3/app/src/main/res/values/colors.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/values/strings.xml b/experiments/android_pythonnative_3/app/src/main/res/values/strings.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/values/strings.xml rename to experiments/android_pythonnative_3/app/src/main/res/values/strings.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/values/themes.xml b/experiments/android_pythonnative_3/app/src/main/res/values/themes.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/values/themes.xml rename to experiments/android_pythonnative_3/app/src/main/res/values/themes.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml b/experiments/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml rename to experiments/android_pythonnative_3/app/src/main/res/xml/backup_rules.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml b/experiments/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml rename to experiments/android_pythonnative_3/app/src/main/res/xml/data_extraction_rules.xml diff --git a/apps/experiments/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt b/experiments/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt similarity index 100% rename from apps/experiments/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt rename to experiments/android_pythonnative_3/app/src/test/java/com/pythonnative/pythonnative/ExampleUnitTest.kt diff --git a/apps/experiments/android_pythonnative_3/build.gradle b/experiments/android_pythonnative_3/build.gradle similarity index 100% rename from apps/experiments/android_pythonnative_3/build.gradle rename to experiments/android_pythonnative_3/build.gradle diff --git a/apps/experiments/android_pythonnative_3/gradle.properties b/experiments/android_pythonnative_3/gradle.properties similarity index 100% rename from apps/experiments/android_pythonnative_3/gradle.properties rename to experiments/android_pythonnative_3/gradle.properties diff --git a/apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar b/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar rename to experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.jar diff --git a/apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties b/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from apps/experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties rename to experiments/android_pythonnative_3/gradle/wrapper/gradle-wrapper.properties diff --git a/apps/experiments/android_pythonnative_3/gradlew b/experiments/android_pythonnative_3/gradlew similarity index 100% rename from apps/experiments/android_pythonnative_3/gradlew rename to experiments/android_pythonnative_3/gradlew diff --git a/apps/experiments/android_pythonnative_3/gradlew.bat b/experiments/android_pythonnative_3/gradlew.bat similarity index 100% rename from apps/experiments/android_pythonnative_3/gradlew.bat rename to experiments/android_pythonnative_3/gradlew.bat diff --git a/apps/experiments/android_pythonnative_3/settings.gradle b/experiments/android_pythonnative_3/settings.gradle similarity index 100% rename from apps/experiments/android_pythonnative_3/settings.gradle rename to experiments/android_pythonnative_3/settings.gradle diff --git a/apps/experiments/beeware_pythonnative/.gitignore b/experiments/beeware_pythonnative/.gitignore similarity index 100% rename from apps/experiments/beeware_pythonnative/.gitignore rename to experiments/beeware_pythonnative/.gitignore diff --git a/apps/experiments/beeware_pythonnative/CHANGELOG b/experiments/beeware_pythonnative/CHANGELOG similarity index 100% rename from apps/experiments/beeware_pythonnative/CHANGELOG rename to experiments/beeware_pythonnative/CHANGELOG diff --git a/apps/experiments/beeware_pythonnative/LICENSE b/experiments/beeware_pythonnative/LICENSE similarity index 100% rename from apps/experiments/beeware_pythonnative/LICENSE rename to experiments/beeware_pythonnative/LICENSE diff --git a/apps/experiments/beeware_pythonnative/README.rst b/experiments/beeware_pythonnative/README.rst similarity index 100% rename from apps/experiments/beeware_pythonnative/README.rst rename to experiments/beeware_pythonnative/README.rst diff --git a/apps/experiments/beeware_pythonnative/pyproject.toml b/experiments/beeware_pythonnative/pyproject.toml similarity index 100% rename from apps/experiments/beeware_pythonnative/pyproject.toml rename to experiments/beeware_pythonnative/pyproject.toml diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py rename to experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py rename to experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py rename to experiments/beeware_pythonnative/src/beeware_pythonnative/app.py diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py rename to experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns rename to experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico rename to experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico diff --git a/apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png similarity index 100% rename from apps/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png rename to experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png diff --git a/apps/experiments/beeware_pythonnative/tests/__init__.py b/experiments/beeware_pythonnative/tests/__init__.py similarity index 100% rename from apps/experiments/beeware_pythonnative/tests/__init__.py rename to experiments/beeware_pythonnative/tests/__init__.py diff --git a/apps/experiments/beeware_pythonnative/tests/beeware_pythonnative.py b/experiments/beeware_pythonnative/tests/beeware_pythonnative.py similarity index 100% rename from apps/experiments/beeware_pythonnative/tests/beeware_pythonnative.py rename to experiments/beeware_pythonnative/tests/beeware_pythonnative.py diff --git a/apps/experiments/beeware_pythonnative/tests/test_app.py b/experiments/beeware_pythonnative/tests/test_app.py similarity index 100% rename from apps/experiments/beeware_pythonnative/tests/test_app.py rename to experiments/beeware_pythonnative/tests/test_app.py diff --git a/libs/experiments/metadata_generators/__init__.py b/experiments/metadata_generators/__init__.py similarity index 100% rename from libs/experiments/metadata_generators/__init__.py rename to experiments/metadata_generators/__init__.py diff --git a/libs/experiments/metadata_generators/android_metadata_generator.py b/experiments/metadata_generators/android_metadata_generator.py similarity index 100% rename from libs/experiments/metadata_generators/android_metadata_generator.py rename to experiments/metadata_generators/android_metadata_generator.py diff --git a/libs/experiments/metadata_generators/ios_metadata_generator.py b/experiments/metadata_generators/ios_metadata_generator.py similarity index 100% rename from libs/experiments/metadata_generators/ios_metadata_generator.py rename to experiments/metadata_generators/ios_metadata_generator.py diff --git a/libs/experiments/rubicon_tests/__init__.py b/experiments/rubicon_tests/__init__.py similarity index 100% rename from libs/experiments/rubicon_tests/__init__.py rename to experiments/rubicon_tests/__init__.py diff --git a/libs/experiments/rubicon_tests/rubicon_java_tests.py b/experiments/rubicon_tests/rubicon_java_tests.py similarity index 100% rename from libs/experiments/rubicon_tests/rubicon_java_tests.py rename to experiments/rubicon_tests/rubicon_java_tests.py diff --git a/libs/experiments/rubicon_tests/rubicon_objc_test.py b/experiments/rubicon_tests/rubicon_objc_test.py similarity index 100% rename from libs/experiments/rubicon_tests/rubicon_objc_test.py rename to experiments/rubicon_tests/rubicon_objc_test.py diff --git a/libs/experiments/ui_elements/__init__.py b/experiments/ui_elements/__init__.py similarity index 100% rename from libs/experiments/ui_elements/__init__.py rename to experiments/ui_elements/__init__.py diff --git a/libs/experiments/ui_elements/android_ui_elements.py b/experiments/ui_elements/android_ui_elements.py similarity index 100% rename from libs/experiments/ui_elements/android_ui_elements.py rename to experiments/ui_elements/android_ui_elements.py diff --git a/libs/experiments/ui_elements/ios_ui_elements.py b/experiments/ui_elements/ios_ui_elements.py similarity index 100% rename from libs/experiments/ui_elements/ios_ui_elements.py rename to experiments/ui_elements/ios_ui_elements.py diff --git a/libs/pythonnative/.gitignore b/libs/pythonnative/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/libs/pythonnative/README.md b/libs/pythonnative/README.md deleted file mode 100644 index 76bca32..0000000 --- a/libs/pythonnative/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# PythonNative - -PythonNative is a cross-platform Python tool kit for Android and iOS. It allows you to create native UI elements such as buttons and labels in a Pythonic way, regardless of whether you're running on iOS or Android. - -## Installation - -You can install PythonNative from PyPI: - -```bash -pip install pythonnative -``` - -Please note that PythonNative requires Python 3.6 or higher. - -## Usage - -Here's a simple example of how to create a button and a label: - -```python -import pythonnative as pn - -# Create a button -button = pn.Button("Click Me") -print(button.get_title()) # Outputs: Click Me - -# Create a label -label = pn.Label("Hello, World!") -print(label.get_text()) # Outputs: Hello, World! -``` - -## License - -PythonNative is licensed under the MIT License. See `LICENSE` for more information. diff --git a/libs/pythonnative/install_locally.sh b/libs/pythonnative/install_locally.sh deleted file mode 100644 index 4929699..0000000 --- a/libs/pythonnative/install_locally.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# Install the package in editable mode -pip install -e . diff --git a/libs/pythonnative/publish_to_pypi.sh b/libs/pythonnative/publish_to_pypi.sh deleted file mode 100644 index 899a21d..0000000 --- a/libs/pythonnative/publish_to_pypi.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Clean up old distribution, build directories, and egg-info -rm -rf dist/ -rm -rf build/ -rm -rf pythonnative.egg-info/ - -# Generate distribution archives -python setup.py sdist bdist_wheel - -# Upload the distribution archives to PyPi -twine upload dist/* diff --git a/libs/pythonnative/setup.py b/libs/pythonnative/setup.py deleted file mode 100644 index 7976cb3..0000000 --- a/libs/pythonnative/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name="pythonnative", - version="0.1.0", - author="Owen Carey", - author_email="pythonnative@gmail.com", - description="A cross-platform Python tool kit for Android and iOS", - long_description=open("README.md").read(), - long_description_content_type="text/markdown", - url="https://pythonnative.com", - packages=find_packages(), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - ], - python_requires=">=3.6", - install_requires=[ - "rubicon-objc>=0.4.6,<0.5.0", - # Add more requirements here as necessary - ], - entry_points={ - "console_scripts": [ - "pn=cli.pn:main", - ], - }, -) diff --git a/libs/pythonnative/tests/__init__.py b/libs/pythonnative/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/libs/pythonnative/tests/test_pythonnative.py b/libs/pythonnative/tests/test_pythonnative.py deleted file mode 100644 index e69de29..0000000 diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..cecbbf5 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,43 @@ +site_name: PythonNative +site_description: Cross-platform native UI toolkit for Android and iOS +site_url: https://docs.pythonnative.com/ +repo_url: https://github.com/pythonnative/pythonnative +theme: + name: material + features: + - navigation.sections + - navigation.instant + - navigation.tracking + - content.code.copy +extra: + generator: false +nav: + - Home: index.md + - Getting Started: getting-started.md + - Concepts: + - Components: concepts/components.md + - Examples: + - Overview: examples.md + - Hello World: examples/hello-world.md + - Guides: + - Android: guides/android.md + - iOS: guides/ios.md + - API Reference: + - Package: api/pythonnative.md + - Meta: + - Contributing: meta/contributing.md +plugins: + - search + - mkdocstrings: + handlers: + python: + options: + show_source: false + docstring_style: google +extra_css: + - styles/brand.css +markdown_extensions: + - admonition + - codehilite + - toc: + permalink: true diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..2be17e7 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,9 @@ +[mypy] +python_version = 3.9 +ignore_missing_imports = True +warn_redundant_casts = True +warn_unused_ignores = True +warn_return_any = False +strict_optional = False +pretty = True +files = src, tests diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..92ee621 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,79 @@ +[build-system] +requires = ["setuptools>=68", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "pythonnative" +version = "0.1.0" +description = "Cross-platform native UI toolkit for Android and iOS" +authors = [ + { name = "Owen Carey" } +] +readme = "README.md" +requires-python = ">=3.9" +license = { file = "LICENSE" } +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Environment :: Handhelds/PDA", + "Topic :: Software Development :: User Interfaces", +] +dependencies = [ + "requests>=2.31.0", +] + +[project.optional-dependencies] +ios = [ + "rubicon-objc>=0.4.6,<0.5.0", +] +docs = [ + "mkdocs>=1.5", + "mkdocs-material[imaging]>=9.5", + "mkdocstrings[python]>=0.24", +] +dev = [ + "black>=24.0", + "ruff>=0.5", + "mypy>=1.10", + "pytest>=8.0", +] +ci = [ + "black>=24.0", + "ruff>=0.5", + "mypy>=1.10", + "pytest>=8.0", +] + +[project.scripts] +pn = "pythonnative.cli.pn:main" + +[project.urls] +Homepage = "https://github.com/pythonnative/pythonnative" +Repository = "https://github.com/pythonnative/pythonnative" +Issues = "https://github.com/pythonnative/pythonnative/issues" +Documentation = "https://docs.pythonnative.com/" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools] +license-files = ["LICENSE*"] + +[tool.ruff] +target-version = "py39" +line-length = 120 + +[tool.ruff.lint] +select = ["E", "F", "I"] +ignore = [] + +[tool.black] +line-length = 120 +target-version = ['py39'] diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..91f0d1d --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = -q diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 89de162..0000000 --- a/requirements.txt +++ /dev/null @@ -1,99 +0,0 @@ -arrow==1.2.3 -asgiref==3.7.0 -binaryornot==0.4.4 -black==23.3.0 -bleach==6.0.0 -briefcase==0.3.14 -build==0.10.0 -cachetools==5.3.1 -certifi==2023.5.7 -chardet==5.1.0 -charset-normalizer==3.1.0 -clang==16.0.1.1 -click==8.1.3 -contourpy==1.0.7 -cookiecutter==2.1.1 -cycler==0.11.0 -Cython==0.29.35 -Django==4.2.1 -django-environ==0.10.0 -django-storages==1.13.2 -dmgbuild==1.6.1 -docutils==0.20.1 -ds-store==1.3.1 -exceptiongroup==1.1.1 -fonttools==4.39.4 -gitdb==4.0.10 -GitPython==3.1.31 -google-api-core==2.11.1 -google-auth==2.20.0 -google-cloud-core==2.3.2 -google-cloud-secret-manager==2.16.1 -google-cloud-storage==2.9.0 -google-crc32c==1.5.0 -google-resumable-media==2.5.0 -googleapis-common-protos==1.59.1 -grpc-google-iam-v1==0.12.6 -grpcio==1.56.0 -grpcio-status==1.56.0 -idna==3.4 -importlib-metadata==6.6.0 -importlib-resources==5.12.0 -iniconfig==2.0.0 -jaraco.classes==3.2.3 -Jinja2==3.1.2 -jinja2-time==0.2.0 -keyring==23.13.1 -kiwisolver==1.4.4 -mac-alias==2.2.2 -markdown-it-py==2.2.0 -MarkupSafe==2.1.2 -matplotlib==3.7.1 -mdurl==0.1.2 -more-itertools==9.1.0 -mypy-extensions==1.0.0 -numpy==1.24.3 -packaging==23.1 -pathspec==0.11.1 -Pillow==9.5.0 -pkginfo==1.9.6 -platformdirs==3.5.1 -pluggy==1.0.0 -proto-plus==1.22.3 -protobuf==4.23.3 -psutil==5.9.5 -psycopg2-binary==2.9.6 -pyasn1==0.5.0 -pyasn1-modules==0.3.0 -Pygments==2.15.1 -pyjnius==1.5.0 -pyparsing==3.0.9 -pyproject_hooks==1.0.0 -pytest==7.3.1 -python-dateutil==2.8.2 -python-slugify==8.0.1 --e git+https://github.com/owenthcarey/pythonnative-workspace.git@534a022b6ed6fd62884a940a307461e4e5dba442#egg=pythonnative&subdirectory=libs/pythonnative -PyYAML==6.0 -readme-renderer==37.3 -requests==2.31.0 -requests-toolbelt==1.0.0 -rfc3986==2.0.0 -rich==13.3.5 -rsa==4.9 -rubicon-java==0.2.6 -rubicon-objc==0.4.6 -six==1.16.0 -smmap==5.0.0 -sqlparse==0.4.4 -std-nslog==1.0.3 -text-unidecode==1.3 -toga-cocoa==0.3.1 -toga-core==0.3.1 -tomli==2.0.1 -tomli_w==1.0.0 -travertino==0.2.0 -twine==4.0.2 -typing_extensions==4.6.3 -urllib3==1.26.7 -webencodings==0.5.1 -zipp==3.15.0 diff --git a/libs/pythonnative/pythonnative/__init__.py b/src/pythonnative/__init__.py similarity index 100% rename from libs/pythonnative/pythonnative/__init__.py rename to src/pythonnative/__init__.py diff --git a/libs/pythonnative/pythonnative/activity_indicator_view.py b/src/pythonnative/activity_indicator_view.py similarity index 100% rename from libs/pythonnative/pythonnative/activity_indicator_view.py rename to src/pythonnative/activity_indicator_view.py diff --git a/libs/pythonnative/pythonnative/bottom_navigation_view.py b/src/pythonnative/bottom_navigation_view.py similarity index 100% rename from libs/pythonnative/pythonnative/bottom_navigation_view.py rename to src/pythonnative/bottom_navigation_view.py diff --git a/libs/pythonnative/pythonnative/button.py b/src/pythonnative/button.py similarity index 100% rename from libs/pythonnative/pythonnative/button.py rename to src/pythonnative/button.py diff --git a/libs/pythonnative/cli/__init__.py b/src/pythonnative/cli/__init__.py similarity index 100% rename from libs/pythonnative/cli/__init__.py rename to src/pythonnative/cli/__init__.py diff --git a/libs/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py similarity index 100% rename from libs/pythonnative/cli/pn.py rename to src/pythonnative/cli/pn.py diff --git a/libs/pythonnative/pythonnative/collection_view.py b/src/pythonnative/collection_view.py similarity index 100% rename from libs/pythonnative/pythonnative/collection_view.py rename to src/pythonnative/collection_view.py diff --git a/libs/pythonnative/pythonnative/date_picker.py b/src/pythonnative/date_picker.py similarity index 100% rename from libs/pythonnative/pythonnative/date_picker.py rename to src/pythonnative/date_picker.py diff --git a/libs/pythonnative/pythonnative/image_view.py b/src/pythonnative/image_view.py similarity index 100% rename from libs/pythonnative/pythonnative/image_view.py rename to src/pythonnative/image_view.py diff --git a/libs/pythonnative/pythonnative/label.py b/src/pythonnative/label.py similarity index 100% rename from libs/pythonnative/pythonnative/label.py rename to src/pythonnative/label.py diff --git a/libs/pythonnative/pythonnative/list_view.py b/src/pythonnative/list_view.py similarity index 100% rename from libs/pythonnative/pythonnative/list_view.py rename to src/pythonnative/list_view.py diff --git a/libs/pythonnative/pythonnative/material_activity_inidicator_view.py b/src/pythonnative/material_activity_inidicator_view.py similarity index 100% rename from libs/pythonnative/pythonnative/material_activity_inidicator_view.py rename to src/pythonnative/material_activity_inidicator_view.py diff --git a/libs/pythonnative/pythonnative/material_button.py b/src/pythonnative/material_button.py similarity index 100% rename from libs/pythonnative/pythonnative/material_button.py rename to src/pythonnative/material_button.py diff --git a/libs/pythonnative/pythonnative/material_date_picker.py b/src/pythonnative/material_date_picker.py similarity index 100% rename from libs/pythonnative/pythonnative/material_date_picker.py rename to src/pythonnative/material_date_picker.py diff --git a/libs/pythonnative/pythonnative/material_progress_view.py b/src/pythonnative/material_progress_view.py similarity index 100% rename from libs/pythonnative/pythonnative/material_progress_view.py rename to src/pythonnative/material_progress_view.py diff --git a/libs/pythonnative/pythonnative/material_search_bar.py b/src/pythonnative/material_search_bar.py similarity index 100% rename from libs/pythonnative/pythonnative/material_search_bar.py rename to src/pythonnative/material_search_bar.py diff --git a/libs/pythonnative/pythonnative/material_switch.py b/src/pythonnative/material_switch.py similarity index 100% rename from libs/pythonnative/pythonnative/material_switch.py rename to src/pythonnative/material_switch.py diff --git a/libs/pythonnative/pythonnative/material_time_picker.py b/src/pythonnative/material_time_picker.py similarity index 100% rename from libs/pythonnative/pythonnative/material_time_picker.py rename to src/pythonnative/material_time_picker.py diff --git a/libs/pythonnative/pythonnative/page.py b/src/pythonnative/page.py similarity index 100% rename from libs/pythonnative/pythonnative/page.py rename to src/pythonnative/page.py diff --git a/libs/pythonnative/pythonnative/picker_view.py b/src/pythonnative/picker_view.py similarity index 100% rename from libs/pythonnative/pythonnative/picker_view.py rename to src/pythonnative/picker_view.py diff --git a/libs/pythonnative/pythonnative/progress_view.py b/src/pythonnative/progress_view.py similarity index 100% rename from libs/pythonnative/pythonnative/progress_view.py rename to src/pythonnative/progress_view.py diff --git a/libs/pythonnative/pythonnative/scroll_view.py b/src/pythonnative/scroll_view.py similarity index 100% rename from libs/pythonnative/pythonnative/scroll_view.py rename to src/pythonnative/scroll_view.py diff --git a/libs/pythonnative/pythonnative/search_bar.py b/src/pythonnative/search_bar.py similarity index 100% rename from libs/pythonnative/pythonnative/search_bar.py rename to src/pythonnative/search_bar.py diff --git a/libs/pythonnative/pythonnative/stack_view.py b/src/pythonnative/stack_view.py similarity index 100% rename from libs/pythonnative/pythonnative/stack_view.py rename to src/pythonnative/stack_view.py diff --git a/libs/pythonnative/pythonnative/switch.py b/src/pythonnative/switch.py similarity index 100% rename from libs/pythonnative/pythonnative/switch.py rename to src/pythonnative/switch.py diff --git a/libs/pythonnative/pythonnative/text_field.py b/src/pythonnative/text_field.py similarity index 100% rename from libs/pythonnative/pythonnative/text_field.py rename to src/pythonnative/text_field.py diff --git a/libs/pythonnative/pythonnative/text_view.py b/src/pythonnative/text_view.py similarity index 100% rename from libs/pythonnative/pythonnative/text_view.py rename to src/pythonnative/text_view.py diff --git a/libs/pythonnative/pythonnative/time_picker.py b/src/pythonnative/time_picker.py similarity index 100% rename from libs/pythonnative/pythonnative/time_picker.py rename to src/pythonnative/time_picker.py diff --git a/libs/pythonnative/pythonnative/top_navigation_view.py b/src/pythonnative/top_navigation_view.py similarity index 100% rename from libs/pythonnative/pythonnative/top_navigation_view.py rename to src/pythonnative/top_navigation_view.py diff --git a/libs/pythonnative/pythonnative/utils.py b/src/pythonnative/utils.py similarity index 100% rename from libs/pythonnative/pythonnative/utils.py rename to src/pythonnative/utils.py diff --git a/libs/pythonnative/pythonnative/view.py b/src/pythonnative/view.py similarity index 100% rename from libs/pythonnative/pythonnative/view.py rename to src/pythonnative/view.py diff --git a/libs/pythonnative/pythonnative/web_view.py b/src/pythonnative/web_view.py similarity index 100% rename from libs/pythonnative/pythonnative/web_view.py rename to src/pythonnative/web_view.py diff --git a/libs/templates/android_template/.gitignore b/templates/android_template/.gitignore similarity index 100% rename from libs/templates/android_template/.gitignore rename to templates/android_template/.gitignore diff --git a/libs/templates/android_template/app/.gitignore b/templates/android_template/app/.gitignore similarity index 100% rename from libs/templates/android_template/app/.gitignore rename to templates/android_template/app/.gitignore diff --git a/libs/templates/android_template/app/build.gradle b/templates/android_template/app/build.gradle similarity index 100% rename from libs/templates/android_template/app/build.gradle rename to templates/android_template/app/build.gradle diff --git a/libs/templates/android_template/app/proguard-rules.pro b/templates/android_template/app/proguard-rules.pro similarity index 100% rename from libs/templates/android_template/app/proguard-rules.pro rename to templates/android_template/app/proguard-rules.pro diff --git a/libs/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt b/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt similarity index 100% rename from libs/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt rename to templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt diff --git a/libs/templates/android_template/app/src/main/AndroidManifest.xml b/templates/android_template/app/src/main/AndroidManifest.xml similarity index 100% rename from libs/templates/android_template/app/src/main/AndroidManifest.xml rename to templates/android_template/app/src/main/AndroidManifest.xml diff --git a/libs/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt b/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt similarity index 100% rename from libs/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt rename to templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt diff --git a/libs/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/libs/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml b/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml rename to templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/libs/templates/android_template/app/src/main/res/layout/activity_main.xml b/templates/android_template/app/src/main/res/layout/activity_main.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/layout/activity_main.xml rename to templates/android_template/app/src/main/res/layout/activity_main.xml diff --git a/libs/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/libs/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/libs/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/libs/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from libs/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/libs/templates/android_template/app/src/main/res/values-night/themes.xml b/templates/android_template/app/src/main/res/values-night/themes.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/values-night/themes.xml rename to templates/android_template/app/src/main/res/values-night/themes.xml diff --git a/libs/templates/android_template/app/src/main/res/values/colors.xml b/templates/android_template/app/src/main/res/values/colors.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/values/colors.xml rename to templates/android_template/app/src/main/res/values/colors.xml diff --git a/libs/templates/android_template/app/src/main/res/values/strings.xml b/templates/android_template/app/src/main/res/values/strings.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/values/strings.xml rename to templates/android_template/app/src/main/res/values/strings.xml diff --git a/libs/templates/android_template/app/src/main/res/values/themes.xml b/templates/android_template/app/src/main/res/values/themes.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/values/themes.xml rename to templates/android_template/app/src/main/res/values/themes.xml diff --git a/libs/templates/android_template/app/src/main/res/xml/backup_rules.xml b/templates/android_template/app/src/main/res/xml/backup_rules.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/xml/backup_rules.xml rename to templates/android_template/app/src/main/res/xml/backup_rules.xml diff --git a/libs/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml b/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from libs/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml rename to templates/android_template/app/src/main/res/xml/data_extraction_rules.xml diff --git a/libs/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt b/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt similarity index 100% rename from libs/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt rename to templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt diff --git a/libs/templates/android_template/build.gradle b/templates/android_template/build.gradle similarity index 100% rename from libs/templates/android_template/build.gradle rename to templates/android_template/build.gradle diff --git a/libs/templates/android_template/gradle.properties b/templates/android_template/gradle.properties similarity index 100% rename from libs/templates/android_template/gradle.properties rename to templates/android_template/gradle.properties diff --git a/libs/templates/android_template/gradle/wrapper/gradle-wrapper.jar b/templates/android_template/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from libs/templates/android_template/gradle/wrapper/gradle-wrapper.jar rename to templates/android_template/gradle/wrapper/gradle-wrapper.jar diff --git a/libs/templates/android_template/gradle/wrapper/gradle-wrapper.properties b/templates/android_template/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from libs/templates/android_template/gradle/wrapper/gradle-wrapper.properties rename to templates/android_template/gradle/wrapper/gradle-wrapper.properties diff --git a/libs/templates/android_template/gradlew b/templates/android_template/gradlew similarity index 100% rename from libs/templates/android_template/gradlew rename to templates/android_template/gradlew diff --git a/libs/templates/android_template/gradlew.bat b/templates/android_template/gradlew.bat similarity index 100% rename from libs/templates/android_template/gradlew.bat rename to templates/android_template/gradlew.bat diff --git a/libs/templates/android_template/settings.gradle b/templates/android_template/settings.gradle similarity index 100% rename from libs/templates/android_template/settings.gradle rename to templates/android_template/settings.gradle diff --git a/libs/templates/ios_template/.gitignore b/templates/ios_template/.gitignore similarity index 100% rename from libs/templates/ios_template/.gitignore rename to templates/ios_template/.gitignore diff --git a/libs/templates/ios_template/ios_template.xcodeproj/project.pbxproj b/templates/ios_template/ios_template.xcodeproj/project.pbxproj similarity index 100% rename from libs/templates/ios_template/ios_template.xcodeproj/project.pbxproj rename to templates/ios_template/ios_template.xcodeproj/project.pbxproj diff --git a/libs/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from libs/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/libs/templates/ios_template/ios_template/AppDelegate.swift b/templates/ios_template/ios_template/AppDelegate.swift similarity index 100% rename from libs/templates/ios_template/ios_template/AppDelegate.swift rename to templates/ios_template/ios_template/AppDelegate.swift diff --git a/libs/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json b/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from libs/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json rename to templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/libs/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json b/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from libs/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json rename to templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/libs/templates/ios_template/ios_template/Assets.xcassets/Contents.json b/templates/ios_template/ios_template/Assets.xcassets/Contents.json similarity index 100% rename from libs/templates/ios_template/ios_template/Assets.xcassets/Contents.json rename to templates/ios_template/ios_template/Assets.xcassets/Contents.json diff --git a/libs/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard b/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from libs/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard rename to templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard diff --git a/libs/templates/ios_template/ios_template/Base.lproj/Main.storyboard b/templates/ios_template/ios_template/Base.lproj/Main.storyboard similarity index 100% rename from libs/templates/ios_template/ios_template/Base.lproj/Main.storyboard rename to templates/ios_template/ios_template/Base.lproj/Main.storyboard diff --git a/libs/templates/ios_template/ios_template/Info.plist b/templates/ios_template/ios_template/Info.plist similarity index 100% rename from libs/templates/ios_template/ios_template/Info.plist rename to templates/ios_template/ios_template/Info.plist diff --git a/libs/templates/ios_template/ios_template/SceneDelegate.swift b/templates/ios_template/ios_template/SceneDelegate.swift similarity index 100% rename from libs/templates/ios_template/ios_template/SceneDelegate.swift rename to templates/ios_template/ios_template/SceneDelegate.swift diff --git a/libs/templates/ios_template/ios_template/ViewController.swift b/templates/ios_template/ios_template/ViewController.swift similarity index 100% rename from libs/templates/ios_template/ios_template/ViewController.swift rename to templates/ios_template/ios_template/ViewController.swift diff --git a/libs/templates/ios_template/ios_templateTests/ios_templateTests.swift b/templates/ios_template/ios_templateTests/ios_templateTests.swift similarity index 100% rename from libs/templates/ios_template/ios_templateTests/ios_templateTests.swift rename to templates/ios_template/ios_templateTests/ios_templateTests.swift diff --git a/libs/templates/ios_template/ios_templateUITests/ios_templateUITests.swift b/templates/ios_template/ios_templateUITests/ios_templateUITests.swift similarity index 100% rename from libs/templates/ios_template/ios_templateUITests/ios_templateUITests.swift rename to templates/ios_template/ios_templateUITests/ios_templateUITests.swift diff --git a/libs/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift b/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift similarity index 100% rename from libs/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift rename to templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift diff --git a/libs/templates/zip_android.sh b/templates/zip_android.sh similarity index 100% rename from libs/templates/zip_android.sh rename to templates/zip_android.sh diff --git a/libs/templates/zip_ios.sh b/templates/zip_ios.sh similarity index 100% rename from libs/templates/zip_ios.sh rename to templates/zip_ios.sh diff --git a/tests/test_smoke.py b/tests/test_smoke.py new file mode 100644 index 0000000..f5c04c4 --- /dev/null +++ b/tests/test_smoke.py @@ -0,0 +1,2 @@ +def test_pytest_workflow_smoke(): + assert 2 + 2 == 4 From 30037d17ad397952a88e3dfeb8bd003ced7319d8 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Sat, 4 Oct 2025 12:51:55 -0700 Subject: [PATCH 49/66] chore(core,components,cli): align lint, typing, and tests with CI --- .github/workflows/ci.yml | 2 +- mypy.ini | 7 ++++ pyproject.toml | 6 ++++ pytest.ini | 3 ++ src/pythonnative/activity_indicator_view.py | 5 +-- src/pythonnative/button.py | 11 +++---- src/pythonnative/cli/pn.py | 32 +++++++++---------- src/pythonnative/date_picker.py | 8 ++--- src/pythonnative/image_view.py | 5 ++- src/pythonnative/label.py | 1 + src/pythonnative/list_view.py | 4 ++- .../material_activity_inidicator_view.py | 9 +++--- src/pythonnative/material_button.py | 9 ++---- src/pythonnative/material_date_picker.py | 8 ++--- src/pythonnative/material_progress_view.py | 5 ++- src/pythonnative/material_search_bar.py | 1 + src/pythonnative/material_switch.py | 5 ++- src/pythonnative/material_time_picker.py | 8 ++--- src/pythonnative/page.py | 5 ++- src/pythonnative/picker_view.py | 1 + src/pythonnative/progress_view.py | 5 ++- src/pythonnative/scroll_view.py | 8 ++--- src/pythonnative/search_bar.py | 1 + src/pythonnative/stack_view.py | 8 ++--- src/pythonnative/switch.py | 1 + src/pythonnative/text_field.py | 1 + src/pythonnative/text_view.py | 1 + src/pythonnative/time_picker.py | 4 ++- src/pythonnative/view.py | 8 +++-- src/pythonnative/web_view.py | 4 +-- 30 files changed, 97 insertions(+), 79 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a13307..4301449 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Format check (Black) run: | - black --check . + black --check src apps tests - name: Type check (MyPy) run: | diff --git a/mypy.ini b/mypy.ini index 2be17e7..620d24f 100644 --- a/mypy.ini +++ b/mypy.ini @@ -7,3 +7,10 @@ warn_return_any = False strict_optional = False pretty = True files = src, tests + +[mypy-pythonnative.*] +implicit_reexport = True +disable_error_code = attr-defined,no-redef + +[mypy-pythonnative.button] +disable_error_code = misc diff --git a/pyproject.toml b/pyproject.toml index 92ee621..dd9cb00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,6 +69,12 @@ license-files = ["LICENSE*"] [tool.ruff] target-version = "py39" line-length = 120 +extend-exclude = [ + "experiments", + "apps", + "templates", + "docs", +] [tool.ruff.lint] select = ["E", "F", "I"] diff --git a/pytest.ini b/pytest.ini index 91f0d1d..f0d9b81 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,5 @@ [pytest] addopts = -q +testpaths = + tests + src/pythonnative diff --git a/src/pythonnative/activity_indicator_view.py b/src/pythonnative/activity_indicator_view.py index 1a1374c..81fe9f9 100644 --- a/src/pythonnative/activity_indicator_view.py +++ b/src/pythonnative/activity_indicator_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -57,8 +58,8 @@ class ActivityIndicatorView(ActivityIndicatorViewBase, ViewBase): def __init__(self) -> None: super().__init__() self.native_class = ObjCClass("UIActivityIndicatorView") - self.native_instance = ( - self.native_class.alloc().initWithActivityIndicatorStyle_(0) + self.native_instance = self.native_class.alloc().initWithActivityIndicatorStyle_( + 0 ) # 0: UIActivityIndicatorViewStyleLarge self.native_instance.hidesWhenStopped = True diff --git a/src/pythonnative/button.py b/src/pythonnative/button.py index 0aa11b9..64421e7 100644 --- a/src/pythonnative/button.py +++ b/src/pythonnative/button.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod from typing import Callable + from .utils import IS_ANDROID from .view import ViewBase @@ -48,9 +49,7 @@ def get_title(self) -> str: return self.native_instance.getText().toString() def set_on_click(self, callback: Callable[[], None]) -> None: - class OnClickListener( - dynamic_proxy(jclass("android.view.View").OnClickListener) - ): + class OnClickListener(dynamic_proxy(jclass("android.view.View").OnClickListener)): def __init__(self, callback): super().__init__() self.callback = callback @@ -67,7 +66,7 @@ def onClick(self, view): # https://developer.apple.com/documentation/uikit/uibutton # ======================================== - from rubicon.objc import ObjCClass, SEL + from rubicon.objc import SEL, ObjCClass class Button(ButtonBase, ViewBase): def __init__(self, title: str = "") -> None: @@ -87,6 +86,4 @@ def objc_callback(_cmd, sender): callback() action = SEL(objc_callback) - self.native_instance.addTarget_action_forControlEvents_( - self.native_instance, action, 1 - ) + self.native_instance.addTarget_action_forControlEvents_(self.native_instance, action, 1) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index 4ff2b33..578d57a 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -1,10 +1,11 @@ import argparse +import io import os import shutil import subprocess -import requests import zipfile -import io + +import requests def init_project(args: argparse.Namespace) -> None: @@ -35,7 +36,9 @@ def create_android_project(project_name: str, destination: str) -> None: :param project_name: The name of the project. :param destination: The directory where the project will be created. """ - android_template_url = "https://github.com/owenthcarey/pythonnative-workspace/blob/main/libs/templates/android_template.zip?raw=true" + android_template_url = ( + "https://github.com/owenthcarey/pythonnative-workspace/blob/main/libs/templates/android_template.zip?raw=true" + ) # Download and extract the Android template project download_template_project(android_template_url, destination) @@ -48,7 +51,9 @@ def create_ios_project(project_name: str, destination: str) -> None: :param project_name: The name of the project. :param destination: The directory where the project will be created. """ - ios_template_url = "https://github.com/owenthcarey/pythonnative-workspace/blob/main/libs/templates/ios_template.zip?raw=true" + ios_template_url = ( + "https://github.com/owenthcarey/pythonnative-workspace/blob/main/libs/templates/ios_template.zip?raw=true" + ) # Download and extract the iOS template project download_template_project(ios_template_url, destination) @@ -78,21 +83,18 @@ def run_project(args: argparse.Namespace) -> None: # Adjust the destination directory for Android project if platform == "android": - dest_dir: str = os.path.join( - build_dir, "android_template", "app", "src", "main", "python", "app" - ) - elif platform == "ios": - dest_dir: str = os.path.join( - build_dir, "app" - ) # Adjust this based on your iOS project structure + dest_dir: str = os.path.join(build_dir, "android_template", "app", "src", "main", "python", "app") + else: + dest_dir = os.path.join(build_dir, "app") # Adjust this based on your iOS project structure # Create the destination directory if it doesn't exist os.makedirs(dest_dir, exist_ok=True) shutil.copytree(src_dir, dest_dir, dirs_exist_ok=True) # Install any necessary Python packages into the project environment - requirements_file: str = os.path.join(os.getcwd(), "requirements.txt") - # TODO: Fill in with actual commands for installing Python packages + requirements_path = os.path.join(os.getcwd(), "requirements.txt") + if os.path.exists(requirements_path): + subprocess.run(["pip", "install", "-r", requirements_path], check=False) # Run the project if platform == "android": @@ -105,9 +107,7 @@ def run_project(args: argparse.Namespace) -> None: os.chmod(gradlew_path, 0o755) # this makes the file executable for the user # Build the Android project and install it on the device - jdk_path: str = ( - subprocess.check_output(["brew", "--prefix", "openjdk@17"]).decode().strip() - ) + jdk_path: str = subprocess.check_output(["brew", "--prefix", "openjdk@17"]).decode().strip() env: dict[str, str] = os.environ.copy() env["JAVA_HOME"] = jdk_path subprocess.run(["./gradlew", "installDebug"], check=True, env=env) diff --git a/src/pythonnative/date_picker.py b/src/pythonnative/date_picker.py index c9bc1e4..cb86006 100644 --- a/src/pythonnative/date_picker.py +++ b/src/pythonnative/date_picker.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -30,9 +31,7 @@ def get_date(self) -> tuple: from java import jclass class DatePicker(DatePickerBase, ViewBase): - def __init__( - self, context, year: int = 0, month: int = 0, day: int = 0 - ) -> None: + def __init__(self, context, year: int = 0, month: int = 0, day: int = 0) -> None: super().__init__() self.native_class = jclass("android.widget.DatePicker") self.native_instance = self.native_class(context) @@ -53,9 +52,10 @@ def get_date(self) -> tuple: # https://developer.apple.com/documentation/uikit/uidatepicker # ======================================== - from rubicon.objc import ObjCClass from datetime import datetime + from rubicon.objc import ObjCClass + class DatePicker(DatePickerBase, ViewBase): def __init__(self, year: int = 0, month: int = 0, day: int = 0) -> None: super().__init__() diff --git a/src/pythonnative/image_view.py b/src/pythonnative/image_view.py index de3d17e..78ce589 100644 --- a/src/pythonnative/image_view.py +++ b/src/pythonnative/image_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -27,10 +28,8 @@ def get_image(self) -> str: # https://developer.android.com/reference/android/widget/ImageView # ======================================== - from java import jclass - from java.io import File - from android.graphics.drawable import Drawable from android.graphics import BitmapFactory + from java import jclass class ImageView(ImageViewBase, ViewBase): def __init__(self, context, image: str = "") -> None: diff --git a/src/pythonnative/label.py b/src/pythonnative/label.py index e84a200..5982c32 100644 --- a/src/pythonnative/label.py +++ b/src/pythonnative/label.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/list_view.py b/src/pythonnative/list_view.py index 25ceab3..d2378d2 100644 --- a/src/pythonnative/list_view.py +++ b/src/pythonnative/list_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -67,5 +68,6 @@ def set_data(self, data: list) -> None: self.native_instance.reloadData() def get_data(self) -> list: - # Note: This is a simplified representation. Normally, you would need to get data from the UITableViewDataSource. + # Note: This is a simplified representation. + # Normally, you would need to get data from the UITableViewDataSource. return [] diff --git a/src/pythonnative/material_activity_inidicator_view.py b/src/pythonnative/material_activity_inidicator_view.py index e33b1f8..a568ced 100644 --- a/src/pythonnative/material_activity_inidicator_view.py +++ b/src/pythonnative/material_activity_inidicator_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -32,9 +33,7 @@ def stop_animating(self) -> None: class MaterialActivityIndicatorView(MaterialActivityIndicatorViewBase, ViewBase): def __init__(self, context) -> None: super().__init__() - self.native_class = jclass( - "com.google.android.material.progressindicator.CircularProgressIndicator" - ) + self.native_class = jclass("com.google.android.material.progressindicator.CircularProgressIndicator") self.native_instance = self.native_class(context) self.native_instance.setIndeterminate(True) @@ -58,8 +57,8 @@ class MaterialActivityIndicatorView(MaterialActivityIndicatorViewBase, ViewBase) def __init__(self) -> None: super().__init__() self.native_class = ObjCClass("UIActivityIndicatorView") - self.native_instance = ( - self.native_class.alloc().initWithActivityIndicatorStyle_(0) + self.native_instance = self.native_class.alloc().initWithActivityIndicatorStyle_( + 0 ) # 0: UIActivityIndicatorViewStyleLarge self.native_instance.hidesWhenStopped = True diff --git a/src/pythonnative/material_button.py b/src/pythonnative/material_button.py index 8f28eb5..1db600a 100644 --- a/src/pythonnative/material_button.py +++ b/src/pythonnative/material_button.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -32,9 +33,7 @@ def get_title(self) -> str: class MaterialButton(MaterialButtonBase, ViewBase): def __init__(self, context, title: str = "") -> None: super().__init__() - self.native_class = jclass( - "com.google.android.material.button.MaterialButton" - ) + self.native_class = jclass("com.google.android.material.button.MaterialButton") self.native_instance = self.native_class(context) self.set_title(title) @@ -55,9 +54,7 @@ def get_title(self) -> str: class MaterialButton(MaterialButtonBase, ViewBase): def __init__(self, title: str = "") -> None: super().__init__() - self.native_class = ObjCClass( - "UIButton" - ) # Apple does not have a direct equivalent for MaterialButton + self.native_class = ObjCClass("UIButton") # Apple does not have a direct equivalent for MaterialButton self.native_instance = self.native_class.alloc().init() self.set_title(title) diff --git a/src/pythonnative/material_date_picker.py b/src/pythonnative/material_date_picker.py index 24a0887..0eadeec 100644 --- a/src/pythonnative/material_date_picker.py +++ b/src/pythonnative/material_date_picker.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -32,9 +33,7 @@ def get_date(self) -> tuple: class MaterialDatePicker(MaterialDatePickerBase, ViewBase): def __init__(self, year: int = 0, month: int = 0, day: int = 0) -> None: super().__init__() - self.native_class = jclass( - "com.google.android.material.datepicker.MaterialDatePicker" - ) + self.native_class = jclass("com.google.android.material.datepicker.MaterialDatePicker") self.builder = self.native_class.Builder.datePicker() self.set_date(year, month, day) self.native_instance = self.builder.build() @@ -66,9 +65,10 @@ def get_date(self) -> tuple: # https://developer.apple.com/documentation/uikit/uidatepicker # ======================================== - from rubicon.objc import ObjCClass from datetime import datetime + from rubicon.objc import ObjCClass + class MaterialDatePicker(MaterialDatePickerBase, ViewBase): def __init__(self, year: int = 0, month: int = 0, day: int = 0) -> None: super().__init__() diff --git a/src/pythonnative/material_progress_view.py b/src/pythonnative/material_progress_view.py index 4b50966..23ca565 100644 --- a/src/pythonnative/material_progress_view.py +++ b/src/pythonnative/material_progress_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -32,9 +33,7 @@ def get_progress(self) -> float: class MaterialProgressView(MaterialProgressViewBase, ViewBase): def __init__(self, context) -> None: super().__init__() - self.native_class = jclass( - "com.google.android.material.progressindicator.LinearProgressIndicator" - ) + self.native_class = jclass("com.google.android.material.progressindicator.LinearProgressIndicator") self.native_instance = self.native_class(context) self.native_instance.setIndeterminate(False) diff --git a/src/pythonnative/material_search_bar.py b/src/pythonnative/material_search_bar.py index 805506a..0693323 100644 --- a/src/pythonnative/material_search_bar.py +++ b/src/pythonnative/material_search_bar.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/material_switch.py b/src/pythonnative/material_switch.py index 73c97cf..21003b5 100644 --- a/src/pythonnative/material_switch.py +++ b/src/pythonnative/material_switch.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -32,9 +33,7 @@ def is_on(self) -> bool: class MaterialSwitch(MaterialSwitchBase, ViewBase): def __init__(self, context, value: bool = False) -> None: super().__init__() - self.native_class = jclass( - "com.google.android.material.switch.MaterialSwitch" - ) + self.native_class = jclass("com.google.android.material.switch.MaterialSwitch") self.native_instance = self.native_class(context) self.set_on(value) diff --git a/src/pythonnative/material_time_picker.py b/src/pythonnative/material_time_picker.py index e6cab76..03d7303 100644 --- a/src/pythonnative/material_time_picker.py +++ b/src/pythonnative/material_time_picker.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -32,9 +33,7 @@ def get_time(self) -> tuple: class MaterialTimePicker(MaterialTimePickerBase, ViewBase): def __init__(self, context, hour: int = 0, minute: int = 0) -> None: super().__init__() - self.native_class = jclass( - "com.google.android.material.timepicker.MaterialTimePicker" - ) + self.native_class = jclass("com.google.android.material.timepicker.MaterialTimePicker") self.native_instance = self.native_class(context) self.set_time(hour, minute) @@ -52,9 +51,10 @@ def get_time(self) -> tuple: # https://developer.apple.com/documentation/uikit/uidatepicker # ======================================== - from rubicon.objc import ObjCClass from datetime import time + from rubicon.objc import ObjCClass + class MaterialTimePicker(MaterialTimePickerBase, ViewBase): def __init__(self, hour: int = 0, minute: int = 0) -> None: super().__init__() diff --git a/src/pythonnative/page.py b/src/pythonnative/page.py index 0f80f76..e465a6b 100644 --- a/src/pythonnative/page.py +++ b/src/pythonnative/page.py @@ -30,6 +30,7 @@ """ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -187,6 +188,4 @@ def on_restore_instance_state(self) -> None: print("iOS on_restore_instance_state() called") def navigate_to(self, page) -> None: - self.native_instance.navigationController().pushViewControllerAnimated_( - page.native_instance, True - ) + self.native_instance.navigationController().pushViewControllerAnimated_(page.native_instance, True) diff --git a/src/pythonnative/picker_view.py b/src/pythonnative/picker_view.py index 963b09a..fc7ca98 100644 --- a/src/pythonnative/picker_view.py +++ b/src/pythonnative/picker_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/progress_view.py b/src/pythonnative/progress_view.py index 458a4a8..e802151 100644 --- a/src/pythonnative/progress_view.py +++ b/src/pythonnative/progress_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -34,9 +35,7 @@ def __init__(self, context) -> None: super().__init__() self.native_class = jclass("android.widget.ProgressBar") # self.native_instance = self.native_class(context, None, android.R.attr.progressBarStyleHorizontal) - self.native_instance = self.native_class( - context, None, jclass("android.R$attr").progressBarStyleHorizontal - ) + self.native_instance = self.native_class(context, None, jclass("android.R$attr").progressBarStyleHorizontal) self.native_instance.setIndeterminate(False) def set_progress(self, progress: float) -> None: diff --git a/src/pythonnative/scroll_view.py b/src/pythonnative/scroll_view.py index 20036cc..1c19d62 100644 --- a/src/pythonnative/scroll_view.py +++ b/src/pythonnative/scroll_view.py @@ -1,4 +1,6 @@ from abc import ABC, abstractmethod +from typing import Any, List + from .utils import IS_ANDROID from .view import ViewBase @@ -11,7 +13,7 @@ class ScrollViewBase(ABC): @abstractmethod def __init__(self) -> None: super().__init__() - self.views = [] + self.views: List[Any] = [] @abstractmethod def add_view(self, view) -> None: @@ -52,9 +54,7 @@ class ScrollView(ScrollViewBase, ViewBase): def __init__(self) -> None: super().__init__() self.native_class = ObjCClass("UIScrollView") - self.native_instance = self.native_class.alloc().initWithFrame_( - ((0, 0), (0, 0)) - ) + self.native_instance = self.native_class.alloc().initWithFrame_(((0, 0), (0, 0))) def add_view(self, view): self.views.append(view) diff --git a/src/pythonnative/search_bar.py b/src/pythonnative/search_bar.py index 95c6ff7..72609ff 100644 --- a/src/pythonnative/search_bar.py +++ b/src/pythonnative/search_bar.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/stack_view.py b/src/pythonnative/stack_view.py index 55da27d..a2816f4 100644 --- a/src/pythonnative/stack_view.py +++ b/src/pythonnative/stack_view.py @@ -1,4 +1,6 @@ from abc import ABC, abstractmethod +from typing import Any, List + from .utils import IS_ANDROID from .view import ViewBase @@ -11,7 +13,7 @@ class StackViewBase(ABC): @abstractmethod def __init__(self) -> None: super().__init__() - self.views = [] + self.views: List[Any] = [] @abstractmethod def add_view(self, view) -> None: @@ -49,9 +51,7 @@ class StackView(StackViewBase, ViewBase): def __init__(self) -> None: super().__init__() self.native_class = ObjCClass("UIStackView") - self.native_instance = self.native_class.alloc().initWithFrame_( - ((0, 0), (0, 0)) - ) + self.native_instance = self.native_class.alloc().initWithFrame_(((0, 0), (0, 0))) self.native_instance.setAxis_(0) # Set axis to vertical def add_view(self, view): diff --git a/src/pythonnative/switch.py b/src/pythonnative/switch.py index 9903a6e..e271604 100644 --- a/src/pythonnative/switch.py +++ b/src/pythonnative/switch.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/text_field.py b/src/pythonnative/text_field.py index 1f47186..44252b8 100644 --- a/src/pythonnative/text_field.py +++ b/src/pythonnative/text_field.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/text_view.py b/src/pythonnative/text_view.py index 26e6504..01f3394 100644 --- a/src/pythonnative/text_view.py +++ b/src/pythonnative/text_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase diff --git a/src/pythonnative/time_picker.py b/src/pythonnative/time_picker.py index 44e9b45..b12a395 100644 --- a/src/pythonnative/time_picker.py +++ b/src/pythonnative/time_picker.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -51,9 +52,10 @@ def get_time(self) -> tuple: # https://developer.apple.com/documentation/uikit/uidatepicker # ======================================== - from rubicon.objc import ObjCClass from datetime import time + from rubicon.objc import ObjCClass + class TimePicker(TimePickerBase, ViewBase): def __init__(self, hour: int = 0, minute: int = 0) -> None: super().__init__() diff --git a/src/pythonnative/view.py b/src/pythonnative/view.py index 79d25b0..4afbbfe 100644 --- a/src/pythonnative/view.py +++ b/src/pythonnative/view.py @@ -1,4 +1,5 @@ -from abc import ABC, abstractmethod +from abc import ABC +from typing import Any # ======================================== # Base class @@ -7,8 +8,9 @@ class ViewBase(ABC): def __init__(self) -> None: - self.native_instance = None - self.native_class = None + # Native bridge handles return types dynamically; these attributes are set at runtime. + self.native_instance: Any = None + self.native_class: Any = None # @abstractmethod # def add_view(self, view): diff --git a/src/pythonnative/web_view.py b/src/pythonnative/web_view.py index d63913c..60a8117 100644 --- a/src/pythonnative/web_view.py +++ b/src/pythonnative/web_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod + from .utils import IS_ANDROID from .view import ViewBase @@ -41,8 +42,7 @@ def load_url(self, url: str) -> None: # https://developer.apple.com/documentation/webkit/wkwebview # ======================================== - from rubicon.objc import ObjCClass - from rubicon.objc import NSURL, NSURLRequest + from rubicon.objc import NSURL, NSURLRequest, ObjCClass class WebView(WebViewBase, ViewBase): def __init__(self, url: str = "") -> None: From 401a076dcb1fe0c19771f4a19141ee8da28c80e2 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Sat, 4 Oct 2025 13:10:47 -0700 Subject: [PATCH 50/66] ci(workflows,mkdocs): set CNAME to docs.pythonnative.com for docs deploy --- .github/workflows/docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f1423ad..ddce20b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -27,3 +27,4 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./site + cname: docs.pythonnative.com From 16ede972d41b549853962c7056b65558c9ebd2f5 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Thu, 9 Oct 2025 11:45:51 -0700 Subject: [PATCH 51/66] docs(mkdocs): add roadmap and link in nav --- docs/meta/roadmap.md | 154 +++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 155 insertions(+) create mode 100644 docs/meta/roadmap.md diff --git a/docs/meta/roadmap.md b/docs/meta/roadmap.md new file mode 100644 index 0000000..1dd140a --- /dev/null +++ b/docs/meta/roadmap.md @@ -0,0 +1,154 @@ +--- +title: Roadmap +--- + +# PythonNative Roadmap (v0.2.0 → v0.10.0) + +This roadmap focuses on transforming PythonNative into a workable, React Native / Expo-like framework from a developer-experience and simplicity standpoint. Releases are incremental and designed to be shippable, with DX-first improvements balanced with platform capability. + +Assumptions +- Current version: 0.1.0 +- Scope: Android (Chaquopy/Java bridge) and iOS (Rubicon-ObjC), Python 3.9–3.12 +- Goals: Zero-config templates, one CLI, fast iteration loop, portable component API, and a curated subset of native capabilities with room to expand. + +Guiding Principles +- Single CLI for init/run/build/clean. +- Convention over configuration: opinionated project layout (`app/`, `pythonnative.json`, `requirements.txt`). +- Hot reload (where feasible) and rapid feedback. +- Stable component API; platform shims kept internal. +- Progressive enhancement: start with a minimal but complete loop, add breadth and depth over time. + +Milestones + +0.2.0 — Foundations: DX Baseline and Templates +- CLI + - pn init: generate project with `app/`, `pythonnative.json`, `requirements.txt`, `.gitignore`. + - pn run android|ios: scaffold template apps (from bundled zips), copy `app/`, install requirements, build+install/run. + - pn clean: remove `build/` safely. +- Templates + - Bundle `templates/android_template.zip` and `templates/ios_template.zip` into package to avoid network. + - Ensure Android template uses Kotlin+Chaquopy; iOS template uses Swift+PythonKit+Rubicon. +- Core APIs + - Stabilize `Page`, `StackView`, `Label`, `Button`, `ImageView`, `TextField`, `TextView`, `Switch`, `ProgressView`, `ActivityIndicatorView`, `WebView` with consistent ctor patterns. + - Add `utils.IS_ANDROID` fallback detection improvements. +- Docs + - Getting Started (one page), Hello World, Concepts: Components, Guides: Android/iOS quickstart. + - Roadmap (this page). Contributing. + +Success Criteria +- New user can: pn init → pn run android → sees Hello World UI; same for iOS. + +0.3.0 — Navigation and Lifecycle +- API + - Page navigation abstraction with push/pop (Android: Activity/Fragment shim, iOS: UINavigationController). + - Lifecycle events stabilized and wired from host to Python (on_create/start/resume/pause/stop/destroy). +- Templates + - Two-screen sample demonstrating navigation and parameter passing. +- Docs + - Navigation guide with examples. + +Success Criteria +- Sample app navigates between two pages on both platforms using the same Python API. + +0.4.0 — Layout and Styling Pass +- API + - Improve `StackView` configuration: axis, spacing, alignment; add `ScrollView` wrapping helpers. + - Add lightweight style API (padding/margin where supported, background color, text color/size for text components). +- DX + - Component property setters return self for fluent configuration where ergonomic. +- Docs + - Styling guide and component property reference. + +Success Criteria +- Build complex vertical forms and simple horizontal layouts with predictable results on both platforms. + +0.5.0 — Developer Experience: Live Reload Loop +- DX + - pn dev android|ios: dev server watching `app/` with file-sync into running app. + - Implement soft-reload: trigger Python module reload and page re-render without full app restart where possible. + - Fallback to fast reinstall when soft-reload not possible. +- Templates + - Integrate dev menu gesture (e.g., triple-tap or shake) to trigger reload. +- Docs + - Dev workflow: live reload expectations and caveats. + +Success Criteria +- Edit Python in `app/`, trigger near-instant UI update on device/emulator. + +0.6.0 — Forms and Lists +- API + - `ListView` cross-platform wrapper with simple adapter API (Python callback to render rows, handle click). + - Input controls: `DatePicker`, `TimePicker`, basic validation utilities. + - Add `PickerView` parity or mark as experimental if iOS-first. +- Performance + - Ensure cell reuse on Android/iOS to handle 1k-row lists smoothly. +- Docs + - Lists guide, forms guide with validation patterns. + +Success Criteria +- Build a basic todo app with a scrollable list and an add-item form. + +0.7.0 — Networking, Storage, and Permissions Primitives +- API + - Simple `fetch`-like helper (thin wrapper over requests/URLSession with threading off main UI thread). + - Key-value storage abstraction (Android SharedPreferences / iOS UserDefaults). + - Permission prompts helper (camera, location, notifications) with consistent API returning futures/promises. +- DX + - Background threading utilities for long-running tasks with callback to main thread. +- Docs + - Data fetching, local storage, permissions cookbook. + +Success Criteria +- Build a data-driven screen that fetches remote JSON, caches a token, and requests permission. + +0.8.0 — Theming and Material Components (Android parity), iOS polish +- API + - Theme object for colors/typography; propagate defaults to components. + - Material variants: MaterialButton, MaterialProgress, MaterialSearchBar, MaterialSwitch stabilized. + - iOS polishing: ensure UIKit equivalents’ look-and-feel is sensible by default. +- DX + - Dark/light theme toggling hook. +- Docs + - Theming guide with examples. + +Success Criteria +- Switch between light/dark themes and see consistent component styling across screens. + +0.9.0 — Packaging, Testing, and CI +- CLI + - pn build android|ios: produce signed (debug) APK/IPA or x archive guidance; integrate keystore setup helper for Android. + - pn test: run Python unit tests; document UI test strategy (manual/host-level instrumentation later). +- Tooling + - Add ruff/black/mypy default config and `pn fmt`, `pn lint` wrappers. +- Docs + - Release checklist; testing guide. + +Success Criteria +- Produce installable builds via pn build; run unit tests with a single command. + +0.10.0 — Plugin System (Early) and Project Orchestration +- Plugins + - Define `pythonnative.plugins` entry point allowing add-ons (e.g., Camera, Filesystem) to register platform shims. + - pn plugin add : scaffold plugin structure and install dependency. +- Orchestration + - Config-driven `pythonnative.json`: targets, app id/name, icons/splash, permissions, minSDK/iOS version. + - Asset pipeline: copy assets to correct platform locations. +- Docs + - Plugin authoring guide; configuration reference. + +Success Criteria +- Install a community plugin and use it from Python without touching native code. + +Backlog and Stretch (post-0.10) +- Cross-platform navigation stack parity (Fragments vs Activities, or single-activity multi-fragment on Android). +- Advanced layout (ConstraintLayout/AutoLayout helpers) with declarative constraints. +- Gesture/touch handling unification, animations/transitions. +- Expo-like over-the-air updates pipeline. +- Desktop/web exploration via PyObjC/Qt bridges (research). + +Breaking Changes Policy +- Pre-1.0: Minor versions may include breaking changes; provide migration notes and deprecation warnings one release ahead when possible. + +Tracking and Releases +- Each milestone will have a GitHub project board and labeled issues. +- Changelogs maintained per release; upgrade guides in docs. diff --git a/mkdocs.yml b/mkdocs.yml index cecbbf5..c8a6339 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -25,6 +25,7 @@ nav: - API Reference: - Package: api/pythonnative.md - Meta: + - Roadmap: meta/roadmap.md - Contributing: meta/contributing.md plugins: - search From 9c61757713fe60b5e98756f552681a782f397f3a Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Thu, 9 Oct 2025 12:05:35 -0700 Subject: [PATCH 52/66] feat(cli,mkdocs,tests): add pn init/run/clean; use bundled templates --- CONTRIBUTING.md | 6 + apps/pythonnative_demo/pythonnative.json | 7 + docs/getting-started.md | 4 + src/pythonnative/__init__.py | 65 +++++--- src/pythonnative/cli/pn.py | 179 ++++++++++++++++++----- tests/test_cli.py | 34 +++++ 6 files changed, 238 insertions(+), 57 deletions(-) create mode 100644 tests/test_cli.py diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb3d2d2..4338f5b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -159,6 +159,12 @@ BREAKING CHANGE: API renamed; update app code and templates. - Comma‑separate scopes without spaces: `type(scope1,scope2): ...` - Prefer a single scope when possible; use multiple only when the change genuinely spans tightly related areas. +Scope ordering (house style): + +- Put the most impacted scope first (e.g., `repo`), then any secondary scopes. +- For extra consistency, alphabetize the remaining scopes after the primary. +- Keep it to 1–3 scopes max. + Example: ```text diff --git a/apps/pythonnative_demo/pythonnative.json b/apps/pythonnative_demo/pythonnative.json index e69de29..04dc187 100644 --- a/apps/pythonnative_demo/pythonnative.json +++ b/apps/pythonnative_demo/pythonnative.json @@ -0,0 +1,7 @@ +{ + "name": "PythonNative Demo", + "appId": "com.pythonnative.demo", + "entryPoint": "app/main_page.py", + "ios": {}, + "android": {} +} diff --git a/docs/getting-started.md b/docs/getting-started.md index 5227549..82cf697 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -7,4 +7,8 @@ pn --help - Install: `pip install pythonnative` - Create a project: `pn init my_app` + - Scaffolds `app/`, `pythonnative.json`, `requirements.txt`, `.gitignore` - Run: `pn run android` or `pn run ios` + - Uses bundled templates; copies your `app/` into the platform project +- Clean: `pn clean` + - Removes the `build/` directory safely diff --git a/src/pythonnative/__init__.py b/src/pythonnative/__init__.py index 1edc3b2..048ae32 100644 --- a/src/pythonnative/__init__.py +++ b/src/pythonnative/__init__.py @@ -1,27 +1,5 @@ -from .activity_indicator_view import ActivityIndicatorView -from .button import Button -from .date_picker import DatePicker -from .image_view import ImageView -from .label import Label -from .list_view import ListView -from .material_activity_inidicator_view import MaterialActivityIndicatorView -from .material_button import MaterialButton -from .material_date_picker import MaterialDatePicker -from .material_progress_view import MaterialProgressView -from .material_search_bar import MaterialSearchBar -from .material_switch import MaterialSwitch -from .material_time_picker import MaterialTimePicker -from .page import Page -from .picker_view import PickerView -from .progress_view import ProgressView -from .scroll_view import ScrollView -from .search_bar import SearchBar -from .stack_view import StackView -from .switch import Switch -from .text_field import TextField -from .text_view import TextView -from .time_picker import TimePicker -from .web_view import WebView +from importlib import import_module +from typing import Any, Dict __all__ = [ "ActivityIndicatorView", @@ -49,3 +27,42 @@ "TimePicker", "WebView", ] + +_NAME_TO_MODULE: Dict[str, str] = { + "ActivityIndicatorView": ".activity_indicator_view", + "Button": ".button", + "DatePicker": ".date_picker", + "ImageView": ".image_view", + "Label": ".label", + "ListView": ".list_view", + "MaterialActivityIndicatorView": ".material_activity_inidicator_view", + "MaterialButton": ".material_button", + "MaterialDatePicker": ".material_date_picker", + "MaterialProgressView": ".material_progress_view", + "MaterialSearchBar": ".material_search_bar", + "MaterialSwitch": ".material_switch", + "MaterialTimePicker": ".material_time_picker", + "Page": ".page", + "PickerView": ".picker_view", + "ProgressView": ".progress_view", + "ScrollView": ".scroll_view", + "SearchBar": ".search_bar", + "StackView": ".stack_view", + "Switch": ".switch", + "TextField": ".text_field", + "TextView": ".text_view", + "TimePicker": ".time_picker", + "WebView": ".web_view", +} + + +def __getattr__(name: str) -> Any: + module_path = _NAME_TO_MODULE.get(name) + if not module_path: + raise AttributeError(f"module 'pythonnative' has no attribute {name!r}") + module = import_module(module_path, package=__name__) + return getattr(module, name) + + +def __dir__() -> Any: + return sorted(list(globals().keys()) + __all__) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index 578d57a..a9fee40 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -1,32 +1,118 @@ import argparse -import io +import json import os import shutil import subprocess +import sys import zipfile - -import requests +from importlib import resources def init_project(args: argparse.Namespace) -> None: """ Initialize a new PythonNative project. + Creates `app/`, `pythonnative.json`, `requirements.txt`, `.gitignore`. """ - # TODO: Implementation - - -def download_template_project(template_url: str, destination: str) -> None: + project_name: str = getattr(args, "name", None) or os.path.basename(os.getcwd()) + cwd: str = os.getcwd() + + app_dir = os.path.join(cwd, "app") + config_path = os.path.join(cwd, "pythonnative.json") + requirements_path = os.path.join(cwd, "requirements.txt") + gitignore_path = os.path.join(cwd, ".gitignore") + + # Prevent accidental overwrite unless --force is provided + if not getattr(args, "force", False): + exists = [] + if os.path.exists(app_dir): + exists.append("app/") + if os.path.exists(config_path): + exists.append("pythonnative.json") + if os.path.exists(requirements_path): + exists.append("requirements.txt") + if os.path.exists(gitignore_path): + exists.append(".gitignore") + if exists: + print(f"Refusing to overwrite existing: {', '.join(exists)}. Use --force to overwrite.") + sys.exit(1) + + os.makedirs(app_dir, exist_ok=True) + + # Minimal hello world app scaffold + main_page_py = os.path.join(app_dir, "main_page.py") + if not os.path.exists(main_page_py) or args.force: + with open(main_page_py, "w", encoding="utf-8") as f: + f.write( + """import pythonnative as pn + + +class MainPage(pn.Page): + def __init__(self, native_instance): + super().__init__(native_instance) + + def on_create(self): + super().on_create() + stack = pn.StackView(self.native_instance) + stack.add_view(pn.Label(self.native_instance, \"Hello from PythonNative!\")) + self.set_root_view(stack) +""" + ) + + # Create config + config = { + "name": project_name, + "appId": "com.example." + project_name.replace(" ", "").lower(), + "entryPoint": "app/main_page.py", + "ios": {}, + "android": {}, + } + with open(config_path, "w", encoding="utf-8") as f: + json.dump(config, f, indent=2) + + # Requirements + if not os.path.exists(requirements_path) or args.force: + with open(requirements_path, "w", encoding="utf-8") as f: + f.write("pythonnative\n") + + # .gitignore + default_gitignore = "# PythonNative\n" "__pycache__/\n" "*.pyc\n" ".venv/\n" "build/\n" ".DS_Store\n" + if not os.path.exists(gitignore_path) or args.force: + with open(gitignore_path, "w", encoding="utf-8") as f: + f.write(default_gitignore) + + print("Initialized PythonNative project.") + + +def _extract_zip_to_destination(zip_path: str, destination: str) -> None: + with zipfile.ZipFile(zip_path, "r") as zf: + zf.extractall(destination) + + +def _extract_bundled_template(zip_name: str, destination: str) -> None: """ - Download and extract a template project from a URL. - - :param template_url: The URL of the template project. - :param destination: The directory where the project will be created. + Extract a bundled template zip into the destination directory. + Tries package resources first; falls back to repo root `templates/` at dev time. """ - response: requests.Response = requests.get(template_url, stream=True) - - if response.status_code == 200: - with zipfile.ZipFile(io.BytesIO(response.content)) as z: - z.extractall(destination) + # Try to load from installed package resources first + try: + pkg_templates = resources.files("pythonnative").joinpath("templates") + resource_path = str(pkg_templates.joinpath(zip_name)) + if os.path.exists(resource_path): + _extract_zip_to_destination(resource_path, destination) + return + except Exception: + # Fall back to repo layout + pass + + # Fallback: use repository-level templates directory + repo_templates = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "..", "..", "templates") + repo_templates = os.path.abspath(repo_templates) + candidate = os.path.join(repo_templates, zip_name) + if os.path.exists(candidate): + _extract_zip_to_destination(candidate, destination) + return + + raise FileNotFoundError(f"Could not find bundled template {zip_name}. Ensure templates are packaged.") def create_android_project(project_name: str, destination: str) -> None: @@ -36,12 +122,8 @@ def create_android_project(project_name: str, destination: str) -> None: :param project_name: The name of the project. :param destination: The directory where the project will be created. """ - android_template_url = ( - "https://github.com/owenthcarey/pythonnative-workspace/blob/main/libs/templates/android_template.zip?raw=true" - ) - - # Download and extract the Android template project - download_template_project(android_template_url, destination) + # Extract the Android template project from bundled zip + _extract_bundled_template("android_template.zip", destination) def create_ios_project(project_name: str, destination: str) -> None: @@ -51,12 +133,8 @@ def create_ios_project(project_name: str, destination: str) -> None: :param project_name: The name of the project. :param destination: The directory where the project will be created. """ - ios_template_url = ( - "https://github.com/owenthcarey/pythonnative-workspace/blob/main/libs/templates/ios_template.zip?raw=true" - ) - - # Download and extract the iOS template project - download_template_project(ios_template_url, destination) + # Extract the iOS template project from bundled zip + _extract_bundled_template("ios_template.zip", destination) def run_project(args: argparse.Namespace) -> None: @@ -85,7 +163,8 @@ def run_project(args: argparse.Namespace) -> None: if platform == "android": dest_dir: str = os.path.join(build_dir, "android_template", "app", "src", "main", "python", "app") else: - dest_dir = os.path.join(build_dir, "app") # Adjust this based on your iOS project structure + # For iOS, stage the Python app in a top-level folder for later integration scripts + dest_dir = os.path.join(build_dir, "app") # Create the destination directory if it doesn't exist os.makedirs(dest_dir, exist_ok=True) @@ -94,7 +173,7 @@ def run_project(args: argparse.Namespace) -> None: # Install any necessary Python packages into the project environment requirements_path = os.path.join(os.getcwd(), "requirements.txt") if os.path.exists(requirements_path): - subprocess.run(["pip", "install", "-r", requirements_path], check=False) + subprocess.run([sys.executable, "-m", "pip", "install", "-r", requirements_path], check=False) # Run the project if platform == "android": @@ -107,9 +186,14 @@ def run_project(args: argparse.Namespace) -> None: os.chmod(gradlew_path, 0o755) # this makes the file executable for the user # Build the Android project and install it on the device - jdk_path: str = subprocess.check_output(["brew", "--prefix", "openjdk@17"]).decode().strip() env: dict[str, str] = os.environ.copy() - env["JAVA_HOME"] = jdk_path + # Respect JAVA_HOME if set; otherwise, attempt a best-effort on macOS via Homebrew + if sys.platform == "darwin" and not env.get("JAVA_HOME"): + try: + jdk_path: str = subprocess.check_output(["brew", "--prefix", "openjdk@17"]).decode().strip() + env["JAVA_HOME"] = jdk_path + except Exception: + pass subprocess.run(["./gradlew", "installDebug"], check=True, env=env) # Run the Android app @@ -126,6 +210,27 @@ def run_project(args: argparse.Namespace) -> None: ], check=True, ) + elif platform == "ios": + # Attempt to build the iOS project for Simulator (best-effort) + ios_project_dir: str = os.path.join(build_dir, "ios_template") + if os.path.isdir(ios_project_dir): + os.chdir(ios_project_dir) + try: + subprocess.run( + [ + "xcodebuild", + "-project", + "ios_template.xcodeproj", + "-scheme", + "ios_template", + "-destination", + "platform=iOS Simulator,name=iPhone 15", + "build", + ], + check=False, + ) + except FileNotFoundError: + print("xcodebuild not found. Skipping iOS build step.") def clean_project(args: argparse.Namespace) -> None: @@ -137,8 +242,10 @@ def clean_project(args: argparse.Namespace) -> None: # Check if the build directory exists if os.path.exists(build_dir): - # Delete the build directory shutil.rmtree(build_dir) + print("Removed build/ directory.") + else: + print("No build/ directory to remove.") def main() -> None: @@ -147,6 +254,8 @@ def main() -> None: # Create a new command 'init' that calls init_project parser_init = subparsers.add_parser("init") + parser_init.add_argument("name", nargs="?", help="Project name (defaults to current directory name)") + parser_init.add_argument("--force", action="store_true", help="Overwrite existing files if present") parser_init.set_defaults(func=init_project) # Create a new command 'run' that calls run_project @@ -160,3 +269,7 @@ def main() -> None: args = parser.parse_args() args.func(args) + + +if __name__ == "__main__": + main() diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..fad1596 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,34 @@ +import os +import shutil +import subprocess +import sys +import tempfile + + +def run_pn(args, cwd): + cmd = [sys.executable, "-m", "pythonnative.cli.pn"] + args + return subprocess.run(cmd, cwd=cwd, check=False, capture_output=True, text=True) + + +def test_cli_init_and_clean(): + tmpdir = tempfile.mkdtemp(prefix="pn_cli_test_") + try: + # init + result = run_pn(["init", "MyApp"], tmpdir) + assert result.returncode == 0, result.stderr + assert os.path.isdir(os.path.join(tmpdir, "app")) + assert os.path.isfile(os.path.join(tmpdir, "pythonnative.json")) + assert os.path.isfile(os.path.join(tmpdir, "requirements.txt")) + assert os.path.isfile(os.path.join(tmpdir, ".gitignore")) + + # clean (on empty build should be no-op) + result = run_pn(["clean"], tmpdir) + assert result.returncode == 0, result.stderr + + # create build dir and ensure clean removes it + os.makedirs(os.path.join(tmpdir, "build", "android"), exist_ok=True) + result = run_pn(["clean"], tmpdir) + assert result.returncode == 0, result.stderr + assert not os.path.exists(os.path.join(tmpdir, "build")) + finally: + shutil.rmtree(tmpdir, ignore_errors=True) From d9dd821bc18289f1f1a367e737cfe7d5bfaf6ee3 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Thu, 9 Oct 2025 13:06:23 -0700 Subject: [PATCH 53/66] feat(cli,templates): bundle offline templates; add run --prepare-only --- apps/pythonnative_demo/requirements.txt | 1 + docs/guides/android.md | 20 +++++++ docs/guides/ios.md | 20 +++++++ pyproject.toml | 7 +++ src/pythonnative/cli/pn.py | 57 +++++++++++++++---- .../ios_template/ViewController.swift | 15 ++++- tests/test_cli.py | 20 +++++++ 7 files changed, 129 insertions(+), 11 deletions(-) diff --git a/apps/pythonnative_demo/requirements.txt b/apps/pythonnative_demo/requirements.txt index e69de29..7e4d11b 100644 --- a/apps/pythonnative_demo/requirements.txt +++ b/apps/pythonnative_demo/requirements.txt @@ -0,0 +1 @@ +pythonnative diff --git a/docs/guides/android.md b/docs/guides/android.md index d632bef..6bccdf4 100644 --- a/docs/guides/android.md +++ b/docs/guides/android.md @@ -1,3 +1,23 @@ # Android Guide Basic steps to build and run an Android project generated by `pn`. + +## What gets generated + +`pn run android` unpacks the bundled Android template (Kotlin + Chaquopy) into `build/android/android_template` and copies your `app/` into the template's `app/src/main/python/app/`. + +No network is required for the template itself; the template zip is bundled with the package. + +## Run + +```bash +pn run android +``` + +Or to only prepare the project without building: + +```bash +pn run android --prepare-only +``` + +This will stage files under `build/android/android_template` so you can open it in Android Studio if you prefer. diff --git a/docs/guides/ios.md b/docs/guides/ios.md index 5ff485d..b497f9a 100644 --- a/docs/guides/ios.md +++ b/docs/guides/ios.md @@ -1,3 +1,23 @@ # iOS Guide Basic steps to build and run an iOS project generated by `pn`. + +## What gets generated + +`pn run ios` unpacks the bundled iOS template (Swift + PythonKit, with optional Rubicon-ObjC) into `build/ios/ios_template` and copies your `app/` under `build/ios/app/` for later integration steps. The template zip is bundled with the package, so no network is required to scaffold. + +The default `ViewController.swift` initializes PythonKit, prints the Python version, and attempts to import `rubicon.objc` if present. + +## Run / Prepare + +```bash +pn run ios +``` + +Or prepare without building: + +```bash +pn run ios --prepare-only +``` + +You can then open `build/ios/ios_template/ios_template.xcodeproj` in Xcode. diff --git a/pyproject.toml b/pyproject.toml index dd9cb00..4d700d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,13 @@ where = ["src"] [tool.setuptools] license-files = ["LICENSE*"] +# Ensure template zip files are bundled with the wheel so the CLI can run offline. +[tool.setuptools.data-files] +"pythonnative/templates" = [ + "templates/android_template.zip", + "templates/ios_template.zip", +] + [tool.ruff] target-version = "py39" line-length = 120 diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index a9fee40..bad15ef 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -4,6 +4,7 @@ import shutil import subprocess import sys +import sysconfig import zipfile from importlib import resources @@ -93,15 +94,39 @@ def _extract_bundled_template(zip_name: str, destination: str) -> None: Extract a bundled template zip into the destination directory. Tries package resources first; falls back to repo root `templates/` at dev time. """ - # Try to load from installed package resources first + # Try to load from installed package resources first (if templates are packaged inside the module) try: - pkg_templates = resources.files("pythonnative").joinpath("templates") - resource_path = str(pkg_templates.joinpath(zip_name)) - if os.path.exists(resource_path): - _extract_zip_to_destination(resource_path, destination) - return + cand = resources.files("pythonnative").joinpath("templates").joinpath(zip_name) + with resources.as_file(cand) as p: + resource_path = str(p) + if os.path.exists(resource_path): + _extract_zip_to_destination(resource_path, destination) + return + except Exception: + # Not packaged inside the module; try data-files installation locations next + pass + + # Try sysconfig data dir (where data-files are typically installed) + try: + data_dir = sysconfig.get_paths().get("data") + if data_dir: + candidate = os.path.join(data_dir, "pythonnative", "templates", zip_name) + if os.path.exists(candidate): + _extract_zip_to_destination(candidate, destination) + return + except Exception: + pass + + # Try site-packages purelib/platlib (some environments place data files here) + try: + purelib = sysconfig.get_paths().get("purelib") + platlib = sysconfig.get_paths().get("platlib") + for base in filter(None, [purelib, platlib]): + candidate = os.path.join(base, "pythonnative", "templates", zip_name) + if os.path.exists(candidate): + _extract_zip_to_destination(candidate, destination) + return except Exception: - # Fall back to repo layout pass # Fallback: use repository-level templates directory @@ -143,6 +168,7 @@ def run_project(args: argparse.Namespace) -> None: """ # Determine the platform platform: str = args.platform + prepare_only: bool = getattr(args, "prepare_only", False) # Define the build directory build_dir: str = os.path.join(os.getcwd(), "build", platform) @@ -171,11 +197,17 @@ def run_project(args: argparse.Namespace) -> None: shutil.copytree(src_dir, dest_dir, dirs_exist_ok=True) # Install any necessary Python packages into the project environment - requirements_path = os.path.join(os.getcwd(), "requirements.txt") - if os.path.exists(requirements_path): - subprocess.run([sys.executable, "-m", "pip", "install", "-r", requirements_path], check=False) + # Skip installation during prepare-only to avoid network access and speed up scaffolding + if not prepare_only: + requirements_path = os.path.join(os.getcwd(), "requirements.txt") + if os.path.exists(requirements_path): + subprocess.run([sys.executable, "-m", "pip", "install", "-r", requirements_path], check=False) # Run the project + if prepare_only: + print("Prepared project in build/ without building (prepare-only).") + return + if platform == "android": # Change to the Android project directory android_project_dir: str = os.path.join(build_dir, "android_template") @@ -261,6 +293,11 @@ def main() -> None: # Create a new command 'run' that calls run_project parser_run = subparsers.add_parser("run") parser_run.add_argument("platform", choices=["android", "ios"]) + parser_run.add_argument( + "--prepare-only", + action="store_true", + help="Extract templates and stage app without building", + ) parser_run.set_defaults(func=run_project) # Create a new command 'clean' that calls clean_project diff --git a/templates/ios_template/ios_template/ViewController.swift b/templates/ios_template/ios_template/ViewController.swift index 59beb91..6792657 100644 --- a/templates/ios_template/ios_template/ViewController.swift +++ b/templates/ios_template/ios_template/ViewController.swift @@ -6,12 +6,25 @@ // import UIKit +import PythonKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + // Minimal PythonKit bootstrap: print Python version and attempt to import Rubicon. + let sys = Python.import("sys") + print("Python Version: \(sys.version_info.major).\(sys.version_info.minor)") + print("Python Path: \(sys.path)") + + // Try to import Rubicon-ObjC if available. Safe no-op if not present. + do { + let rubiconObjC = try Python.attemptImport("rubicon.objc") + let ObjCClass = rubiconObjC.ObjCClass + print("Rubicon available: \(ObjCClass)") + } catch { + print("Rubicon not available; continuing without it.") + } } diff --git a/tests/test_cli.py b/tests/test_cli.py index fad1596..fd93c54 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -32,3 +32,23 @@ def test_cli_init_and_clean(): assert not os.path.exists(os.path.join(tmpdir, "build")) finally: shutil.rmtree(tmpdir, ignore_errors=True) + + +def test_cli_run_prepare_only_android_and_ios(): + tmpdir = tempfile.mkdtemp(prefix="pn_cli_test_") + try: + # init to create app scaffold + result = run_pn(["init", "MyApp"], tmpdir) + assert result.returncode == 0, result.stderr + + # prepare-only android + result = run_pn(["run", "android", "--prepare-only"], tmpdir) + assert result.returncode == 0, result.stderr + assert os.path.isdir(os.path.join(tmpdir, "build", "android", "android_template")) + + # prepare-only ios + result = run_pn(["run", "ios", "--prepare-only"], tmpdir) + assert result.returncode == 0, result.stderr + assert os.path.isdir(os.path.join(tmpdir, "build", "ios", "ios_template")) + finally: + shutil.rmtree(tmpdir, ignore_errors=True) From 4c06b67214ea7fc4530a0d39b7105cfb62d20cf5 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Thu, 9 Oct 2025 13:45:36 -0700 Subject: [PATCH 54/66] feat(components,utils)!: unify constructors; set Android context --- apps/pythonnative_demo/app/main_page.py | 4 +- apps/pythonnative_demo/app/second_page.py | 4 +- docs/api/pythonnative.md | 6 ++ docs/concepts/components.md | 28 +++++++++ docs/getting-started.md | 1 + src/pythonnative/activity_indicator_view.py | 5 +- src/pythonnative/button.py | 5 +- src/pythonnative/cli/pn.py | 4 +- src/pythonnative/image_view.py | 5 +- src/pythonnative/label.py | 5 +- src/pythonnative/page.py | 4 +- src/pythonnative/progress_view.py | 5 +- src/pythonnative/stack_view.py | 5 +- src/pythonnative/switch.py | 5 +- src/pythonnative/text_field.py | 5 +- src/pythonnative/text_view.py | 5 +- src/pythonnative/utils.py | 66 ++++++++++++++++++++- src/pythonnative/web_view.py | 5 +- 18 files changed, 139 insertions(+), 28 deletions(-) diff --git a/apps/pythonnative_demo/app/main_page.py b/apps/pythonnative_demo/app/main_page.py index 6c24d43..d0d3377 100644 --- a/apps/pythonnative_demo/app/main_page.py +++ b/apps/pythonnative_demo/app/main_page.py @@ -7,11 +7,11 @@ def __init__(self, native_instance): def on_create(self): super().on_create() - stack_view = pn.StackView(self.native_instance) + stack_view = pn.StackView() # list_data = ["item_{}".format(i) for i in range(100)] # list_view = pn.ListView(self.native_instance, list_data) # stack_view.add_view(list_view) - button = pn.Button(self.native_instance, "Button") + button = pn.Button("Button") button.set_on_click(lambda: self.navigate_to("")) # button.set_on_click(lambda: print("Button was clicked!")) stack_view.add_view(button) diff --git a/apps/pythonnative_demo/app/second_page.py b/apps/pythonnative_demo/app/second_page.py index 442fb53..9be9495 100644 --- a/apps/pythonnative_demo/app/second_page.py +++ b/apps/pythonnative_demo/app/second_page.py @@ -7,8 +7,8 @@ def __init__(self, native_instance): def on_create(self): super().on_create() - stack_view = pn.StackView(self.native_instance) - label = pn.Label(self.native_instance, "Second page!") + stack_view = pn.StackView() + label = pn.Label("Second page!") stack_view.add_view(label) self.set_root_view(stack_view) diff --git a/docs/api/pythonnative.md b/docs/api/pythonnative.md index c472f3c..744d7a4 100644 --- a/docs/api/pythonnative.md +++ b/docs/api/pythonnative.md @@ -1,3 +1,9 @@ # pythonnative package API reference will be generated here via mkdocstrings. + +Key flags and helpers (0.2.0): + +- `pythonnative.utils.IS_ANDROID`: platform flag with robust detection for Chaquopy/Android. +- `pythonnative.utils.get_android_context()`: returns the current Android Activity/Context when running on Android. +- `pythonnative.utils.set_android_context(ctx)`: set by `pythonnative.Page` on Android; you generally don’t call this directly. diff --git a/docs/concepts/components.md b/docs/concepts/components.md index fdcd235..332a575 100644 --- a/docs/concepts/components.md +++ b/docs/concepts/components.md @@ -1,3 +1,31 @@ # Components High-level overview of PythonNative components and how they map to native UI. + +## Constructor pattern (0.2.0) + +- All core components share a consistent, contextless constructor on both platforms. +- On Android, a `Context` is acquired implicitly from the current `Activity` set by `pn.Page`. +- On iOS, UIKit classes are allocated/initialized directly. + +Examples: + +```python +import pythonnative as pn + +class MainPage(pn.Page): + def __init__(self, native_instance): + super().__init__(native_instance) + + def on_create(self): + super().on_create() + stack = pn.StackView() + stack.add_view(pn.Label("Hello")) + stack.add_view(pn.Button("Tap me")) + stack.add_view(pn.TextField("initial")) + self.set_root_view(stack) +``` + +Notes: +- `pn.Page` stores the Android `Activity` so components like `pn.Button()` and `pn.Label()` can construct their native counterparts. +- If you construct views before the `Page` is created on Android, a runtime error will be raised because no `Context` is available. diff --git a/docs/getting-started.md b/docs/getting-started.md index 82cf697..03d90fa 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -10,5 +10,6 @@ pn --help - Scaffolds `app/`, `pythonnative.json`, `requirements.txt`, `.gitignore` - Run: `pn run android` or `pn run ios` - Uses bundled templates; copies your `app/` into the platform project + - On Android, `pn.Page` provides the Activity context so components can be created without passing a context - Clean: `pn clean` - Removes the `build/` directory safely diff --git a/src/pythonnative/activity_indicator_view.py b/src/pythonnative/activity_indicator_view.py index 81fe9f9..722924e 100644 --- a/src/pythonnative/activity_indicator_view.py +++ b/src/pythonnative/activity_indicator_view.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -31,10 +31,11 @@ def stop_animating(self) -> None: from java import jclass class ActivityIndicatorView(ActivityIndicatorViewBase, ViewBase): - def __init__(self, context) -> None: + def __init__(self) -> None: super().__init__() self.native_class = jclass("android.widget.ProgressBar") # self.native_instance = self.native_class(context, None, android.R.attr.progressBarStyleLarge) + context = get_android_context() self.native_instance = self.native_class(context) self.native_instance.setIndeterminate(True) diff --git a/src/pythonnative/button.py b/src/pythonnative/button.py index 64421e7..56faad7 100644 --- a/src/pythonnative/button.py +++ b/src/pythonnative/button.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Callable -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -36,9 +36,10 @@ def set_on_click(self, callback: Callable[[], None]) -> None: from java import dynamic_proxy, jclass class Button(ButtonBase, ViewBase): - def __init__(self, context, title: str = "") -> None: + def __init__(self, title: str = "") -> None: super().__init__() self.native_class = jclass("android.widget.Button") + context = get_android_context() self.native_instance = self.native_class(context) self.set_title(title) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index bad15ef..82aeed5 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -53,8 +53,8 @@ def __init__(self, native_instance): def on_create(self): super().on_create() - stack = pn.StackView(self.native_instance) - stack.add_view(pn.Label(self.native_instance, \"Hello from PythonNative!\")) + stack = pn.StackView() + stack.add_view(pn.Label(\"Hello from PythonNative!\")) self.set_root_view(stack) """ ) diff --git a/src/pythonnative/image_view.py b/src/pythonnative/image_view.py index 78ce589..78cb1ff 100644 --- a/src/pythonnative/image_view.py +++ b/src/pythonnative/image_view.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -32,9 +32,10 @@ def get_image(self) -> str: from java import jclass class ImageView(ImageViewBase, ViewBase): - def __init__(self, context, image: str = "") -> None: + def __init__(self, image: str = "") -> None: super().__init__() self.native_class = jclass("android.widget.ImageView") + context = get_android_context() self.native_instance = self.native_class(context) if image: self.set_image(image) diff --git a/src/pythonnative/label.py b/src/pythonnative/label.py index 5982c32..c34eec2 100644 --- a/src/pythonnative/label.py +++ b/src/pythonnative/label.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -31,9 +31,10 @@ def get_text(self) -> str: from java import jclass class Label(LabelBase, ViewBase): - def __init__(self, context, text: str = "") -> None: + def __init__(self, text: str = "") -> None: super().__init__() self.native_class = jclass("android.widget.TextView") + context = get_android_context() self.native_instance = self.native_class(context) self.set_text(text) diff --git a/src/pythonnative/page.py b/src/pythonnative/page.py index e465a6b..b10a202 100644 --- a/src/pythonnative/page.py +++ b/src/pythonnative/page.py @@ -31,7 +31,7 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, set_android_context from .view import ViewBase # ======================================== @@ -103,6 +103,8 @@ def __init__(self, native_instance) -> None: self.native_class = jclass("android.app.Activity") self.native_instance = native_instance # self.native_instance = self.native_class() + # Stash the Activity so child views can implicitly acquire a Context + set_android_context(native_instance) def set_root_view(self, view) -> None: self.native_instance.setContentView(view.native_instance) diff --git a/src/pythonnative/progress_view.py b/src/pythonnative/progress_view.py index e802151..c1a08b3 100644 --- a/src/pythonnative/progress_view.py +++ b/src/pythonnative/progress_view.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -31,10 +31,11 @@ def get_progress(self) -> float: from java import jclass class ProgressView(ProgressViewBase, ViewBase): - def __init__(self, context) -> None: + def __init__(self) -> None: super().__init__() self.native_class = jclass("android.widget.ProgressBar") # self.native_instance = self.native_class(context, None, android.R.attr.progressBarStyleHorizontal) + context = get_android_context() self.native_instance = self.native_class(context, None, jclass("android.R$attr").progressBarStyleHorizontal) self.native_instance.setIndeterminate(False) diff --git a/src/pythonnative/stack_view.py b/src/pythonnative/stack_view.py index a2816f4..3fc57b1 100644 --- a/src/pythonnative/stack_view.py +++ b/src/pythonnative/stack_view.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Any, List -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -29,9 +29,10 @@ def add_view(self, view) -> None: from java import jclass class StackView(StackViewBase, ViewBase): - def __init__(self, context) -> None: + def __init__(self) -> None: super().__init__() self.native_class = jclass("android.widget.LinearLayout") + context = get_android_context() self.native_instance = self.native_class(context) self.native_instance.setOrientation(self.native_class.VERTICAL) diff --git a/src/pythonnative/switch.py b/src/pythonnative/switch.py index e271604..bdd38bc 100644 --- a/src/pythonnative/switch.py +++ b/src/pythonnative/switch.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -31,9 +31,10 @@ def is_on(self) -> bool: from java import jclass class Switch(SwitchBase, ViewBase): - def __init__(self, context, value: bool = False) -> None: + def __init__(self, value: bool = False) -> None: super().__init__() self.native_class = jclass("android.widget.Switch") + context = get_android_context() self.native_instance = self.native_class(context) self.set_on(value) diff --git a/src/pythonnative/text_field.py b/src/pythonnative/text_field.py index 44252b8..fcf1288 100644 --- a/src/pythonnative/text_field.py +++ b/src/pythonnative/text_field.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -31,9 +31,10 @@ def get_text(self) -> str: from java import jclass class TextField(TextFieldBase, ViewBase): - def __init__(self, context, text: str = "") -> None: + def __init__(self, text: str = "") -> None: super().__init__() self.native_class = jclass("android.widget.EditText") + context = get_android_context() self.native_instance = self.native_class(context) self.native_instance.setSingleLine(True) self.set_text(text) diff --git a/src/pythonnative/text_view.py b/src/pythonnative/text_view.py index 01f3394..8e9154d 100644 --- a/src/pythonnative/text_view.py +++ b/src/pythonnative/text_view.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -31,9 +31,10 @@ def get_text(self) -> str: from java import jclass class TextView(TextViewBase, ViewBase): - def __init__(self, context, text: str = "") -> None: + def __init__(self, text: str = "") -> None: super().__init__() self.native_class = jclass("android.widget.EditText") + context = get_android_context() self.native_instance = self.native_class(context) self.native_instance.setLines(3) self.native_instance.setMaxLines(5) diff --git a/src/pythonnative/utils.py b/src/pythonnative/utils.py index 653b780..01d3101 100644 --- a/src/pythonnative/utils.py +++ b/src/pythonnative/utils.py @@ -1,3 +1,67 @@ import os +from typing import Any, Optional -IS_ANDROID = "ANDROID_BOOTLOGO" in os.environ +# Platform detection with multiple fallbacks suitable for Chaquopy/Android +_is_android: Optional[bool] = None + + +def _detect_android() -> bool: + # 1) Direct environment hints commonly present on Android + env = os.environ + if "ANDROID_BOOTLOGO" in env or "ANDROID_ROOT" in env or "ANDROID_DATA" in env or "ANDROID_ARGUMENT" in env: + return True + + # 2) Chaquopy-specific: the builtin 'java' package is available + try: + # Import inside try so importing this module doesn't explode off-device + from java import jclass + + _ = jclass # silence linter unused + return True + except Exception: + pass + + # 3) Last resort: some Android Python dists set os.name/others, but avoid false positives + return False + + +def _ensure_platform_detection() -> None: + global _is_android + if _is_android is None: + _is_android = _detect_android() + + +def _get_is_android() -> bool: + _ensure_platform_detection() + assert _is_android is not None + return _is_android + + +IS_ANDROID: bool = _get_is_android() + +# Global hook to access the current Android Activity/Context from Python code +_android_context: Any = None + + +def set_android_context(context: Any) -> None: + """Record the current Android Activity/Context for implicit constructor use. + + On Android, Python UI components require a Context to create native views. + We capture it when a Page is constructed from the host Activity so component + constructors can be platform-consistent and avoid explicit context params. + """ + + global _android_context + _android_context = context + + +def get_android_context() -> Any: + """Return the previously set Android Activity/Context or raise if missing.""" + + if not IS_ANDROID: + raise RuntimeError("get_android_context() called on non-Android platform") + if _android_context is None: + raise RuntimeError( + "Android context is not set. Ensure Page is initialized from an Activity " "before constructing views." + ) + return _android_context diff --git a/src/pythonnative/web_view.py b/src/pythonnative/web_view.py index 60a8117..ee3a16e 100644 --- a/src/pythonnative/web_view.py +++ b/src/pythonnative/web_view.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -27,9 +27,10 @@ def load_url(self, url: str) -> None: from java import jclass class WebView(WebViewBase, ViewBase): - def __init__(self, context, url: str = "") -> None: + def __init__(self, url: str = "") -> None: super().__init__() self.native_class = jclass("android.webkit.WebView") + context = get_android_context() self.native_instance = self.native_class(context) self.load_url(url) From f3a03b01986365063535a2f336793cc6f21836db Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Thu, 9 Oct 2025 14:03:28 -0700 Subject: [PATCH 55/66] docs(mkdocs): update Getting Started, Hello World, Components, and platform guides --- docs/concepts/components.md | 20 +++++++++++ docs/examples/hello-world.md | 29 ++++++++++++++- docs/getting-started.md | 68 +++++++++++++++++++++++++++++++----- docs/guides/android.md | 13 +++++++ docs/guides/ios.md | 12 +++++++ 5 files changed, 133 insertions(+), 9 deletions(-) diff --git a/docs/concepts/components.md b/docs/concepts/components.md index 332a575..e1e33aa 100644 --- a/docs/concepts/components.md +++ b/docs/concepts/components.md @@ -29,3 +29,23 @@ class MainPage(pn.Page): Notes: - `pn.Page` stores the Android `Activity` so components like `pn.Button()` and `pn.Label()` can construct their native counterparts. - If you construct views before the `Page` is created on Android, a runtime error will be raised because no `Context` is available. + +## Core components (0.2.0) + +Stabilized with contextless constructors on both platforms: + +- `Page` +- `StackView` +- `Label`, `Button` +- `ImageView` +- `TextField`, `TextView` +- `Switch` +- `ProgressView`, `ActivityIndicatorView` +- `WebView` + +APIs are intentionally small and grow progressively in later releases. Properties and setters are kept consistent where supported by both platforms. + +## Platform detection and Android context + +- Use `pythonnative.utils.IS_ANDROID` for platform checks when needed. +- On Android, `Page` records the current `Activity` so child views can acquire a `Context` implicitly. Constructing views before `Page` initialization will raise. diff --git a/docs/examples/hello-world.md b/docs/examples/hello-world.md index c513a9b..b939317 100644 --- a/docs/examples/hello-world.md +++ b/docs/examples/hello-world.md @@ -1,3 +1,30 @@ # Hello World -A minimal placeholder example. Replace with a real example later. +Create a simple page with a label and a button. + +```python +import pythonnative as pn + + +class MainPage(pn.Page): + def __init__(self, native_instance): + super().__init__(native_instance) + + def on_create(self): + super().on_create() + stack = pn.StackView() + label = pn.Label("Hello, world!") + button = pn.Button("Tap me") + button.set_on_click(lambda: print("Hello tapped")) + stack.add_view(label) + stack.add_view(button) + self.set_root_view(stack) +``` + +Run it: + +```bash +pn run android +# or +pn run ios +``` diff --git a/docs/getting-started.md b/docs/getting-started.md index 03d90fa..1395300 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -5,11 +5,63 @@ pip install pythonnative pn --help ``` -- Install: `pip install pythonnative` -- Create a project: `pn init my_app` - - Scaffolds `app/`, `pythonnative.json`, `requirements.txt`, `.gitignore` -- Run: `pn run android` or `pn run ios` - - Uses bundled templates; copies your `app/` into the platform project - - On Android, `pn.Page` provides the Activity context so components can be created without passing a context -- Clean: `pn clean` - - Removes the `build/` directory safely +## Create a project + +```bash +pn init MyApp +``` + +This scaffolds: + +- `app/` with a minimal `main_page.py` +- `pythonnative.json` project config +- `requirements.txt` +- `.gitignore` + +A minimal `app/main_page.py` looks like: + +```python +import pythonnative as pn + + +class MainPage(pn.Page): + def __init__(self, native_instance): + super().__init__(native_instance) + + def on_create(self): + super().on_create() + stack = pn.StackView() + stack.add_view(pn.Label("Hello from PythonNative!")) + button = pn.Button("Tap me") + button.set_on_click(lambda: print("Button clicked")) + stack.add_view(button) + self.set_root_view(stack) +``` + +## Run on a platform + +```bash +pn run android +# or +pn run ios +``` + +- Uses bundled templates (no network required for scaffolding) +- Copies your `app/` into the generated project + +If you just want to scaffold the platform project without building, use: + +```bash +pn run android --prepare-only +pn run ios --prepare-only +``` + +This stages files under `build/` so you can open them in Android Studio or Xcode. + +## Clean + +Remove the build artifacts safely: + +```bash +pn clean +``` diff --git a/docs/guides/android.md b/docs/guides/android.md index 6bccdf4..5e939dd 100644 --- a/docs/guides/android.md +++ b/docs/guides/android.md @@ -21,3 +21,16 @@ pn run android --prepare-only ``` This will stage files under `build/android/android_template` so you can open it in Android Studio if you prefer. + +## Clean + +Remove the build directory safely: + +```bash +pn clean +``` + +## Troubleshooting + +- If `gradlew` fails due to JDK path on macOS, ensure `JAVA_HOME` is set (the CLI attempts to detect Homebrew `openjdk@17`). +- Ensure an Android emulator or device is available for `installDebug`. diff --git a/docs/guides/ios.md b/docs/guides/ios.md index b497f9a..a0a400f 100644 --- a/docs/guides/ios.md +++ b/docs/guides/ios.md @@ -21,3 +21,15 @@ pn run ios --prepare-only ``` You can then open `build/ios/ios_template/ios_template.xcodeproj` in Xcode. + +## Clean + +Remove the build directory safely: + +```bash +pn clean +``` + +## Notes + +- Building and running for Simulator via the CLI is best-effort. Opening the generated project in Xcode is recommended for iterative development. From 2805e1d5c6a58eb718b94ba0ce57c1078a08d578 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Sun, 12 Oct 2025 20:52:04 -0700 Subject: [PATCH 56/66] feat(cli,templates,core): bootstrap entrypoint; pn run shows Hello UI --- apps/pythonnative_demo/app/main_page.py | 21 +++--- docs/getting-started.md | 7 ++ src/pythonnative/cli/pn.py | 75 ++++++++++++++++++- src/pythonnative/page.py | 11 ++- .../android_template/MainActivity.kt | 17 +++-- .../ios_template/ViewController.swift | 26 ++++--- tests/test_cli.py | 6 ++ 7 files changed, 137 insertions(+), 26 deletions(-) diff --git a/apps/pythonnative_demo/app/main_page.py b/apps/pythonnative_demo/app/main_page.py index d0d3377..bbc2211 100644 --- a/apps/pythonnative_demo/app/main_page.py +++ b/apps/pythonnative_demo/app/main_page.py @@ -7,15 +7,12 @@ def __init__(self, native_instance): def on_create(self): super().on_create() - stack_view = pn.StackView() - # list_data = ["item_{}".format(i) for i in range(100)] - # list_view = pn.ListView(self.native_instance, list_data) - # stack_view.add_view(list_view) - button = pn.Button("Button") - button.set_on_click(lambda: self.navigate_to("")) - # button.set_on_click(lambda: print("Button was clicked!")) - stack_view.add_view(button) - self.set_root_view(stack_view) + stack = pn.StackView() + stack.add_view(pn.Label("Hello from PythonNative Demo!")) + button = pn.Button("Tap me") + button.set_on_click(lambda: print("Demo button clicked")) + stack.add_view(button) + self.set_root_view(stack) def on_start(self): super().on_start() @@ -40,3 +37,9 @@ def on_save_instance_state(self): def on_restore_instance_state(self): super().on_restore_instance_state() + + +def bootstrap(native_instance): + page = MainPage(native_instance) + page.on_create() + return page diff --git a/docs/getting-started.md b/docs/getting-started.md index 1395300..bd5fb67 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -36,6 +36,13 @@ class MainPage(pn.Page): button.set_on_click(lambda: print("Button clicked")) stack.add_view(button) self.set_root_view(stack) + + +def bootstrap(native_instance): + """Entry point called by the host app (Activity or ViewController).""" + page = MainPage(native_instance) + page.on_create() + return page ``` ## Run on a platform diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index 82aeed5..06bd30d 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -54,8 +54,18 @@ def __init__(self, native_instance): def on_create(self): super().on_create() stack = pn.StackView() - stack.add_view(pn.Label(\"Hello from PythonNative!\")) + stack.add_view(pn.Label("Hello from PythonNative!")) + button = pn.Button("Tap me") + button.set_on_click(lambda: print("Button clicked")) + stack.add_view(button) self.set_root_view(stack) + + +def bootstrap(native_instance): + '''Entry point called by the host app (Android Activity or iOS ViewController).''' + page = MainPage(native_instance) + page.on_create() + return page """ ) @@ -243,10 +253,11 @@ def run_project(args: argparse.Namespace) -> None: check=True, ) elif platform == "ios": - # Attempt to build the iOS project for Simulator (best-effort) + # Attempt to build and run on iOS Simulator (best-effort) ios_project_dir: str = os.path.join(build_dir, "ios_template") if os.path.isdir(ios_project_dir): os.chdir(ios_project_dir) + derived_data = os.path.join(ios_project_dir, "build") try: subprocess.run( [ @@ -255,14 +266,74 @@ def run_project(args: argparse.Namespace) -> None: "ios_template.xcodeproj", "-scheme", "ios_template", + "-configuration", + "Debug", "-destination", "platform=iOS Simulator,name=iPhone 15", + "-derivedDataPath", + derived_data, "build", ], check=False, ) except FileNotFoundError: print("xcodebuild not found. Skipping iOS build step.") + return + + # Locate built app + app_path = os.path.join(derived_data, "Build", "Products", "Debug-iphonesimulator", "ios_template.app") + if not os.path.isdir(app_path): + print("Could not locate built .app; open the project in Xcode to run.") + return + + # Copy staged Python app into the .app bundle so PythonKit can import it + try: + staged_app_src = os.path.join(build_dir, "app") + if os.path.isdir(staged_app_src): + shutil.copytree(staged_app_src, os.path.join(app_path, "app"), dirs_exist_ok=True) + except Exception: + # Non-fatal; fallback UI will appear if import fails + pass + + # Find an available simulator and boot it + try: + import json as _json + + result = subprocess.run( + ["xcrun", "simctl", "list", "devices", "available", "--json"], + check=False, + capture_output=True, + text=True, + ) + devices_json = _json.loads(result.stdout or "{}") + all_devices = [] + for _runtime, devices in (devices_json.get("devices") or {}).items(): + all_devices.extend(devices or []) + # Prefer iPhone 15/15 Pro names; else first available iPhone + preferred = None + for d in all_devices: + name = (d.get("name") or "").lower() + if "iphone 15" in name and d.get("isAvailable"): + preferred = d + break + if not preferred: + for d in all_devices: + if d.get("isAvailable") and (d.get("name") or "").lower().startswith("iphone"): + preferred = d + break + if not preferred: + print("No available iOS Simulators found; open the project in Xcode to run.") + return + + udid = preferred.get("udid") + # Boot (no-op if already booted) + subprocess.run(["xcrun", "simctl", "boot", udid], check=False) + # Install and launch + subprocess.run(["xcrun", "simctl", "install", udid, app_path], check=False) + subprocess.run(["xcrun", "simctl", "launch", udid, "com.pythonnative.ios-template"], check=False) + print("Launched iOS app on Simulator (best-effort).") + except Exception: + print("Failed to auto-run on Simulator; open the project in Xcode to run.") def clean_project(args: argparse.Namespace) -> None: diff --git a/src/pythonnative/page.py b/src/pythonnative/page.py index b10a202..bc85d23 100644 --- a/src/pythonnative/page.py +++ b/src/pythonnative/page.py @@ -160,7 +160,16 @@ def __init__(self, native_instance) -> None: # self.native_instance = self.native_class.alloc().init() def set_root_view(self, view) -> None: - self.native_instance.view().addSubview_(view.native_instance) + root_view = self.native_instance.view() + # Size the root child to fill the controller's view and enable autoresizing + try: + bounds = root_view.bounds() + view.native_instance.setFrame_(bounds) + # UIViewAutoresizingFlexibleWidth (2) | UIViewAutoresizingFlexibleHeight (16) + view.native_instance.setAutoresizingMask_(2 | 16) + except Exception: + pass + root_view.addSubview_(view.native_instance) def on_create(self) -> None: print("iOS on_create() called") diff --git a/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt b/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt index c8f2910..71648a7 100644 --- a/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +++ b/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt @@ -2,7 +2,7 @@ package com.pythonnative.android_template import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.view.View +import android.widget.TextView import com.chaquo.python.Python import com.chaquo.python.android.AndroidPlatform @@ -15,9 +15,16 @@ class MainActivity : AppCompatActivity() { if (!Python.isStarted()) { Python.start(AndroidPlatform(this)) } - val py = Python.getInstance() - val pyModule = py.getModule("app/main") - val pyLayout = pyModule.callAttr("main", this).toJava(View::class.java) - setContentView(pyLayout) + try { + val py = Python.getInstance() + val pyModule = py.getModule("app.main_page") + pyModule.callAttr("bootstrap", this) + // Python Page will set the content view via set_root_view + } catch (e: Exception) { + // Fallback: show a simple native label if Python bootstrap fails + val tv = TextView(this) + tv.text = "Hello from PythonNative (Android template)" + setContentView(tv) + } } } \ No newline at end of file diff --git a/templates/ios_template/ios_template/ViewController.swift b/templates/ios_template/ios_template/ViewController.swift index 6792657..3ab2b96 100644 --- a/templates/ios_template/ios_template/ViewController.swift +++ b/templates/ios_template/ios_template/ViewController.swift @@ -12,19 +12,27 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - // Minimal PythonKit bootstrap: print Python version and attempt to import Rubicon. + // Attempt Python bootstrap of app.main_page.bootstrap(self) let sys = Python.import("sys") - print("Python Version: \(sys.version_info.major).\(sys.version_info.minor)") - print("Python Path: \(sys.path)") - - // Try to import Rubicon-ObjC if available. Safe no-op if not present. + if let resourcePath = Bundle.main.resourcePath { + sys.path.append(resourcePath) + sys.path.append("\(resourcePath)/app") + } do { - let rubiconObjC = try Python.attemptImport("rubicon.objc") - let ObjCClass = rubiconObjC.ObjCClass - print("Rubicon available: \(ObjCClass)") + let app = try Python.attemptImport("app.main_page") + let bootstrap = app.bootstrap + _ = bootstrap(self) + return } catch { - print("Rubicon not available; continuing without it.") + print("Python bootstrap failed: \(error)") } + + // Fallback UI if Python import/bootstrap fails + let label = UILabel(frame: view.bounds) + label.text = "Hello from PythonNative (iOS template)" + label.textAlignment = .center + label.autoresizingMask = [.flexibleWidth, .flexibleHeight] + view.addSubview(label) } diff --git a/tests/test_cli.py b/tests/test_cli.py index fd93c54..25b4991 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -17,6 +17,12 @@ def test_cli_init_and_clean(): result = run_pn(["init", "MyApp"], tmpdir) assert result.returncode == 0, result.stderr assert os.path.isdir(os.path.join(tmpdir, "app")) + # scaffolded entrypoint + main_page_path = os.path.join(tmpdir, "app", "main_page.py") + assert os.path.isfile(main_page_path) + with open(main_page_path, "r", encoding="utf-8") as f: + content = f.read() + assert "def bootstrap(" in content assert os.path.isfile(os.path.join(tmpdir, "pythonnative.json")) assert os.path.isfile(os.path.join(tmpdir, "requirements.txt")) assert os.path.isfile(os.path.join(tmpdir, ".gitignore")) From b3dd731bd5efcca8e1a47f8f888fc6123854a40c Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Sun, 12 Oct 2025 21:49:41 -0700 Subject: [PATCH 57/66] feat(cli,templates): dev-first templates; stage in-repo lib for pn run --- src/pythonnative/cli/pn.py | 47 +++++++++++++++---- .../android_template/MainActivity.kt | 2 + 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index 06bd30d..c8c6178 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -104,7 +104,20 @@ def _extract_bundled_template(zip_name: str, destination: str) -> None: Extract a bundled template zip into the destination directory. Tries package resources first; falls back to repo root `templates/` at dev time. """ - # Try to load from installed package resources first (if templates are packaged inside the module) + # Dev-first: prefer repository templates if running from a checkout (avoid stale packaged zips) + try: + # __file__ -> src/pythonnative/cli/pn.py, so go up to src/, then to repo root + src_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + repo_root = os.path.abspath(os.path.join(src_dir, "..")) + repo_templates = os.path.join(repo_root, "templates") + candidate = os.path.join(repo_templates, zip_name) + if os.path.exists(candidate): + _extract_zip_to_destination(candidate, destination) + return + except Exception: + pass + + # Try to load from installed package resources next (if templates are packaged inside the module) try: cand = resources.files("pythonnative").joinpath("templates").joinpath(zip_name) with resources.as_file(cand) as p: @@ -139,14 +152,6 @@ def _extract_bundled_template(zip_name: str, destination: str) -> None: except Exception: pass - # Fallback: use repository-level templates directory - repo_templates = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "..", "..", "templates") - repo_templates = os.path.abspath(repo_templates) - candidate = os.path.join(repo_templates, zip_name) - if os.path.exists(candidate): - _extract_zip_to_destination(candidate, destination) - return - raise FileNotFoundError(f"Could not find bundled template {zip_name}. Ensure templates are packaged.") @@ -206,6 +211,25 @@ def run_project(args: argparse.Namespace) -> None: os.makedirs(dest_dir, exist_ok=True) shutil.copytree(src_dir, dest_dir, dirs_exist_ok=True) + # During local development (running from repository), also bundle the + # local library sources so the app uses the in-repo version instead of + # the PyPI package. This provides faster inner-loop iteration and avoids + # version skew during development. + try: + # __file__ -> src/pythonnative/cli/pn.py, so repo root is one up from src/ + src_root = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), "..")) + local_lib = os.path.join(src_root, "pythonnative") + if os.path.isdir(local_lib): + if platform == "android": + python_root = os.path.join(build_dir, "android_template", "app", "src", "main", "python") + else: + python_root = os.path.join(build_dir) # staged at build/ios/app for iOS below + os.makedirs(python_root, exist_ok=True) + shutil.copytree(local_lib, os.path.join(python_root, "pythonnative"), dirs_exist_ok=True) + except Exception: + # Non-fatal; fallback to the packaged PyPI dependency if present + pass + # Install any necessary Python packages into the project environment # Skip installation during prepare-only to avoid network access and speed up scaffolding if not prepare_only: @@ -291,6 +315,11 @@ def run_project(args: argparse.Namespace) -> None: staged_app_src = os.path.join(build_dir, "app") if os.path.isdir(staged_app_src): shutil.copytree(staged_app_src, os.path.join(app_path, "app"), dirs_exist_ok=True) + # Also copy local library sources if present for dev flow + src_root = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), "..")) + local_lib = os.path.join(src_root, "pythonnative") + if os.path.isdir(local_lib): + shutil.copytree(local_lib, os.path.join(app_path, "pythonnative"), dirs_exist_ok=True) except Exception: # Non-fatal; fallback UI will appear if import fails pass diff --git a/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt b/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt index 71648a7..c0bc76e 100644 --- a/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +++ b/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt @@ -2,6 +2,7 @@ package com.pythonnative.android_template import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log import android.widget.TextView import com.chaquo.python.Python import com.chaquo.python.android.AndroidPlatform @@ -21,6 +22,7 @@ class MainActivity : AppCompatActivity() { pyModule.callAttr("bootstrap", this) // Python Page will set the content view via set_root_view } catch (e: Exception) { + Log.e("PythonNative", "Python bootstrap failed", e) // Fallback: show a simple native label if Python bootstrap fails val tv = TextView(this) tv.text = "Hello from PythonNative (Android template)" From 7b7c59c262f2510a5fb46e455c13a2fc56086845 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Sun, 12 Oct 2025 22:13:39 -0700 Subject: [PATCH 58/66] feat(cli,templates): auto-select iOS sim; guard PythonKit --- src/pythonnative/cli/pn.py | 30 +++++++++++++++++-- .../ios_template/ViewController.swift | 6 ++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index c8c6178..3d3d16c 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -283,6 +283,33 @@ def run_project(args: argparse.Namespace) -> None: os.chdir(ios_project_dir) derived_data = os.path.join(ios_project_dir, "build") try: + # Detect a simulator UDID to target: prefer Booted; else any iPhone + sim_udid: str | None = None + try: + import json as _json + + devices_out = subprocess.run( + ["xcrun", "simctl", "list", "devices", "available", "--json"], + check=False, + capture_output=True, + text=True, + ) + devs = (_json.loads(devices_out.stdout or "{}").get("devices") or {}) + all_devs = [d for lst in devs.values() for d in (lst or [])] + for d in all_devs: + if d.get("state") == "Booted": + sim_udid = d.get("udid") + break + if not sim_udid: + for d in all_devs: + if (d.get("isAvailable") or d.get("availability")) and (d.get("name") or "").lower().startswith("iphone"): + sim_udid = d.get("udid") + break + except Exception: + pass + + xcode_dest = ["-destination", f"id={sim_udid}"] if sim_udid else ["-destination", "platform=iOS Simulator"] + subprocess.run( [ "xcodebuild", @@ -292,8 +319,7 @@ def run_project(args: argparse.Namespace) -> None: "ios_template", "-configuration", "Debug", - "-destination", - "platform=iOS Simulator,name=iPhone 15", + *xcode_dest, "-derivedDataPath", derived_data, "build", diff --git a/templates/ios_template/ios_template/ViewController.swift b/templates/ios_template/ios_template/ViewController.swift index 3ab2b96..2b17656 100644 --- a/templates/ios_template/ios_template/ViewController.swift +++ b/templates/ios_template/ios_template/ViewController.swift @@ -6,12 +6,17 @@ // import UIKit +// PythonKit isn't available on iOS by default; guard its use so the +// template builds out of the box and falls back to a native label. +#if canImport(PythonKit) import PythonKit +#endif class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + #if canImport(PythonKit) // Attempt Python bootstrap of app.main_page.bootstrap(self) let sys = Python.import("sys") if let resourcePath = Bundle.main.resourcePath { @@ -26,6 +31,7 @@ class ViewController: UIViewController { } catch { print("Python bootstrap failed: \(error)") } + #endif // Fallback UI if Python import/bootstrap fails let label = UILabel(frame: view.bounds) From b38da78dac52e42968efa6f4115b6b84de65b3b5 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Mon, 13 Oct 2025 01:02:49 -0700 Subject: [PATCH 59/66] refactor(cli): make pn.py typing py3.9-compatible and wrap long lines --- src/pythonnative/cli/pn.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index 3d3d16c..dac2641 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -7,6 +7,7 @@ import sysconfig import zipfile from importlib import resources +from typing import Any, Dict, List, Optional def init_project(args: argparse.Namespace) -> None: @@ -284,7 +285,7 @@ def run_project(args: argparse.Namespace) -> None: derived_data = os.path.join(ios_project_dir, "build") try: # Detect a simulator UDID to target: prefer Booted; else any iPhone - sim_udid: str | None = None + sim_udid: Optional[str] = None try: import json as _json @@ -294,7 +295,7 @@ def run_project(args: argparse.Namespace) -> None: capture_output=True, text=True, ) - devs = (_json.loads(devices_out.stdout or "{}").get("devices") or {}) + devs = _json.loads(devices_out.stdout or "{}").get("devices") or {} all_devs = [d for lst in devs.values() for d in (lst or [])] for d in all_devs: if d.get("state") == "Booted": @@ -302,13 +303,17 @@ def run_project(args: argparse.Namespace) -> None: break if not sim_udid: for d in all_devs: - if (d.get("isAvailable") or d.get("availability")) and (d.get("name") or "").lower().startswith("iphone"): + if (d.get("isAvailable") or d.get("availability")) and ( + d.get("name") or "" + ).lower().startswith("iphone"): sim_udid = d.get("udid") break except Exception: pass - xcode_dest = ["-destination", f"id={sim_udid}"] if sim_udid else ["-destination", "platform=iOS Simulator"] + xcode_dest = ( + ["-destination", f"id={sim_udid}"] if sim_udid else ["-destination", "platform=iOS Simulator"] + ) subprocess.run( [ @@ -361,7 +366,7 @@ def run_project(args: argparse.Namespace) -> None: text=True, ) devices_json = _json.loads(result.stdout or "{}") - all_devices = [] + all_devices: List[Dict[str, Any]] = [] for _runtime, devices in (devices_json.get("devices") or {}).items(): all_devices.extend(devices or []) # Prefer iPhone 15/15 Pro names; else first available iPhone From bcc0916a5b7427874ab7a5971a6a9941c4222c77 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Mon, 13 Oct 2025 13:40:29 -0700 Subject: [PATCH 60/66] feat(cli,templates,core): fetch iOS Python runtime and bootstrap PythonKit --- apps/pythonnative_demo/app/main_page.py | 20 ++ src/pythonnative/button.py | 33 +++- src/pythonnative/cli/pn.py | 175 +++++++++++++++++- src/pythonnative/page.py | 13 +- .../ios_template.xcodeproj/project.pbxproj | 53 +++++- .../ios_template/ViewController.swift | 80 +++++++- 6 files changed, 353 insertions(+), 21 deletions(-) diff --git a/apps/pythonnative_demo/app/main_page.py b/apps/pythonnative_demo/app/main_page.py index bbc2211..8a36892 100644 --- a/apps/pythonnative_demo/app/main_page.py +++ b/apps/pythonnative_demo/app/main_page.py @@ -1,5 +1,13 @@ import pythonnative as pn +try: + # Optional: used for styling below; safe if rubicon isn't available + from rubicon.objc import ObjCClass + + UIColor = ObjCClass("UIColor") +except Exception: # pragma: no cover + UIColor = None + class MainPage(pn.Page): def __init__(self, native_instance): @@ -8,9 +16,21 @@ def __init__(self, native_instance): def on_create(self): super().on_create() stack = pn.StackView() + # Ensure vertical stacking + try: + stack.native_instance.setAxis_(1) # 1 = vertical + except Exception: + pass stack.add_view(pn.Label("Hello from PythonNative Demo!")) button = pn.Button("Tap me") button.set_on_click(lambda: print("Demo button clicked")) + # Make the button visually obvious + try: + if UIColor is not None: + button.native_instance.setBackgroundColor_(UIColor.systemBlueColor()) + button.native_instance.setTitleColor_forState_(UIColor.whiteColor(), 0) + except Exception: + pass stack.add_view(button) self.set_root_view(stack) diff --git a/src/pythonnative/button.py b/src/pythonnative/button.py index 56faad7..13e38b1 100644 --- a/src/pythonnative/button.py +++ b/src/pythonnative/button.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Callable +from typing import Callable, Optional from .utils import IS_ANDROID, get_android_context from .view import ViewBase @@ -67,7 +67,24 @@ def onClick(self, view): # https://developer.apple.com/documentation/uikit/uibutton # ======================================== - from rubicon.objc import SEL, ObjCClass + from rubicon.objc import SEL, ObjCClass, objc_method + + NSObject = ObjCClass("NSObject") + + # Mypy cannot understand Rubicon's dynamic subclassing; ignore the base type here. + class _PNButtonHandler(NSObject): # type: ignore[valid-type] + # Set by the Button when wiring up the target/action callback. + _callback: Optional[Callable[[], None]] = None + + @objc_method + def onTap_(self, sender) -> None: + try: + callback = self._callback + if callback is not None: + callback() + except Exception: + # Swallow exceptions to avoid crashing the app; logging is handled at higher levels + pass class Button(ButtonBase, ViewBase): def __init__(self, title: str = "") -> None: @@ -83,8 +100,10 @@ def get_title(self) -> str: return self.native_instance.titleForState_(0) def set_on_click(self, callback: Callable[[], None]) -> None: - def objc_callback(_cmd, sender): - callback() - - action = SEL(objc_callback) - self.native_instance.addTarget_action_forControlEvents_(self.native_instance, action, 1) + # Create a handler object with an Objective-C method `onTap:` and attach the Python callback + handler = _PNButtonHandler.new() + # Keep strong references to the handler and callback + self._click_handler = handler + handler._callback = callback + # UIControlEventTouchUpInside = 1 << 6 + self.native_instance.addTarget_action_forControlEvents_(handler, SEL("onTap:"), 1 << 6) diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index dac2641..90b92cc 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -1,10 +1,12 @@ import argparse +import hashlib import json import os import shutil import subprocess import sys import sysconfig +import urllib.request import zipfile from importlib import resources from typing import Any, Dict, List, Optional @@ -156,6 +158,40 @@ def _extract_bundled_template(zip_name: str, destination: str) -> None: raise FileNotFoundError(f"Could not find bundled template {zip_name}. Ensure templates are packaged.") +def _github_json(url: str) -> Any: + req = urllib.request.Request(url, headers={"User-Agent": "pythonnative-cli"}) + with urllib.request.urlopen(req) as r: + return json.loads(r.read().decode("utf-8")) + + +def _resolve_python_apple_support_asset( + py_major_minor: str = "3.11", preferred_name: str = "Python-3.11-iOS-support.b7.tar.gz" +) -> Optional[str]: + """ + Find a browser_download_url for a Python-Apple-support asset on GitHub Releases. + Prefers an exact name match (preferred_name). Falls back to the newest + asset whose name contains "Python-{py_major_minor}-iOS-support" and endswith .tar.gz. + """ + try: + releases = _github_json("https://api.github.com/repos/beeware/Python-Apple-support/releases?per_page=100") + # Search all releases for preferred_name first + for rel in releases: + for a in rel.get("assets", []) or []: + name = a.get("name") or "" + if name == preferred_name: + return a.get("browser_download_url") + # Fallback: any matching Python-{version}-iOS-support*.tar.gz (take first encountered) + needle = f"Python-{py_major_minor}-iOS-support" + for rel in releases: + for a in rel.get("assets", []) or []: + name = a.get("name") or "" + if needle in name and name.endswith(".tar.gz"): + return a.get("browser_download_url") + except Exception: + pass + return None + + def create_android_project(project_name: str, destination: str) -> None: """ Create a new Android project using a template. @@ -281,6 +317,55 @@ def run_project(args: argparse.Namespace) -> None: # Attempt to build and run on iOS Simulator (best-effort) ios_project_dir: str = os.path.join(build_dir, "ios_template") if os.path.isdir(ios_project_dir): + # Stage embedded Python runtime inputs by downloading pinned assets + try: + assets_dir = os.path.join(build_dir, "ios_runtime") + os.makedirs(assets_dir, exist_ok=True) + # Pinned preferred asset name and checksum (b7) + preferred_name = "Python-3.11-iOS-support.b7.tar.gz" + sha256 = "2b7d8589715b9890e8dd7e1bce91c210bb5287417e17b9af120fc577675ed28e" + # Resolve a working download URL from GitHub Releases + url = _resolve_python_apple_support_asset("3.11", preferred_name=preferred_name) + if not url: + raise RuntimeError("Could not resolve Python-Apple-support asset URL from GitHub Releases.") + tar_path = os.path.join(assets_dir, os.path.basename(url)) + if not os.path.exists(tar_path): + print("Downloading Python-Apple-support (3.11 iOS)") + req = urllib.request.Request(url, headers={"User-Agent": "pythonnative-cli"}) + with urllib.request.urlopen(req) as r, open(tar_path, "wb") as f: + f.write(r.read()) + # Verify checksum + h = hashlib.sha256() + with open(tar_path, "rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + h.update(chunk) + if h.hexdigest() != sha256: + raise RuntimeError("SHA256 mismatch for Python-Apple-support tarball") + # Extract only once + extract_root = os.path.join(assets_dir, "extracted") + if not os.path.isdir(extract_root): + os.makedirs(extract_root, exist_ok=True) + subprocess.run(["tar", "-xzf", tar_path, "-C", extract_root], check=True) + # Provide Python.xcframework to the Xcode project and stdlib for bundling + # Try both common layouts + cand_frameworks = [ + os.path.join(extract_root, "Python.xcframework"), + os.path.join(extract_root, "support", "Python.xcframework"), + ] + xc_src = next((p for p in cand_frameworks if os.path.isdir(p)), None) + if xc_src: + shutil.copytree(xc_src, os.path.join(ios_project_dir, "Python.xcframework"), dirs_exist_ok=True) + # Stdlib path + cand_stdlib = [ + os.path.join(extract_root, "Python.xcframework", "ios-arm64_x86_64-simulator", "lib", "python3.11"), + os.path.join( + extract_root, "support", "Python.xcframework", "ios-arm64_x86_64-simulator", "lib", "python3.11" + ), + ] + stdlib_src = next((p for p in cand_stdlib if os.path.isdir(p)), None) + except Exception as e: + print(f"Warning: failed to prepare Python runtime: {e}") + os.chdir(ios_project_dir) derived_data = os.path.join(ios_project_dir, "build") try: @@ -315,6 +400,32 @@ def run_project(args: argparse.Namespace) -> None: ["-destination", f"id={sim_udid}"] if sim_udid else ["-destination", "platform=iOS Simulator"] ) + # Provide header and lib paths for CPython (Simulator slice) ONLY if the + # XCFramework is not already added to the Xcode project. When the project + # contains `Python.xcframework`, Xcode manages headers and linking to avoid + # duplicate module.modulemap definitions. + extra_xcode_settings: list[str] = [] + try: + xc_present = os.path.isdir(os.path.join(ios_project_dir, "Python.xcframework")) + if not xc_present and "extract_root" in locals(): + sim_headers = os.path.join( + extract_root, "Python.xcframework", "ios-arm64_x86_64-simulator", "Headers" + ) + sim_lib = os.path.join( + extract_root, "Python.xcframework", "ios-arm64_x86_64-simulator", "libPython3.11.a" + ) + if os.path.isdir(sim_headers): + extra_xcode_settings.extend( + [ + f"HEADER_SEARCH_PATHS={sim_headers}", + f"SWIFT_INCLUDE_PATHS={sim_headers}", + ] + ) + if os.path.exists(sim_lib): + extra_xcode_settings.append(f"OTHER_LDFLAGS=-force_load {sim_lib}") + except Exception: + pass + subprocess.run( [ "xcodebuild", @@ -328,6 +439,7 @@ def run_project(args: argparse.Namespace) -> None: "-derivedDataPath", derived_data, "build", + *extra_xcode_settings, ], check=False, ) @@ -341,7 +453,7 @@ def run_project(args: argparse.Namespace) -> None: print("Could not locate built .app; open the project in Xcode to run.") return - # Copy staged Python app into the .app bundle so PythonKit can import it + # Copy staged Python app and optional embedded runtime into the .app bundle try: staged_app_src = os.path.join(build_dir, "app") if os.path.isdir(staged_app_src): @@ -351,6 +463,67 @@ def run_project(args: argparse.Namespace) -> None: local_lib = os.path.join(src_root, "pythonnative") if os.path.isdir(local_lib): shutil.copytree(local_lib, os.path.join(app_path, "pythonnative"), dirs_exist_ok=True) + # Copy stdlib from downloaded support if available + if "stdlib_src" in locals() and stdlib_src and os.path.isdir(stdlib_src): + shutil.copytree(stdlib_src, os.path.join(app_path, "python-stdlib"), dirs_exist_ok=True) + # Embed Python.framework for Simulator so PythonKit can dlopen it (from downloaded XCFramework) + sim_fw = None + if "extract_root" in locals(): + cand_fw = [ + os.path.join( + extract_root, "Python.xcframework", "ios-arm64_x86_64-simulator", "Python.framework" + ), + os.path.join( + extract_root, + "support", + "Python.xcframework", + "ios-arm64_x86_64-simulator", + "Python.framework", + ), + ] + sim_fw = next((p for p in cand_fw if os.path.isdir(p)), None) + fw_dest_dir = os.path.join(app_path, "Frameworks") + os.makedirs(fw_dest_dir, exist_ok=True) + if sim_fw and os.path.isdir(sim_fw): + shutil.copytree(sim_fw, os.path.join(fw_dest_dir, "Python.framework"), dirs_exist_ok=True) + # Install rubicon-objc into platform-site + + # Ensure importlib.metadata finds package metadata for rubicon-objc by + # installing it into a site-like dir that is on sys.path (platform-site). + try: + tmp_site = os.path.join(build_dir, "ios_site") + if os.path.isdir(tmp_site): + shutil.rmtree(tmp_site) + os.makedirs(tmp_site, exist_ok=True) + # Install pure-Python rubicon-objc distribution metadata and package + subprocess.run( + [ + sys.executable, + "-m", + "pip", + "install", + "--no-deps", + "--upgrade", + "rubicon-objc", + "-t", + tmp_site, + ], + check=False, + ) + platform_site_dir = os.path.join(app_path, "platform-site") + os.makedirs(platform_site_dir, exist_ok=True) + for entry in os.listdir(tmp_site): + src_entry = os.path.join(tmp_site, entry) + dst_entry = os.path.join(platform_site_dir, entry) + if os.path.isdir(src_entry): + shutil.copytree(src_entry, dst_entry, dirs_exist_ok=True) + else: + shutil.copy2(src_entry, dst_entry) + except Exception: + # Non-fatal; if metadata isn't present, rubicon import may fail and fallback UI will appear + pass + # Note: Python.xcframework provides a static library for Simulator; it must be linked at build time. + # We copy the XCFramework into the project directory above so Xcode can link it. except Exception: # Non-fatal; fallback UI will appear if import fails pass diff --git a/src/pythonnative/page.py b/src/pythonnative/page.py index bc85d23..70301f6 100644 --- a/src/pythonnative/page.py +++ b/src/pythonnative/page.py @@ -150,20 +150,27 @@ def navigate_to(self, page) -> None: # https://developer.apple.com/documentation/uikit/uiviewcontroller # ======================================== - from rubicon.objc import ObjCClass + from rubicon.objc import ObjCClass, ObjCInstance class Page(PageBase, ViewBase): def __init__(self, native_instance) -> None: super().__init__() self.native_class = ObjCClass("UIViewController") + # If Swift passed us an integer pointer, wrap it as an ObjCInstance. + if isinstance(native_instance, int): + try: + native_instance = ObjCInstance(native_instance) + except Exception: + native_instance = None self.native_instance = native_instance # self.native_instance = self.native_class.alloc().init() def set_root_view(self, view) -> None: - root_view = self.native_instance.view() + # UIViewController.view is a property; access without calling. + root_view = self.native_instance.view # Size the root child to fill the controller's view and enable autoresizing try: - bounds = root_view.bounds() + bounds = root_view.bounds view.native_instance.setFrame_(bounds) # UIViewAutoresizingFlexibleWidth (2) | UIViewAutoresizingFlexibleHeight (16) view.native_instance.setAutoresizingMask_(2 | 16) diff --git a/templates/ios_template/ios_template.xcodeproj/project.pbxproj b/templates/ios_template/ios_template.xcodeproj/project.pbxproj index 32043c3..c43f4bc 100644 --- a/templates/ios_template/ios_template.xcodeproj/project.pbxproj +++ b/templates/ios_template/ios_template.xcodeproj/project.pbxproj @@ -15,7 +15,8 @@ 146EBB8E2A40CCCE00E4A2B3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 146EBB8C2A40CCCE00E4A2B3 /* LaunchScreen.storyboard */; }; 146EBB992A40CCCE00E4A2B3 /* ios_templateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBB982A40CCCE00E4A2B3 /* ios_templateTests.swift */; }; 146EBBA32A40CCCE00E4A2B3 /* ios_templateUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBBA22A40CCCE00E4A2B3 /* ios_templateUITests.swift */; }; - 146EBBA52A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */; }; + 146EBBA52A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */; }; + A1B2C3D42B2F000000000012 /* PythonKit in Frameworks */ = {isa = PBXBuildFile; productRef = A1B2C3D42B2F000000000011 /* PythonKit */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -48,15 +49,16 @@ 146EBB982A40CCCE00E4A2B3 /* ios_templateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateTests.swift; sourceTree = ""; }; 146EBB9E2A40CCCE00E4A2B3 /* ios_templateUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ios_templateUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 146EBBA22A40CCCE00E4A2B3 /* ios_templateUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateUITests.swift; sourceTree = ""; }; - 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateUITestsLaunchTests.swift; sourceTree = ""; }; + 146EBBA42A40CCCE00E4A2B3 /* ios_templateUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ios_templateUITestsLaunchTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 146EBB7B2A40CCC900E4A2B3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; - files = ( - ); + files = ( + A1B2C3D42B2F000000000012 /* PythonKit in Frameworks */, + ); runOnlyForDeploymentPostprocessing = 0; }; 146EBB912A40CCCE00E4A2B3 /* Frameworks */ = { @@ -78,8 +80,8 @@ /* Begin PBXGroup section */ 146EBB752A40CCC900E4A2B3 = { isa = PBXGroup; - children = ( - 146EBB802A40CCC900E4A2B3 /* ios_template */, + children = ( + 146EBB802A40CCC900E4A2B3 /* ios_template */, 146EBB972A40CCCE00E4A2B3 /* ios_templateTests */, 146EBBA12A40CCCE00E4A2B3 /* ios_templateUITests */, 146EBB7F2A40CCC900E4A2B3 /* Products */, @@ -137,11 +139,15 @@ 146EBB7A2A40CCC900E4A2B3 /* Sources */, 146EBB7B2A40CCC900E4A2B3 /* Frameworks */, 146EBB7C2A40CCC900E4A2B3 /* Resources */, + 146EBC002A40CCCE00E4A2B3 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( ); + packageProductDependencies = ( + A1B2C3D42B2F000000000011 /* PythonKit */, + ); name = ios_template; productName = ios_template; productReference = 146EBB7E2A40CCC900E4A2B3 /* ios_template.app */; @@ -215,6 +221,9 @@ Base, ); mainGroup = 146EBB752A40CCC900E4A2B3; + packageReferences = ( + A1B2C3D42B2F000000000010 /* XCRemoteSwiftPackageReference "PythonKit" */, + ); productRefGroup = 146EBB7F2A40CCC900E4A2B3 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -226,6 +235,38 @@ }; /* End PBXProject section */ +/* Begin PBXCopyFilesBuildPhase section */ + 146EBC002A40CCCE00E4A2B3 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin XCRemoteSwiftPackageReference section */ + A1B2C3D42B2F000000000010 /* XCRemoteSwiftPackageReference "PythonKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pvieito/PythonKit"; + requirement = { + branch = master; + kind = branch; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + A1B2C3D42B2F000000000011 /* PythonKit */ = { + isa = XCSwiftPackageProductDependency; + package = A1B2C3D42B2F000000000010 /* XCRemoteSwiftPackageReference "PythonKit" */; + productName = PythonKit; + }; +/* End XCSwiftPackageProductDependency section */ + /* Begin PBXResourcesBuildPhase section */ 146EBB7C2A40CCC900E4A2B3 /* Resources */ = { isa = PBXResourcesBuildPhase; diff --git a/templates/ios_template/ios_template/ViewController.swift b/templates/ios_template/ios_template/ViewController.swift index 2b17656..0f3ba5e 100644 --- a/templates/ios_template/ios_template/ViewController.swift +++ b/templates/ios_template/ios_template/ViewController.swift @@ -11,29 +11,101 @@ import UIKit #if canImport(PythonKit) import PythonKit #endif +#if canImport(Python) +import Python +#endif class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + NSLog("[PN][ViewController] viewDidLoad") + if let bundleId = Bundle.main.bundleIdentifier { + NSLog("[PN] Bundle Identifier: \(bundleId)") + } + NSLog("[PN] Bundle Path: \(Bundle.main.bundlePath)") + NSLog("[PN] Resource Path: \(Bundle.main.resourcePath ?? "nil")") + // Configure embedded Python if available in bundle + if let resourcePath = Bundle.main.resourcePath { + let pyStd = "\(resourcePath)/python-stdlib" + let pyDyn = "\(resourcePath)/python-stdlib/lib-dynload" + var pyPath = "\(pyStd):\(pyDyn):\(resourcePath):\(resourcePath)/app" + let platSite = "\(resourcePath)/platform-site" + if FileManager.default.fileExists(atPath: platSite) { + pyPath += ":\(platSite)" + } + setenv("PYTHONHOME", pyStd, 1) + setenv("PYTHONPATH", pyPath, 1) + NSLog("[PN] Set PYTHONHOME=\(pyStd)") + NSLog("[PN] Set PYTHONPATH=\(pyPath)") + } #if canImport(PythonKit) + // Ensure PythonKit knows where to load the Python library from when using an embedded framework. + if let bundlePath = Bundle.main.bundlePath as String? { + let frameworkLib = "\(bundlePath)/Frameworks/Python.framework/Python" + setenv("PYTHON_LIBRARY", frameworkLib, 1) + if FileManager.default.fileExists(atPath: frameworkLib) { + NSLog("[PN] Using embedded Python lib at: \(frameworkLib)") + PythonLibrary.useLibrary(at: frameworkLib) + } else { + NSLog("[PN] Embedded Python library not found at: \(frameworkLib)") + } + } + NSLog("[PN] PythonKit available; attempting Python bootstrap of app.main_page.bootstrap(self)") // Attempt Python bootstrap of app.main_page.bootstrap(self) let sys = Python.import("sys") + NSLog("[PN] Python version: \(sys.version)") + NSLog("[PN] Initial sys.path: \(sys.path)") if let resourcePath = Bundle.main.resourcePath { sys.path.append(resourcePath) sys.path.append("\(resourcePath)/app") + NSLog("[PN] Updated sys.path: \(sys.path)") + // List bundled resources to verify Python files are present + let fm = FileManager.default + let appDir = "\(resourcePath)/app" + if let entries = try? fm.contentsOfDirectory(atPath: appDir) { + NSLog("[PN] Contents of /app in bundle: \(entries)") + } else { + NSLog("[PN] Could not list contents of \(appDir).") + } } do { let app = try Python.attemptImport("app.main_page") - let bootstrap = app.bootstrap - _ = bootstrap(self) - return + let pyNone = Python.None + let builtins = Python.import("builtins") + let getattrFn = builtins.getattr + let bootstrap = try getattrFn.throwing.dynamicallyCall(withArguments: [app, "bootstrap", pyNone]) + if bootstrap != Python.None { + do { + let isCallable = try Python.callable.throwing.dynamicallyCall(withArguments: [bootstrap]) + if Bool(isCallable) == true { + // Pass the native UIViewController pointer into Python so it can be wrapped by rubicon.objc + let ptr = Unmanaged.passUnretained(self).toOpaque() + let addr = UInt(bitPattern: ptr) + NSLog("[PN] Passing native UIViewController pointer to Python: 0x%llx", addr) + _ = try bootstrap.throwing.dynamicallyCall(withArguments: [addr]) + NSLog("[PN] Python bootstrap succeeded; returning early from viewDidLoad") + return + } else { + NSLog("[PN] 'bootstrap' exists but is not callable") + } + } catch { + NSLog("[PN] Python callable/bootstrap raised error: \(error)") + let sys = Python.import("sys") + NSLog("[PN] sys.path at call error: \(sys.path)") + } + } else { + NSLog("[PN] Python bootstrap function not found on app.main_page") + } } catch { - print("Python bootstrap failed: \(error)") + NSLog("[PN] Python bootstrap failed during import/getattr: \(error)") + let sys = Python.import("sys") + NSLog("[PN] sys.path at failure: \(sys.path)") } #endif // Fallback UI if Python import/bootstrap fails + NSLog("[PN] Python unavailable or bootstrap failed; showing fallback UILabel") let label = UILabel(frame: view.bounds) label.text = "Hello from PythonNative (iOS template)" label.textAlignment = .center From 7725b1462c42d89f27fb4d3d733e73177c55d8ac Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Mon, 13 Oct 2025 19:51:57 -0700 Subject: [PATCH 61/66] build(templates,cli): ship template dirs with package; drop zip artifacts --- pyproject.toml | 9 +- src/pythonnative/cli/pn.py | 78 +++++++++--------- .../templates}/android_template/.gitignore | 0 .../android_template/app/.gitignore | 0 .../android_template/app/build.gradle | 0 .../android_template/app/proguard-rules.pro | 0 .../ExampleInstrumentedTest.kt | 0 .../app/src/main/AndroidManifest.xml | 0 .../android_template/MainActivity.kt | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin .../res/mipmap-hdpi/ic_launcher_round.webp | Bin .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin .../res/mipmap-mdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin .../app/src/main/res/values-night/themes.xml | 0 .../app/src/main/res/values/colors.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/themes.xml | 0 .../app/src/main/res/xml/backup_rules.xml | 0 .../main/res/xml/data_extraction_rules.xml | 0 .../android_template/ExampleUnitTest.kt | 0 .../templates}/android_template/build.gradle | 0 .../android_template/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../templates}/android_template/gradlew | 0 .../templates}/android_template/gradlew.bat | 0 .../android_template/settings.gradle | 0 .../templates}/ios_template/.gitignore | 0 .../ios_template.xcodeproj/project.pbxproj | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../ios_template/AppDelegate.swift | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../ios_template/Base.lproj/Main.storyboard | 0 .../ios_template/ios_template/Info.plist | 0 .../ios_template/SceneDelegate.swift | 0 .../ios_template/ViewController.swift | 0 .../ios_templateTests/ios_templateTests.swift | 0 .../ios_templateUITests.swift | 0 .../ios_templateUITestsLaunchTests.swift | 0 templates/zip_android.sh | 4 - templates/zip_ios.sh | 4 - 55 files changed, 43 insertions(+), 52 deletions(-) rename {templates => src/pythonnative/templates}/android_template/.gitignore (100%) rename {templates => src/pythonnative/templates}/android_template/app/.gitignore (100%) rename {templates => src/pythonnative/templates}/android_template/app/build.gradle (100%) rename {templates => src/pythonnative/templates}/android_template/app/proguard-rules.pro (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/AndroidManifest.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/layout/activity_main.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/values-night/themes.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/values/colors.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/values/strings.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/values/themes.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/xml/backup_rules.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/main/res/xml/data_extraction_rules.xml (100%) rename {templates => src/pythonnative/templates}/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt (100%) rename {templates => src/pythonnative/templates}/android_template/build.gradle (100%) rename {templates => src/pythonnative/templates}/android_template/gradle.properties (100%) rename {templates => src/pythonnative/templates}/android_template/gradle/wrapper/gradle-wrapper.jar (100%) rename {templates => src/pythonnative/templates}/android_template/gradle/wrapper/gradle-wrapper.properties (100%) rename {templates => src/pythonnative/templates}/android_template/gradlew (100%) rename {templates => src/pythonnative/templates}/android_template/gradlew.bat (100%) rename {templates => src/pythonnative/templates}/android_template/settings.gradle (100%) rename {templates => src/pythonnative/templates}/ios_template/.gitignore (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template.xcodeproj/project.pbxproj (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/AppDelegate.swift (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/Assets.xcassets/Contents.json (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/Base.lproj/Main.storyboard (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/Info.plist (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/SceneDelegate.swift (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_template/ViewController.swift (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_templateTests/ios_templateTests.swift (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_templateUITests/ios_templateUITests.swift (100%) rename {templates => src/pythonnative/templates}/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift (100%) delete mode 100644 templates/zip_android.sh delete mode 100644 templates/zip_ios.sh diff --git a/pyproject.toml b/pyproject.toml index 4d700d8..585dd5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,11 +66,10 @@ where = ["src"] [tool.setuptools] license-files = ["LICENSE*"] -# Ensure template zip files are bundled with the wheel so the CLI can run offline. -[tool.setuptools.data-files] -"pythonnative/templates" = [ - "templates/android_template.zip", - "templates/ios_template.zip", +# Include template directories inside the package so importlib.resources can find them +[tool.setuptools.package-data] +pythonnative = [ + "templates/**", ] [tool.ruff] diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index 90b92cc..131ff38 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -7,7 +7,6 @@ import sys import sysconfig import urllib.request -import zipfile from importlib import resources from typing import Any, Dict, List, Optional @@ -97,65 +96,66 @@ def bootstrap(native_instance): print("Initialized PythonNative project.") -def _extract_zip_to_destination(zip_path: str, destination: str) -> None: - with zipfile.ZipFile(zip_path, "r") as zf: - zf.extractall(destination) +def _copy_dir(src: str, dst: str) -> None: + os.makedirs(os.path.dirname(dst), exist_ok=True) + shutil.copytree(src, dst, dirs_exist_ok=True) -def _extract_bundled_template(zip_name: str, destination: str) -> None: +def _copy_bundled_template_dir(template_dir: str, destination: str) -> None: """ - Extract a bundled template zip into the destination directory. - Tries package resources first; falls back to repo root `templates/` at dev time. + Copy a bundled template directory into the destination directory. + Tries the repository `templates/` first during development, then + package resources when installed from a wheel. + The result should be `${destination}/{template_dir}`. """ - # Dev-first: prefer repository templates if running from a checkout (avoid stale packaged zips) + dest_path = os.path.join(destination, template_dir) + + # Dev-first: prefer local source templates if running from a checkout (avoid stale packaged data) try: # __file__ -> src/pythonnative/cli/pn.py, so go up to src/, then to repo root src_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + # Check templates located inside the source package tree + local_pkg_templates = os.path.join(src_dir, "pythonnative", "templates", template_dir) + if os.path.isdir(local_pkg_templates): + _copy_dir(local_pkg_templates, dest_path) + return repo_root = os.path.abspath(os.path.join(src_dir, "..")) repo_templates = os.path.join(repo_root, "templates") - candidate = os.path.join(repo_templates, zip_name) - if os.path.exists(candidate): - _extract_zip_to_destination(candidate, destination) + candidate_dir = os.path.join(repo_templates, template_dir) + if os.path.isdir(candidate_dir): + _copy_dir(candidate_dir, dest_path) return except Exception: pass - # Try to load from installed package resources next (if templates are packaged inside the module) + # Try to load from installed package resources (templates packaged inside the module) try: - cand = resources.files("pythonnative").joinpath("templates").joinpath(zip_name) + cand = resources.files("pythonnative").joinpath("templates").joinpath(template_dir) with resources.as_file(cand) as p: resource_path = str(p) - if os.path.exists(resource_path): - _extract_zip_to_destination(resource_path, destination) - return - except Exception: - # Not packaged inside the module; try data-files installation locations next - pass - - # Try sysconfig data dir (where data-files are typically installed) - try: - data_dir = sysconfig.get_paths().get("data") - if data_dir: - candidate = os.path.join(data_dir, "pythonnative", "templates", zip_name) - if os.path.exists(candidate): - _extract_zip_to_destination(candidate, destination) + if os.path.isdir(resource_path): + _copy_dir(resource_path, dest_path) return except Exception: pass - # Try site-packages purelib/platlib (some environments place data files here) + # Last resort: check typical data-file locations try: - purelib = sysconfig.get_paths().get("purelib") - platlib = sysconfig.get_paths().get("platlib") - for base in filter(None, [purelib, platlib]): - candidate = os.path.join(base, "pythonnative", "templates", zip_name) - if os.path.exists(candidate): - _extract_zip_to_destination(candidate, destination) + data_paths = sysconfig.get_paths() + search_bases = [ + data_paths.get("data"), + data_paths.get("purelib"), + data_paths.get("platlib"), + ] + for base in filter(None, search_bases): + candidate_dir = os.path.join(base, "pythonnative", "templates", template_dir) + if os.path.isdir(candidate_dir): + _copy_dir(candidate_dir, dest_path) return except Exception: pass - raise FileNotFoundError(f"Could not find bundled template {zip_name}. Ensure templates are packaged.") + raise FileNotFoundError(f"Could not find bundled template directory {template_dir}. Ensure templates are packaged.") def _github_json(url: str) -> Any: @@ -199,8 +199,8 @@ def create_android_project(project_name: str, destination: str) -> None: :param project_name: The name of the project. :param destination: The directory where the project will be created. """ - # Extract the Android template project from bundled zip - _extract_bundled_template("android_template.zip", destination) + # Copy the Android template project directory + _copy_bundled_template_dir("android_template", destination) def create_ios_project(project_name: str, destination: str) -> None: @@ -210,8 +210,8 @@ def create_ios_project(project_name: str, destination: str) -> None: :param project_name: The name of the project. :param destination: The directory where the project will be created. """ - # Extract the iOS template project from bundled zip - _extract_bundled_template("ios_template.zip", destination) + # Copy the iOS template project directory + _copy_bundled_template_dir("ios_template", destination) def run_project(args: argparse.Namespace) -> None: diff --git a/templates/android_template/.gitignore b/src/pythonnative/templates/android_template/.gitignore similarity index 100% rename from templates/android_template/.gitignore rename to src/pythonnative/templates/android_template/.gitignore diff --git a/templates/android_template/app/.gitignore b/src/pythonnative/templates/android_template/app/.gitignore similarity index 100% rename from templates/android_template/app/.gitignore rename to src/pythonnative/templates/android_template/app/.gitignore diff --git a/templates/android_template/app/build.gradle b/src/pythonnative/templates/android_template/app/build.gradle similarity index 100% rename from templates/android_template/app/build.gradle rename to src/pythonnative/templates/android_template/app/build.gradle diff --git a/templates/android_template/app/proguard-rules.pro b/src/pythonnative/templates/android_template/app/proguard-rules.pro similarity index 100% rename from templates/android_template/app/proguard-rules.pro rename to src/pythonnative/templates/android_template/app/proguard-rules.pro diff --git a/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt b/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt similarity index 100% rename from templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt rename to src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt diff --git a/templates/android_template/app/src/main/AndroidManifest.xml b/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml similarity index 100% rename from templates/android_template/app/src/main/AndroidManifest.xml rename to src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml diff --git a/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt b/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt similarity index 100% rename from templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt rename to src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt diff --git a/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml b/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml rename to src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/templates/android_template/app/src/main/res/layout/activity_main.xml b/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml similarity index 100% rename from templates/android_template/app/src/main/res/layout/activity_main.xml rename to src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml diff --git a/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp similarity index 100% rename from templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename to src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/templates/android_template/app/src/main/res/values-night/themes.xml b/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml similarity index 100% rename from templates/android_template/app/src/main/res/values-night/themes.xml rename to src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml diff --git a/templates/android_template/app/src/main/res/values/colors.xml b/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml similarity index 100% rename from templates/android_template/app/src/main/res/values/colors.xml rename to src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml diff --git a/templates/android_template/app/src/main/res/values/strings.xml b/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml similarity index 100% rename from templates/android_template/app/src/main/res/values/strings.xml rename to src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml diff --git a/templates/android_template/app/src/main/res/values/themes.xml b/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml similarity index 100% rename from templates/android_template/app/src/main/res/values/themes.xml rename to src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml diff --git a/templates/android_template/app/src/main/res/xml/backup_rules.xml b/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml similarity index 100% rename from templates/android_template/app/src/main/res/xml/backup_rules.xml rename to src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml diff --git a/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml b/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from templates/android_template/app/src/main/res/xml/data_extraction_rules.xml rename to src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml diff --git a/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt b/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt similarity index 100% rename from templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt rename to src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt diff --git a/templates/android_template/build.gradle b/src/pythonnative/templates/android_template/build.gradle similarity index 100% rename from templates/android_template/build.gradle rename to src/pythonnative/templates/android_template/build.gradle diff --git a/templates/android_template/gradle.properties b/src/pythonnative/templates/android_template/gradle.properties similarity index 100% rename from templates/android_template/gradle.properties rename to src/pythonnative/templates/android_template/gradle.properties diff --git a/templates/android_template/gradle/wrapper/gradle-wrapper.jar b/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from templates/android_template/gradle/wrapper/gradle-wrapper.jar rename to src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar diff --git a/templates/android_template/gradle/wrapper/gradle-wrapper.properties b/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from templates/android_template/gradle/wrapper/gradle-wrapper.properties rename to src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties diff --git a/templates/android_template/gradlew b/src/pythonnative/templates/android_template/gradlew similarity index 100% rename from templates/android_template/gradlew rename to src/pythonnative/templates/android_template/gradlew diff --git a/templates/android_template/gradlew.bat b/src/pythonnative/templates/android_template/gradlew.bat similarity index 100% rename from templates/android_template/gradlew.bat rename to src/pythonnative/templates/android_template/gradlew.bat diff --git a/templates/android_template/settings.gradle b/src/pythonnative/templates/android_template/settings.gradle similarity index 100% rename from templates/android_template/settings.gradle rename to src/pythonnative/templates/android_template/settings.gradle diff --git a/templates/ios_template/.gitignore b/src/pythonnative/templates/ios_template/.gitignore similarity index 100% rename from templates/ios_template/.gitignore rename to src/pythonnative/templates/ios_template/.gitignore diff --git a/templates/ios_template/ios_template.xcodeproj/project.pbxproj b/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj similarity index 100% rename from templates/ios_template/ios_template.xcodeproj/project.pbxproj rename to src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj diff --git a/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/templates/ios_template/ios_template/AppDelegate.swift b/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift similarity index 100% rename from templates/ios_template/ios_template/AppDelegate.swift rename to src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift diff --git a/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json b/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json rename to src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json b/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json rename to src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/templates/ios_template/ios_template/Assets.xcassets/Contents.json b/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json similarity index 100% rename from templates/ios_template/ios_template/Assets.xcassets/Contents.json rename to src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json diff --git a/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard b/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard rename to src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard diff --git a/templates/ios_template/ios_template/Base.lproj/Main.storyboard b/src/pythonnative/templates/ios_template/ios_template/Base.lproj/Main.storyboard similarity index 100% rename from templates/ios_template/ios_template/Base.lproj/Main.storyboard rename to src/pythonnative/templates/ios_template/ios_template/Base.lproj/Main.storyboard diff --git a/templates/ios_template/ios_template/Info.plist b/src/pythonnative/templates/ios_template/ios_template/Info.plist similarity index 100% rename from templates/ios_template/ios_template/Info.plist rename to src/pythonnative/templates/ios_template/ios_template/Info.plist diff --git a/templates/ios_template/ios_template/SceneDelegate.swift b/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift similarity index 100% rename from templates/ios_template/ios_template/SceneDelegate.swift rename to src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift diff --git a/templates/ios_template/ios_template/ViewController.swift b/src/pythonnative/templates/ios_template/ios_template/ViewController.swift similarity index 100% rename from templates/ios_template/ios_template/ViewController.swift rename to src/pythonnative/templates/ios_template/ios_template/ViewController.swift diff --git a/templates/ios_template/ios_templateTests/ios_templateTests.swift b/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift similarity index 100% rename from templates/ios_template/ios_templateTests/ios_templateTests.swift rename to src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift diff --git a/templates/ios_template/ios_templateUITests/ios_templateUITests.swift b/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift similarity index 100% rename from templates/ios_template/ios_templateUITests/ios_templateUITests.swift rename to src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift diff --git a/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift b/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift similarity index 100% rename from templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift rename to src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift diff --git a/templates/zip_android.sh b/templates/zip_android.sh deleted file mode 100644 index b67efe5..0000000 --- a/templates/zip_android.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# Create a zip file of the Android template in the current directory -zip -r android_template.zip android_template/ diff --git a/templates/zip_ios.sh b/templates/zip_ios.sh deleted file mode 100644 index 022d4a1..0000000 --- a/templates/zip_ios.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# Create a zip file of the iOS template in the current directory -zip -r ios_template.zip ios_template/ From 6d5b78ea7dce66b5031b952928aed8d4a713fae8 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Tue, 14 Oct 2025 06:47:29 -0700 Subject: [PATCH 62/66] chore(repo,ci,docs): rename demo to examples/hello-world and update refs --- .github/workflows/ci.yml | 2 +- CONTRIBUTING.md | 18 ++++++++---------- .../hello-world}/.gitignore | 0 .../hello-world}/README.md | 0 .../hello-world}/app/__init__.py | 0 .../hello-world}/app/main_page.py | 0 .../hello-world}/app/resources/.gitkeep | 0 .../hello-world}/app/second_page.py | 0 .../hello-world}/pythonnative.json | 0 .../hello-world}/requirements.txt | 0 .../hello-world}/tests/.gitkeep | 0 mypy.ini | 3 ++- 12 files changed, 11 insertions(+), 12 deletions(-) rename {apps/pythonnative_demo => examples/hello-world}/.gitignore (100%) rename {apps/pythonnative_demo => examples/hello-world}/README.md (100%) rename {apps/pythonnative_demo => examples/hello-world}/app/__init__.py (100%) rename {apps/pythonnative_demo => examples/hello-world}/app/main_page.py (100%) rename {apps/pythonnative_demo => examples/hello-world}/app/resources/.gitkeep (100%) rename {apps/pythonnative_demo => examples/hello-world}/app/second_page.py (100%) rename {apps/pythonnative_demo => examples/hello-world}/pythonnative.json (100%) rename {apps/pythonnative_demo => examples/hello-world}/requirements.txt (100%) rename {apps/pythonnative_demo => examples/hello-world}/tests/.gitkeep (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4301449..8e801b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - name: Format check (Black) run: | - black --check src apps tests + black --check src examples tests - name: Type check (MyPy) run: | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4338f5b..cedf103 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ pip install -e . pytest -q # format and lint -black src apps tests || true +black src examples tests || true ruff check . ``` @@ -33,8 +33,8 @@ pn --help # create a new sample app (template fetch is remote) pn init my_app -# run a local demo app skeleton -cd apps/pythonnative_demo && pn run android +# run the Hello World example +cd examples/hello-world && pn run android ``` ## Project layout (high‑level) @@ -44,9 +44,8 @@ cd apps/pythonnative_demo && pn run android - `cli/` – `pn` command - `tests/` – unit tests for the library - `templates/` – Android/iOS project templates and zips -- `apps/` – application projects - - `django_pythonnative/` – Django project for docs/demo hosting and E2E - - `pythonnative_demo/` – minimal demo app using the library +- `examples/` – runnable example apps + - `hello-world/` – minimal demo app using the library - `experiments/` – platform experiments (Android/iOS/Briefcase) - `README.md`, `pyproject.toml` – repo docs and packaging @@ -62,7 +61,7 @@ Common commands: ```bash pytest -q # run tests ruff check . # lint -black src apps tests # format +black src examples tests # format ``` ## Conventional Commits @@ -107,11 +106,10 @@ Recommended scopes (match the smallest accurate directory/module): - Templates and examples: - `templates` – `templates/` (Android/iOS templates, zips) - - `demo` – `apps/pythonnative_demo/` + - `examples` – `examples/` (e.g., `hello-world/`) - `experiments` – `experiments/` -- Django app and site: - - `django` – `apps/django_pythonnative/` (site, docs pages, E2E harness) + - Repo‑level and ops: - `deps` – dependency updates and version pins diff --git a/apps/pythonnative_demo/.gitignore b/examples/hello-world/.gitignore similarity index 100% rename from apps/pythonnative_demo/.gitignore rename to examples/hello-world/.gitignore diff --git a/apps/pythonnative_demo/README.md b/examples/hello-world/README.md similarity index 100% rename from apps/pythonnative_demo/README.md rename to examples/hello-world/README.md diff --git a/apps/pythonnative_demo/app/__init__.py b/examples/hello-world/app/__init__.py similarity index 100% rename from apps/pythonnative_demo/app/__init__.py rename to examples/hello-world/app/__init__.py diff --git a/apps/pythonnative_demo/app/main_page.py b/examples/hello-world/app/main_page.py similarity index 100% rename from apps/pythonnative_demo/app/main_page.py rename to examples/hello-world/app/main_page.py diff --git a/apps/pythonnative_demo/app/resources/.gitkeep b/examples/hello-world/app/resources/.gitkeep similarity index 100% rename from apps/pythonnative_demo/app/resources/.gitkeep rename to examples/hello-world/app/resources/.gitkeep diff --git a/apps/pythonnative_demo/app/second_page.py b/examples/hello-world/app/second_page.py similarity index 100% rename from apps/pythonnative_demo/app/second_page.py rename to examples/hello-world/app/second_page.py diff --git a/apps/pythonnative_demo/pythonnative.json b/examples/hello-world/pythonnative.json similarity index 100% rename from apps/pythonnative_demo/pythonnative.json rename to examples/hello-world/pythonnative.json diff --git a/apps/pythonnative_demo/requirements.txt b/examples/hello-world/requirements.txt similarity index 100% rename from apps/pythonnative_demo/requirements.txt rename to examples/hello-world/requirements.txt diff --git a/apps/pythonnative_demo/tests/.gitkeep b/examples/hello-world/tests/.gitkeep similarity index 100% rename from apps/pythonnative_demo/tests/.gitkeep rename to examples/hello-world/tests/.gitkeep diff --git a/mypy.ini b/mypy.ini index 620d24f..ec0b8ad 100644 --- a/mypy.ini +++ b/mypy.ini @@ -6,7 +6,8 @@ warn_unused_ignores = True warn_return_any = False strict_optional = False pretty = True -files = src, tests +files = src, tests, examples +exclude = (^build/|^examples/.*/build/) [mypy-pythonnative.*] implicit_reexport = True From db06fd101789392deee8c37263a61ee4d7106853 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Tue, 14 Oct 2025 10:01:05 -0700 Subject: [PATCH 63/66] chore(experiments): remove unused experiment directories --- experiments/beeware_pythonnative/.gitignore | 62 ------- experiments/beeware_pythonnative/CHANGELOG | 5 - experiments/beeware_pythonnative/LICENSE | 28 ---- experiments/beeware_pythonnative/README.rst | 12 -- .../beeware_pythonnative/pyproject.toml | 153 ------------------ .../src/beeware_pythonnative/__init__.py | 0 .../src/beeware_pythonnative/__main__.py | 4 - .../src/beeware_pythonnative/app.py | 63 -------- .../resources/__init__.py | 0 .../resources/beeware_pythonnative.icns | Bin 445986 -> 0 bytes .../resources/beeware_pythonnative.ico | Bin 13871 -> 0 bytes .../resources/beeware_pythonnative.png | Bin 14040 -> 0 bytes .../beeware_pythonnative/tests/__init__.py | 0 .../tests/beeware_pythonnative.py | 36 ----- .../beeware_pythonnative/tests/test_app.py | 3 - experiments/metadata_generators/__init__.py | 0 .../android_metadata_generator.py | 51 ------ .../ios_metadata_generator.py | 67 -------- experiments/rubicon_tests/__init__.py | 0 .../rubicon_tests/rubicon_java_tests.py | 14 -- .../rubicon_tests/rubicon_objc_test.py | 16 -- experiments/ui_elements/__init__.py | 0 .../ui_elements/android_ui_elements.py | 52 ------ experiments/ui_elements/ios_ui_elements.py | 132 --------------- 24 files changed, 698 deletions(-) delete mode 100644 experiments/beeware_pythonnative/.gitignore delete mode 100644 experiments/beeware_pythonnative/CHANGELOG delete mode 100644 experiments/beeware_pythonnative/LICENSE delete mode 100644 experiments/beeware_pythonnative/README.rst delete mode 100644 experiments/beeware_pythonnative/pyproject.toml delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/app.py delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico delete mode 100644 experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.png delete mode 100644 experiments/beeware_pythonnative/tests/__init__.py delete mode 100644 experiments/beeware_pythonnative/tests/beeware_pythonnative.py delete mode 100644 experiments/beeware_pythonnative/tests/test_app.py delete mode 100644 experiments/metadata_generators/__init__.py delete mode 100644 experiments/metadata_generators/android_metadata_generator.py delete mode 100644 experiments/metadata_generators/ios_metadata_generator.py delete mode 100644 experiments/rubicon_tests/__init__.py delete mode 100644 experiments/rubicon_tests/rubicon_java_tests.py delete mode 100644 experiments/rubicon_tests/rubicon_objc_test.py delete mode 100644 experiments/ui_elements/__init__.py delete mode 100644 experiments/ui_elements/android_ui_elements.py delete mode 100644 experiments/ui_elements/ios_ui_elements.py diff --git a/experiments/beeware_pythonnative/.gitignore b/experiments/beeware_pythonnative/.gitignore deleted file mode 100644 index f6c30e2..0000000 --- a/experiments/beeware_pythonnative/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# OSX useful to ignore -*.DS_Store -.AppleDouble -.LSOverride - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.dist-info/ -*.egg-info/ -.installed.cfg -*.egg - -# IntelliJ Idea family of suites -.idea -*.iml -## File-based project format: -*.ipr -*.iws -## mpeltonen/sbt-idea plugin -.idea_modules/ - -# Briefcase log files -logs/ diff --git a/experiments/beeware_pythonnative/CHANGELOG b/experiments/beeware_pythonnative/CHANGELOG deleted file mode 100644 index 80b32e7..0000000 --- a/experiments/beeware_pythonnative/CHANGELOG +++ /dev/null @@ -1,5 +0,0 @@ -# Hello World Release Notes - -## 0.0.1 (27 May 2023) - -* Initial release diff --git a/experiments/beeware_pythonnative/LICENSE b/experiments/beeware_pythonnative/LICENSE deleted file mode 100644 index e7f170b..0000000 --- a/experiments/beeware_pythonnative/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ - -Copyright (c) 2023, Owen Carey -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/experiments/beeware_pythonnative/README.rst b/experiments/beeware_pythonnative/README.rst deleted file mode 100644 index 1b2bad8..0000000 --- a/experiments/beeware_pythonnative/README.rst +++ /dev/null @@ -1,12 +0,0 @@ -Hello World -=========== - -**This cross-platform app was generated by** `Briefcase`_ **- part of** -`The BeeWare Project`_. **If you want to see more tools like Briefcase, please -consider** `becoming a financial member of BeeWare`_. - -My first application - -.. _`Briefcase`: https://briefcase.readthedocs.io/ -.. _`The BeeWare Project`: https://beeware.org/ -.. _`becoming a financial member of BeeWare`: https://beeware.org/contributing/membership diff --git a/experiments/beeware_pythonnative/pyproject.toml b/experiments/beeware_pythonnative/pyproject.toml deleted file mode 100644 index 61fe56b..0000000 --- a/experiments/beeware_pythonnative/pyproject.toml +++ /dev/null @@ -1,153 +0,0 @@ -# This project was generated with Unknown using template: https://github.com/beeware/briefcase-template@v0.3.14 -[tool.briefcase] -project_name = "Hello World" -bundle = "com.pythonnative" -version = "0.0.1" -url = "https://pythonnative.com/beeware_pythonnative" -license = "BSD license" -author = "Owen Carey" -author_email = "pythonnative@gmail.com" - -[tool.briefcase.app.beeware_pythonnative] -formal_name = "Hello World" -description = "My first application" -long_description = """More details about the app should go here. -""" -icon = "src/beeware_pythonnative/resources/beeware_pythonnative" -sources = [ - "src/beeware_pythonnative", -] -test_sources = [ - "tests", -] - -requires = [ -] -test_requires = [ - "pytest", -] - -[tool.briefcase.app.beeware_pythonnative.macOS] -requires = [ - "toga-cocoa~=0.3.1", - "std-nslog~=1.0.0" -] - -[tool.briefcase.app.beeware_pythonnative.linux] -requires = [ - "toga-gtk~=0.3.1", -] - -[tool.briefcase.app.beeware_pythonnative.linux.system.debian] -system_requires = [ - # Needed to compile pycairo wheel - "libcairo2-dev", - # Needed to compile PyGObject wheel - "libgirepository1.0-dev", -] - -system_runtime_requires = [ - # Needed to provide GTK - "libgtk-3-0", - # Needed to provide GI bindings to GTK - "libgirepository-1.0-1", - "gir1.2-gtk-3.0", - # Needed to provide WebKit2 at runtime - # "libwebkit2gtk-4.0-37", - # "gir1.2-webkit2-4.0", -] - -[tool.briefcase.app.beeware_pythonnative.linux.system.rhel] -system_requires = [ - # Needed to compile pycairo wheel - "cairo-gobject-devel", - # Needed to compile PyGObject wheel - "gobject-introspection-devel", -] - -system_runtime_requires = [ - # Needed to support Python bindings to GTK - "gobject-introspection", - # Needed to provide GTK - "gtk3", - # Needed to provide WebKit2 at runtime - # "webkit2gtk3", -] - -[tool.briefcase.app.beeware_pythonnative.linux.system.arch] -system_requires = [ - # Needed to compile pycairo wheel - "cairo", - # Needed to compile PyGObject wheel - "gobject-introspection", - # Runtime dependencies that need to exist so that the - # Arch package passes final validation. - # Needed to provide GTK - "gtk3", - # Dependencies that GTK looks for at runtime - "libcanberra", - # Needed to provide WebKit2 - # "webkit2gtk", -] - -system_runtime_requires = [ - # Needed to provide GTK - "gtk3", - # Needed to provide PyGObject bindings - "gobject-introspection-runtime", - # Dependencies that GTK looks for at runtime - "libcanberra", - # Needed to provide WebKit2 at runtime - # "webkit2gtk", -] - -[tool.briefcase.app.beeware_pythonnative.linux.appimage] -manylinux = "manylinux2014" - -system_requires = [ - # Needed to compile pycairo wheel - "cairo-gobject-devel", - # Needed to compile PyGObject wheel - "gobject-introspection-devel", - # Needed to provide GTK - "gtk3-devel", - # Dependencies that GTK looks for at runtime, that need to be - # in the build environment to be picked up by linuxdeploy - "libcanberra-gtk3", - "PackageKit-gtk3-module", - "gvfs-client", - # Needed to provide WebKit2 at runtime - # "webkit2gtk3", -] -linuxdeploy_plugins = [ - "DEPLOY_GTK_VERSION=3 gtk", -] - -[tool.briefcase.app.beeware_pythonnative.linux.flatpak] -flatpak_runtime = "org.gnome.Platform" -flatpak_runtime_version = "44" -flatpak_sdk = "org.gnome.Sdk" - -[tool.briefcase.app.beeware_pythonnative.windows] -requires = [ - "toga-winforms~=0.3.1", -] - -# Mobile deployments -[tool.briefcase.app.beeware_pythonnative.iOS] -requires = [ - "toga-iOS~=0.3.1", - "std-nslog~=1.0.0" -] - -[tool.briefcase.app.beeware_pythonnative.android] -requires = [ - "toga-android~=0.3.1" -] - -# Web deployments -[tool.briefcase.app.beeware_pythonnative.web] -requires = [ - "toga-web~=0.3.1", -] -style_framework = "Shoelace v2.3" diff --git a/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py deleted file mode 100644 index 673d874..0000000 --- a/experiments/beeware_pythonnative/src/beeware_pythonnative/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -from beeware_pythonnative.app import main - -if __name__ == "__main__": - main().main_loop() diff --git a/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py deleted file mode 100644 index 6a5096c..0000000 --- a/experiments/beeware_pythonnative/src/beeware_pythonnative/app.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -My first application -""" -import toga -from toga.style import Pack -from toga.style.pack import CENTER, COLUMN, ROW - - -class HelloWorld(toga.App): - def startup(self): - """ - Construct and show the Toga application. - - Usually, you would add your application to a main content box. - We then create a main window (with a name matching the app), and - show the main window. - """ - self.main_window = toga.MainWindow(title=self.name) - - self.webview = toga.WebView( - on_webview_load=self.on_webview_loaded, style=Pack(flex=1) - ) - self.url_input = toga.TextInput( - value="https://beeware.org/", style=Pack(flex=1) - ) - - main_box = toga.Box( - children=[ - toga.Box( - children=[ - self.url_input, - toga.Button( - "Go", - on_press=self.load_page, - style=Pack(width=50, padding_left=5), - ), - ], - style=Pack( - direction=ROW, - alignment=CENTER, - padding=5, - ), - ), - self.webview, - ], - style=Pack(direction=COLUMN), - ) - - self.main_window.content = main_box - self.webview.url = self.url_input.value - - # Show the main window - self.main_window.show() - - def load_page(self, widget): - self.webview.url = self.url_input.value - - def on_webview_loaded(self, widget): - self.url_input.value = self.webview.url - - -def main(): - return HelloWorld() diff --git a/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.icns deleted file mode 100644 index 27b43d39d1c038a7bf7c8c5f26dd6b5f1b141417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445986 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 `CD$_7n)Um_ejbC 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 z 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 diff --git a/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico b/experiments/beeware_pythonnative/src/beeware_pythonnative/resources/beeware_pythonnative.ico deleted file mode 100644 index 357ada2a58668dd92596fb8d362b4cbcd6dc9329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13871 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

HbV}b;+kuswI>_Qv6Q79Y`fIv|Tjh0DG ztgv{#kj_al02oWqpIbSGx0oJ6AK;^ks;JG$J8&4gF^M@LKE@`t+3<4c!Oz*8a*y*EE(@QP?%%_0N^8?eHp?$K4GfLduIdb?8?C$K`$~m zg75j5@52lZ;gCf?4(AYd!GqA1w2(t)onm4JKmjERA4ZgUZUvdA00NEJiR-yYx2~GW4VM0iok>q9cW`(#;h_gTIi7Va z;Aa-Gj&0P26j?91w52=!*@M1xBm*DKZrMT;>GY)^r?Q$~n8y+}P-!toODC81^ke{o z=}j?d_=4ZOP)xps0BAi`8l6CF?Fhyw0Kw|mkGu5^t~y@i&M+fpN7sqlS_>bL!LF2Y z6gw!Vj182rg(_-k#6t!-w4psEbfSbJvhg5FlNsNXLqGa+0@Z9`0~^>#In~tBgojLW zDWn4>bfyD^WC1>m#B)LcMHX6tG8&AFOWVF?F$qAR`E$5{8+7ZYRoub&F#0Pm9g3^`o3R zqX5|UHHkq00?ofGV>wONZG6T}{173*q9mOGSd~`IttTM7vG8vg|Hm8hYG`CwMu4fL z#%LB&jMv`yYEuBDxgL(>PCY_p6;JR$#941<+${l9A70CCzU?|OMgi&e2;yuBKybxB zhAVZUoX>5%8-?&?ChZy^dEvGEXliu<$ahTuf{nI2cXF(87;oe)ZnM<<8IfgkUu-7; z%UGxNx&|@ZZl50IdVSZR|Fu?U?p6~ z-*g7(>D;J>42g&gTbryq;fIwiQIp=^+pgY-0ucOKM{+j@8t>Ke0(V6Wa$9ha<(35}ZD}G@T zH(J{K?S#{?o;7)*eb55Y^v7Kot}A?e{A?K~FFbrnybqAPuri-94X8f5A`p!LOk*@} z8uO6G)r>dVfJTYNB(VibEm#p^di5^6$!_&V5P(1jvxp10!Dwob#%SK*WZQH41{zan z7LZ1|;c#{W>y7g5VregwrfXH|?b0ztoC5@mo2vOYbGVBU>b<^tKQGD4|OPyoqT zP|uHSH-u=~jcyKVG3HTbczX#0EItk^)3Xd+0P5`a08vZ={d-lw6c%$c=csAsa}9fO zqwc2`2K8}{85TP{Z0FxBRlZ9fS8<+WLzs`3n56WeO&rZ#A)gcrYXHdB4KcRcrB9Bs zPYcN9Z(Po0x~0bC9_5KBZG9UO5?<6e1RAp(5Q6VHU3aF<+26>g5gL3LxwYzCzpN!Wqk*yxx5EZ4s4bW75_9hN;n z2Yr{oZ2<_1fRDF1feFSAr0Qe+k&>_Vw_ZKh#i7%RL?H+fE3 zlV+^35V|zF8!v3v92}#{NsI{g1Cu$CXN@0q9#`={%Q(2@Y)X+WVIkiX)n^MIw0a2h zu#NY$w`4NHqE>vCZuWV453n^3a{yyO09eiCT&{a59b`#}RINXn#PF~mZM172^K&bW zT0DGe+DYxj?iSl*b(R9qPNxJZvmaimm7k)gIgihBq7uXkfIb%f@IIEN%sQZnzD71q zpqyu^XvHArWeG2vdXYmYwwwZ5Ioa%Dq-27XmXn1rxoIVWL%}Tm&nT*;mhKFTQ)oXR zhht3!SyOqLrWi%QO9hXa+~ztPD65RmueIE3>7y&Eme}8GcQSnZZ$>_&&X$zOE7+PM z(?IaCufi|vhww7*#q>50H9Q%@hVrN|ys3*VKWi=GfzPgIFgQjMYIvCUY`S5BmmNIG|4d!|uAE?5AB{Q_P!QR=#-%b!%X}?QPQsAa zG$U=Of*Q+0B_o>HhoenbE4iPSsIgIjX>8=a5Tk!OXVcx{`}a^`{Hhdm(Czcr^IM|1 zg6A7|2!>eNv(HT#We`9H=Z5Ibs(FmtSr(NYrWaub{|xCnbvQ>^PKv#(u(Z0~OI3R`URt@H7jk!Am-6 zcmqco>3FDQCiig(<3lddJMz!4wD~obzSikR<1DCGV$#@vvr)qu_@2=%rUbv)pnP-@KLc<+Y~1(Ms6Eq2@+`WrIc$m;Gc1`PWN-mKUa;tAw=#=ac*rJ;bc6=# zBFuA&xt7DjF5ErLwsf~2tgC?+*mThfz`-HF12A6+X$=h2XR1N0VQvb|0sw?8{>B(f zPhI~rHEd%uTP)dtn$eZ9VJ3fm)PxBFdZ0caO}8{14hyH-V54!S)7}_FP(dSKr;t9- z4tGN!d^lbf}-%_j(@H227 z!NVNZim|hRbGhGg>qo^mmU}z9>rOe#`8k#ufE#fGryKXAhZ`xx6_nYFa-1~qu^V@A zD}7`5-*iUu09VjHV)J__594-!sLmNOJywo;M<;*4|C7a(5L1@o$9Kjmq^D|2WOrVVje!ssQir9s|>_LAzk{)&ALmEFC zg3cImoW40VHI`ifKO7bS4+0CBrS6^-bF5`#KAUbVNe4e6Y$?4sh8il^N(I|#z(Xea z6w#IfvhkSMKO>=m4=ufrx*0oIXyBvReeT`p0c!b>qf~)Bo+s>EE2a?qwVy+7zyhM# zn^FR-pmyQq*Dw>n!*yQnCH6x`t7*A`$wqb10RH4kGRXxA1h#LYF&OYZwgIk*_bfGl zxty#w+9#}!bpUWd06YN8joyRloSv{iv8jhNe$|~X73^ya&kmKm-dcZ#vPCY z5)dmqRZ-8ImfwFGXXvWvX|e4BHp4Ad+;rn4wt#bX@&iVNG|LD<0E2bgBp+|GBlZEn z6#?)7RPnlT_H%T?!bPVNJXA403=6?oy2sT5K5bo!?kVFZ8jac7bAHNc{^JiXpM}}g z8N^BYrMFr$0raQn0z3d~dBb@1gq?jr1bA7^%VBgQ=jj#{t9i5aX}X91868DBa`Dc2 zKv*;|-V}Pa1$%O;e(7x%w(k3PO#nOqi}|1N>IwQ1W+xP+@lBW&T^bkbjy4;3x%H{K zJ1oCs^nog7jO`%me-wCG!_#40`}X5x{n7+}aw1(f@hh(xFB~1h#bPJ?JV4J`Zkt0c z|Ii&l*E0@j?Ev7S00c7jym3&=;c9iGa3=!r@DU$`xj)(%mKESN<~otG+bgprJa4?P z4;Q+eWa=S}pLi;ag=AN*)=fZ{^DMOf`*&3U0-1Z!$c5nH?k$v-+yo{W zFC52NaY!~5;Gv0^EWD@uXwR*BIM6zOhvAHCoy!8?0YB5YVS6is>nvTz|7duZ7sHs0 zc(|N{^o#Gu$W9Rw@lnrz>z}f;peJKZOA-~fwb6&pZc1!v{n7?*XRDLV zAEzF`1JK03b$Z-AxYv?O&JW=$w*2nw2)xW-tkG`PggWwQO|o@D;b2m;#L$$OC4T`TIQW|9>YDr_wPjN%QSo9{HC%HY3=yV4r{KWNqiSzOwPk1Tk zVIH-N0Om&~x0>~&J|5y-Tq%G2KdWW@Q{VaM$rBMZgR8iO@zkblKaj>!ZsD~EOm1mh z%@}hT-{c{D?udU}>oZV*Dcq{7zjo(oOJdn(RPYG*ur38>10IAaT+KHTpSzTs&5SBD zxWUnQbq2)wg9?bi3p}hV!1v~vh+2V0-sNh(BejNtG%9$Cn^_*QZvMtydLT$x#ua|! zT6fAE_a4;)(8xWE*YAwt*@z+lzi=JTP>~}2fCmqAxsInJe!?Cu4+UNtnZ-C}MZph{!5GGx`3LK{!>>Mf zvy=&{!N3A`>Xox_OU&wRxi=93rMtJbBf;admsxY~^T+ctv=JJi) z$L-X+-9!odgaRTkloxcyBUs6m4%s}!UjRIKDPtmUMHw2a9d~k(c}CO3f4JGneSa$? zYzPRjgU#k5#_4*`o;*hvo=G_dArD?QGnu!;Soj-J%7gsHeA&n2=B2VbNZcHtSp;Ts zKF{gBKsz3!CwJSAf|f9Nfik}2J${Y4$JvjEOmPW;CLZM$KgYKF9dv?cQNe-W8S`8~ zc#rE@+^YA-V+iozrID3PW|ED7cxjx@U34?wXy74k_xp&&qj3^GjSf`UK%UZ91OW56 zo{wAcc6SB9gBPKKd3?@yws_FmaUFj*D}A7bd$`|EG#;O(Nw@$6MWB>NLpctX^AL|y z5#zfH8Am@CqLq8_0^3=}biQGcO{Vr?+!Z=b;5KgIDgV?bUJa830uU5|67J<}vv$YF zL~b*MT8$3*+|NE_Ld=wHMtJbx!AAuvn9U3p+7`_m&f$j8g!5~;#!spd&qhfK0SJmf zKG$j;zoPI;0ahJHnE-cEMYG5SQTMgH#7!v zBPWFpmGd)K_}L-j+ayUM0Kq0n=UncfllgulA8?Ol2&G8KrUSduhu(CjBL!rWh9|HN zY5p@-i3k5W#YY1>*vfiVu$ZN+VOxxIihR!G8Y}YrPq^B@c8qs}B#i(ljc^DLn7ttZ z*6}3IwTg7sOD=8cNGCeck#-c4PYzjuXkUJ|&qf-kWe1gPV-sa;pp4BCL%@WGhml;z zk)c=Jbv(oE{=n}^)EtR{pIuja$?MW6Au&Tvk{rR2!z)=*Anl}+bdz1BRC-CN^pIVo zqZCQ5WH^)xQY!zJO=5wy@;Ax!Ke!VFMIc|UwW_lkc}EVEbjO;<-J_#iAq&M4U(0^Y zkM2YO!MZzCrd!q9Rv9OIi#OrT8~!Mk^JJ#@tO`*j4@#$ss6_D$TS@`%h2H{y$kRLJwPXRH4sgy?kp9acU$Xw>KkTq;=Rk&&od32E$Qu@$~ZnTd+{8a^C@*-a}k3`8?)ybKw2vFt(M{yb>%qI2W(7+BV*h)F& zY^8!qc2G+_K76E+MmE{x(}p67DW;er3dpfrQLFfv*O}G4gOt40oV+=UfS?fMGlCO2 zoL!ToEY-~6T_(1e2PQ|htdQKfi-4dIc<8~Q9Loqw5}2KO7BiU-`Ju%hB>Ag1`EwWn z%B&!hz8uV945d??%T>cNzTq=wwlE*0O2wv1J|jR8gDgtfhl3bK57#-VeQf4ert%Fx zsdg%}gd zGRVM-H&_#bKMZ&S_0&+sHa4-I-&n;}Uq0(( zmU0@(0DvD201)yG0C@Xs3ONS=JlOz%OEUmKAPWG%b&(?LmcNUiR+F0;z8YU-_IY1tTOdTCU9c!6j zt+(@(XkAs;4cQT;PJg|%g4_H@YplK&R=k`Bnsjm=6|%V*q|(j9-$h~J4i`^P?hcsx6S6j;=83_$1vz5D4H7wLSY&ylPnSxSbiHP)PrS>sGWR$UBm4iL!I zCyQz1NVaU{t+eAh4o^;&+z+n>n@kl#_BEU^RBYo4?jAOLuq~v4bPi979k+~{uVGzI zI*8R}YoH;b83?4Jzyro4Vr(W$0aLcPwpsZy5E>O#N95Q>lqFx53D3Zb+{O@vh%JRX z(y#=JKM*U5Gek&M)6wjU=>z$4f=_d_no~(>c z{3)U8RW6uMhs3Ig9Wd4spd7fvxXE*r-f{45hZlV2b5*@(gTo%R$z+CXSebIREtPXDc$u7vULW?b=OX}ISX9rl#*>>E;)R9)z!T4Z?w}{v$z4{7VTq2u#c2U1wUuWe=4dj zNr*N_toy`M|4Rd7L+X$BqMF=fhyejJJtg|%_%?WGI2?{ZBF;WPRxR7fTilkjtBkffGJKI%+a z0*k<1$p+m>sf5;vT#*=|Ft1{fyrOTg5=9f6z!WA_ZN~jc>7~txF|{O(E}7F|%fiXd0|=fm6AHaH939 zKp-LiUb}RKN(mXdg-6Xf!_98WlHtX!-5}e06r(BmrWwcFN6{sA8hHsDls=rQ3~iK^ z0~338!gOPSd)x;sID^-bc`86cxRApY(3B8Fn54#J6}j9{`I5Ui=(pAqgAgdnM^mOQ z1}m@}fgzwKN1|VLSQ<*KrKW;^r8h6r&dqv5S;UC@z$$qOVrem9(&Y+`T~!VNv0 zKO|`2bl8bt?MnMjF%^umyOB?hRFaOdm290NPuix{7+OAKiGrv{XuXV=B98mU`EBU2 zf>YYcu*&C~K+VPkLeQb?X;UmQ`o3^#F26*uDRYu*M{s>E5yb&rSm43&8(XKeOWej? zN6Oz5n^&c^NCL^>5*3}PKfnwm=K_0aH>>Fa4w=0aYYj)vHW__ZO{+R0I%#xU=yio` zUxdeA54rZ@!O7EKbjME|^B~F}I$GUGAVTXJtqmsxVnZ+|K4p(IQI{fE<5iERouiE* zo4jLk0d9H&$~x!ObU(#7$eRLc?3lMyVhbsKKAKInJZV{Qz>HF3 z{yGV9)aI0)TfQ~4LI7suR|hiTW>iia{52IxRvExVhkHDk$D8g@NbGp0iJV|;-W?tL zD$^xI)5m;&kP%nDv$*156&Byf^l;cL^%1rHzAF75(E@WOBSmNS=~3>Ep#VSuzMLA4u)g;U%q0)HRMm1bjD} zN%=N=)f~AiCgkE)euI3+WUo#PK1!&i(dpJx#!&4eh=`hB@PYkx@$SdGmIXw%i*%Kf zIOCdzjG6j%lD|_-6OvrgFg1N>$l#Xd>DI1Js*&N4v3N}QJi4$W6N#uITj%dwD{I^rUQLHg8gwz5|f-q zuH%c$+qa1`vCR7}CUAOZet=VeQ-y~-IRsq#5ltKPz@!K{LU-nS-uZ8oP}VZr=-z^b z%j>EIJ*GbqL^ugNalo$#%y3`CBdfP&{kpiM$i36_V_X~&1L%k)m0*5((zp3G%SLbU zZ}VYpFu|5Z1E5cpzgKq!Q;wJf!~~?Cd!dB8ku!Z$1RG{*{OR`nqsq^5!hbADst}|Q z9YQu?s%8Bz77e4I{woRh|{ZpGp{>Okt>UsO+I~(a!w}N3EJXFs|0rU zmWVV;|4vjTMN>p|)k1`jh5DWoZ8T?PM#OQ$g>s;GJw>zU!Q7@Xx8A^Y&%n)GIa=|v z6Z#LN+8{eK?Zb;k&u)0jahiKn%1{IiOc$!&v4LOZl4{RAv1nDL>=FwOfn!f2H2|^^ z*1z58HCcI!Gr0WwRkj!GA7GW2HM^#fVm)l7gD!)wsxa|jqfh!)5UMMkb51abQ@v+% zPpfW49LLsyla=(>IM|JdSY;{jEPLb)ltzS-BwKxrASMFakvC)0@AZcaW}I@JB;8&uzjmJ%ck#Dcx*S0ad3kkN+$NR061@!oCx+V1Tlgm)6Q@Yfzbk*6 z&n!4$v^!LvrJ^0Sua&W7#dDnH5$KO&_8sBcA zyKM2H>xq+GsnWF@Dhz?QasSQ`wCr+o{4WF>7K=lxr#UO3q5PD6_JOC-NZ8Z3)1q~zRK5wbV;{qn+POJUJ%13e_buQiX!DKQR1Om^80 zRD&lMdf2-qZH@NGg`5WiaeiqLO*mKp!0MQh4`f<(`OQ{eq=~(&M2-v^dn`C#0BKxL zad;AJ6#TvcttA3H>{7-EmXV4wheJCtqS`%{8|qg41Zh*`zg|xna4+aXdb)Gx`6y(GF93SD*0(tuMb7|3t-lI5`8&pNTUQVqIl(%13Sg$nh6M2#Vi{Ry%x+NqrM;lx z=TZ@bR9m@kk=Ul4N5TEVa$9!BVF&}GUami5)5hRp+FY!5 zm43B(W8vVN1K`5vX8O`@VngT!EjDSJz{5J{VQ7l33wD59IKQM~o3?^*!82(wBt8&e z`q^vL^i;KMQ-RO?FuV`J(MDc0DV+-~{jHls5PSoQ}4E z4zLF1RKknp*LF9*NW^cmo2w5StZ`&io{#Ji%@&?l@6=nfV7}&=w$(q#Wr?wu&eXIq zsn~qIu@P!hd4^KgiY4o4e_;u#PGLElT95gC;{m;TACre3Cc@G^OxXuU$fif8XqGlf zE2WgdZV}+HYK%u#*3zV%e}Shy7Wjn$-PKEt>&~T8#3ihyhF}rZ%PPACCur;0n)U!T z$G5joZVdKFtF;cQstaQF=ck7BiVT^3$bhtPu^XQ5N$C?#M7ZlM$bU521YW z8DCanLdg^$ZpqYSj33_1k}YN_%&ZwXQ{~d{_*8RujL6emkZkC}&*fq7Cn=Co4@y%6 z80aneMcH#r^+?Ulv!)x6%<2AKs0iLq!1Y&$8ZhXMYXn)L4CDZtVhvxC3HisW^0pGr zUSYqExv`K<+%#8PlL=^CHT*j=Lu-FIV#LR`;QGakJKfVP5Ua5|LE)>e0xzGIP&SSB zS{cAXSaLvIo7#1sMT8#)WHoKzkk#4QA<7~*fn3nXX)6ng0gVp%!F@{?s~2*Ky-cAm z1=DYbIulqG?2v~mHDPR>TQ#CLNmfi}kXO~Arv7@8<(;H=!-NnAYTZ=Iw*G8Wt%(LK z78{M(fz?d#slT^{9XcflF+nMDKNRBOjpIxvENS~|R`-^Qw)b~2CPo2@mNo-x+@Smt zW)|r~+JYEZPR^N=_|Zfh%8kB9luxD-TEwQjq~%rCE5x4A2h!wsoh) za{xbSGh!T+xAkgAxv!{_1c~OIN{uXE{QB;b@F>e!QkIbpz1>el{a9}UjKWkAG#F|P zH2M@ULoBk1e|g2D8*(My?pik^R&!18L6KYK><}F*R4a@TP!M8GAdbO?H3{tCgb=;f zQLni&$o^sT9}|O8mW`Ue2x8-2H-Yvtq9<^TC+pGiL0bIs$Qh zIBMv`d-e$!MzuA67x%>`)!0r#`V)879w6C%mnAWCrQKtRo>KVNxVa}VM0c#Cth311 zl*0$fjU1!H{dTfV!9i;KYS%ui=N=b zE%lJmnj(W*b(HK=?{T>_D>XahE(@Saxs`rnmm zrM%l1ESTkA6rycM%1QLG#fM|!&$>MifIp}2B72VJ$_$6!x2_2afU7ACI$HNyY}*$` z@`ase2d;An|4ha^bponw8C%y{d=2|nGfRz_rOetYe=5%LUc*~W61shKQydeY{P{?8 zgTUr}XXt@>Sm17L(oN4QlM)~_--#}?P$e~MfxQJdsYf)3(%Q|h+!dm&amPpte}^9U zaANVy^%;l!%SZd-kNox1K3IBj!c#W=KJFb7LtQ5l<6q6)ua!~m%1ktzcV-69iAmqfjaLMposD7OHaa&@Ckos1hSdrmole|QK z2xyqAnDt|99Km5iC{~zxBf%c#F_tM#*^TV z-wA90YHRM!6D$4UxHtWj%=1)dMv#_0hJc7VtUe@O6qybBwK;}$bBr-}#!zs0hNefbu*Q9 z_k<6hRN`1|&uNr?;yjs0qU}B>o&zsEV}hUjXFU!bjx5Z{y$wDQ>M@#CyhC2Q6ig&q zC_6kaMs|6X8L2ya{w6Tp-j>QZk!w@#C5QLs3qBR0@~=&%%&d|oN;z*|eawA^P17b6 zHKln%Fe}S1cxb7jdID)9F!KP$l&jSQG5l|QKgr&qK!oQogJ5d}nC*Z^c4t9RjNWyV zptT$A34NSj;#=p2qCoZAJrZUYLkfuSSv#}`qCu#}4F51hCo`^KUg7n@-S=_nhTRE0 zbfvzH5r|7H95?(p<{Rcij$?s*5pjbm1x=}vaoUsNIKtqgt)c)8M}nL<719#vLl%?H91G_iN=_)aJFpBZ!rznDK~im9#4W zAPX+`-7?>NNq<0*!?|4fW_@thFdl`;L_Cu3WAhCA*~s3lpekTnGYDX=dRe$@4cX(+ z4Y*^0)Wfl5yo{j9=pc{dw}UHz-qCY9KKYskZ4elU0aNE!Dtg<*G&vn=beeXpOIRi- zo@RB4u?~*4KNM1n7i91@lsJ#rU~h+^)W-F!2flP>2`c4?hv4V^z{HVaav5@lNjUeB z$}Q1@FL%UhD^4j+uX=I}tb7|uFsgQ-?2A84OxA2@Gn$O3s5-tGsts_y8Tpuwb$D)5 zD_(YKKF`>a!6quoU9wAvy~Tg)sIaphhJb*ZIEG}=jcVj-IOtE-ULJHL8c%b}!LXqh zR&Qf`i#B?bz0(S&CVf)S{T@Vhy+L{8zqDz{U#tFY>$YoEy648L3>GeWkk_a<5<}rw zgQO$cw>6KEFGjwB6}jU9gmKipQ~rpOz;`^QHp6G$W5HPLK(oXra+LelTnN-bFZ-&@ ztJ2#s9=J-pAXiYK`6aN%Y4lt+G>?3LM63{l*lR)-*eYHtvH|fgNo}L#94txt2VX-+ zAE%JF*FKjB=eID)EYzRbqEMfHCGD@hj2CXSw$!3<>!6ulvxg{tU^rYk-)fKx^czo)(prCvhWj)SAmhV0Xmnnjw)UTYpd4TUp^zx zV()RRJ|S*3CZ(a1>UBy4`g6cNibCUaWz)BXd=;z|SsZ+yJF-uxgL&1-TDVqkh62yZ<-5cEh7YZ ztTOP0?@IoRB)C&ngGzPOTfUkoGt~R@g;X1( zi{mcYS!k)9TpnXHe93T3<;LY^|07&)); z$%uA6vZtyCknkDK<;Nr1x1QqYxWldvwLFw^P{1eP3lR~4TRL~nuWqaJu>qaz&`9cf zY9X&PZ9Z(7lBLO_q{>`NQkeY*i&(uleY`;dLfWpxtV$rXh@zr)9b5A0?h@ z809A-J@yX}`q47f!qvdz0^xk>c6n_eE=c#e%BK0cjBTh`)YN7~=BSB1QMTRjiNnqi zyQokIV&#p>eNYk(BD4Oc6`ZI@C#$T)_>OI>L+}n?keF4e_uTcJAefN}V;*qsjG(co z_uAXIrA$+>#e8Ubk#@TV$CFI`XfgV(L@5aDOS!I#KfBv}4s$gCApObxp*3y4B{H_i zn8;VKoZ;}6=x$Wj>Yt04QPlmqQ=Z(jDGrt7+Gft9T?z*U;BQK(nnMsn_phlu0a-c` z{swX#o|9X-qK`A^_Mah%c#xM1keqy-S}&Yb&LdvVZ3j~F+O_&?3k;~mYhTs@JjyHm zx@S1bJm`fnWC+NyTr)zMUE$Awg~Pp(jxVquT3T}#?`gFbH8;L_!%*ZrFSZwsRU-&u zgGeJq884GS_)gf@7!CvIfYxIeD03%%Ubl8j$1oa^)9*sox3K-7TuWD#`a@rp#`D4; zb`HqFK|Q+U{A&m=UWS|CRv)H>p$7dDDOghC&XfVVF1sV)#Iu_!p}=8Fa!bBhv6Iws z=bf4t7#Ub|0b6%?Mdq9DtAEx>n)G`3H&N`7)KohRyF+l61w;1-NJX~Xh|dUftdV)$ zxaRd5j3_MeJKWPxpEn|8yHxajr80ZE;tzdjzTMr{aIt*>jQ(`kH{F=*3z0ZxIgpvg z7xPxYU;!LZCMjMFrNKCs^BYYq=S?*|#!Tt=;J3ZcK<}}uTecsv%(Z2FSFpK*!KC~x zUGjioy)@qsT$YD8H~Sf;b78547C4~{2>~F_A6ST^&8h%b#_-R4VuXV!@kRb44Lz~e z0n?Q;aQ4=X`Tp5M=s%@1qY;XLIQQ6v9JEtejEL2|bBq=n=3a6D$Vf8j%eHb*0B+#z zm?tioQGbMRXQsE0a;c-i^woRP9FiHUS7kZ|!XynbYgiJD!^W5Z=pIwFc|mT`Mhr7f zZ{)$l63w4Ixxk|+#AylgYmKd-q5iN%kQIxfB;TyRd<$E!=_F67zCFFZmpmE~ddT2< zX&{p#Q^6d212$$N4FZ2spl=3!4sdkbVC|mYOdx7YI#jAcV;83x^y!chwNDM8qyPDg|mBBqX*0Fqa( zYxL<)o|9(>;3+N?8uCYWWRXaa9+bw`RLxEby5jY)$MBPjjM21j-U82u7KtQPFPWf= zV%ub*lD)9T^#NhXU9jE+!YmF<_`d|yvaBFKr!7Aa|A&x>dCio+E!4%&sUae9Rt~YWzv0JzLdQZSF(Zj#{93Cz7%Pu zDnZQJQG_2NnIm&%PX+ME*4NJzVM^kSns^L`C&}FNefz67cS}yo^GrZq}3W{{rWm5w4;<22xvN^{zYaD||&7NIWkv8-9qZJ_h zLYdwEC2YS}O{qTuU?;3ikT2$R4L3#y7`og@>UlzL5HJDHu~FK{uE%T}Ad)5zHKYTv z1nDZ{k<*(Z7#!?JBw_eli-oB@O1@Dv-;pV#;qRwQioUr+t~!}R5pKxwudXb9i&6s8 zmqAf`R6s>oL5ReUxJy7t;~0c;5X8qRZui@;!;2NYx_5>UdR$d#?+m@Ly)m*9rCDHgF_=9f&RBgLzs46F$;y<&+uPbi@9ECK0dexsA@eiQD!DjrFjCS zfQ{eWG2#Ho*#SmNe&u!NfHCEFH1eSms(c8&44v6}TC(1z+pl;Zw7N_nt-w{l0>kIu!J?X>aEy_{#TnFW(ZAElWFJvYXNo{h>PEFM^5l!uA`!n zjGo1L^Ul455x3Sf*92s~hi&h64xSJb-pYWmgmyu1V4WM@S1_|n%gQ@`inY6`6D?p` zukxuIhJD+mkmTfe2>W9)ewFh3SFlMzjDS@D48EX0Aoo_!MUMM&dP+$bnry+0+Gu>= z1Lpi^^$b;m=Evxxwny{kR7>7q=y160ia~b^_Acu zd2BVFcPm6DW{j%oivqJAx`p2pOYfx1lg#JFgl&mN>>RRlNFKA>JG9z%e}f^=w8Kf3 z={|Jzg1kz&zqYVvO|Nj&zPw&ym(GKNj?b-m<#q3jL%;0nkGJG|-sX^~R#gK`>Z#2q zIq`n8+e&ajabQ1HxAF0Zhhh>zVO(xOG6r1!{0&f7g8b{RJ&1+l&Usd4f9j6x?^b$K zi39WGmWYodDCBgu&!pY2NUG~rU@4iEl$llbSforeYfN5jhWK4(ygwMVjYc#~BJR|#m5YjbA^#^M zQ2{hT3lUn_FMeb1idit^UQFzt_84aRWhkpGpSR%BvEm*74GUl%yffoT@!V2HWBneK z-s_RxkJHw*<-D1Myh=?+q(f|%#2@0GmQzkJ<%IGZq5B)>SpcT>{woi~rCwr?uo!G$ z=AbhKTx>{E2Y)F17)oVU@STPf$~!WBDg5n%Vr|jvjJF&hU}i1yiU)@g33Zz(YIbhy zJtpw%6c49;sMw7B%)M0ow3ldJFb~Jet!b|utzk~`y#C2fq~FsD|H?eg{$wRV1qZTm z5{O^*r1q3P8bi&LEQkHk@UfxF~LA6 zz+p@Ndh`Zo+sYFJxu8-BP2WOlQk_v)Qpuk*4=lkLK?o7S`FASq-)QEG~nO-X;Eesmhp)XvUS;0he-}G{hOz&DF@vk#cA4!l0{i6 z!{}@JW>?@z4=R31%HBB@Af&5}pa0&r<9JcZSOePFcl726c>gLRQaT4ppJ3d`p;#8X zZTkL$^=H&A$FI>x9#n22{2!6`RcyW0am=EQ%txW~4Yq82G8iWiRhGqm_0d5%s+mm; z(iNdW^SzuNih2${STR{mE8|hLNUcs zomPNt)`Nq~)ZczW)h0HNim9E9oMo5eLFu_Z~B6DSSd}}oR&WHy} z9KWjs#lfLe`@IpIKcYE%oNtB*QVDOqog|F}@wVPD#c9h95N99ch>u?J+E>>eZ?lj+ zG=^x+)F=w&D&n;Byiz5+EO*b;-N^40i^s{7O=jf^A!5>aZri~Tr|&aC6X)>_=8|H@ zJ+=!pJj}8qJk##cL0VTEio4;lh%h)rJ_yBT3U7~$v|?K$UT5xtFbfIz#`JFtPf^wQ zgOl6IlGBiBGbCp*qsg2mIB4Y?JfvTd2$^yR7cmNA<+fR=TgCDoo|Kw6rD|MvL@23FKvq>6m56g|gZ%l$J-QzXkgmb*Q(TuEayb zL~F54Eg|k*`@k#NQC^V0V9%8b|MV+A2tS0-4XTpxxh#s1egr#xGY*)?b=ySf?aCNv z`LgdJa}Us65V3ghr$asV3a*;N=MdIO^p~X#C4mOrQwFI8;Pio05lX2j0WN4@fGBn&qW`COus|w_=dmP#C_&g9 zo?Bi&KQ}kX7$8c713-mD%r3tvz;ds%wi3y8VUmXxC3m9lOWzsM_S6lLXT|>Mh%}Fq(Yv3svU36P4StL`843f9 zQAk^TJ{PnfOkjInb8g>s4aqaiti9uLOw}IZ?sX3(6TvkNCk_br+@>P^+D!QyVi5Zi zLeRSFcKhw_@#BYdC5Dg|y9g5Ekbd|0Dx`?BaqJEKF)cyD=9YWVl>NVBRMx_X%~kvn z`M2^815Sv?%5z8|fTQoQ&(pX3Krv_^{n=@A56ZI(9IRU3mM8n}s1JN%X#wEfoUfQ3 z7uz0|U;7t-U`^14Gfw->pU>z>2oU#Lcy|f^hG9dCRd%PGg>6iLdzHvT=+pI7-7Uy8 zVD%WvU=x2$b{UN2qd&ZCZuIB(vDM!t=pZ14G4CDYcYIbN;vb_HwC_S<^ZG8ik}Mw! z#Nz9mDE8NYgAxEV$M0S@wdq3#&r(-f$lF_V(r;a&TX-Ps1MX9Sl;&;57HXldy^W~2 z-Fa4*fTP>8(2}X8Wl^!mKf8Clhx#E8eFw zFZ?m?*Z71AI>w#)eDGCab88W;r7~DCSjZ=Prqq0M8TAbKcgf(UbgcT9D9Wc6G?MjQ zqofm#jx-gZ&uikJA4`5u2P(p1wYPQ~@RCSf(Wq;{O1I4A=~eX<#SfE1YaH*$w)B}p zp2!PaQE!LW^;Fb#^ogIc-7-a4{>;X*x#R=OZ0;ugXI_eLyrL|pN`IGNTx@I8W=Sha z2B8*420ZU{d~XC9dRTTW z?w}2E1X4VgA+h$WM@Gp;7vf;WW4?ny8Z~JMX$_3wt90XVQcUeGMbY{|MzS; zcE9~=By}+S7Tq#IOM%AY)SR4sQ>f$uX5*2OY1+&+>w_y01i1aXc;1K5YFNz-o zt7rU~i(;;+C_-n{@MB!YjuqGx$fD{dIjHwYlTX_voOJF1OY=VR6cF=pPpaxee`Ze7 z77sX;rRm6dDia|&GB%4EZIDY+C{LyAK1z^CHcwQ}q;%^8ns(V*rC1ubL5*DyX{>v90_l*7VDdrT_ z!DNCB^4`Rlw|ppkTsN{1XQ4^aR}uE?jtDLW-%!SEoJGZr>5sb*e(;``%dKH-*ZOhS z5Goq+6rLpcA41l|BWjjJyPq^OX6Up)1q{?LCIs1|d^XZUsL4ZkV>z#|S6##3MZ8H-kQhb%hC#WU%2B!GRERO_tZcYXUGg3Lh z!8L}@o>Gim_{|px$>J8s^TUv%n(%ODcMR*j5UNjwzmEoNjvt?vHw((`5Ebb|+W>6CBa;_CLfPVYcc+p$GU6Mq)lm zSNc0O&*PSGw+H1Z8A>*(2_ZiAd2_}docneMJFhmkiv^K;FmUN*351j=` zhId}xUk1Z*i^F^a=Dgc|7CsY3!Mu!tMUnoU`>I?dg%$Fh0BGr=bXiG$6wm`&k|z3b z4c?c`vQjMh z1}nbw&sQ8DAZ3ftwtL>mN6}79XlXLjhPIj(0$*8_bdT|z@!ir=BXY!14AbeL*`ymO zz)-iKR)yi}whlh6e;n`OEa5*o(1TUQOC5qbHL5~oegY{*D8Ww(RQYo4zs~8lR#Hp9 zp|4MbvKf%q_Wv32i!XWc3{XQpWzmdJDP0-tFdd($O)C4i6DHjNyJnhmMqUQ~j+dX! zHHbonJ#9+gG#5z5Xid@rK^`hTEtGNrpNEyC>}Lb@=45(O;EaQd9Hy`;noqcva^>q(9bgbh4=|t%|HhyDqjT z5AUOAPdnY`w+L;$S$n`xqMXn!fB zrK+tFlJ2crOy%yi{O`e3kYN%FaSwcHBq;@~wh+tNV?t~EE(XWNSsIZ|qQmFKoG;nx z^IHF=X=e@bC$&!|Gjbc%x@Uv(Myu0h{uRPZ=}j1&HYamCIcs-1p!#~0rHdn(qx#91 z@xT>a`74g!#GeDKPqui_p)pN+7A%cydtLHQ*MFEk=R?Ir({KtHS^0iAoY|-^P$PN%vR_sF8vUJTV* z)z#_i(P|@uim-2-d51`4wa0a>$WAu=q8xGjby~{Un%@O9S;x`M)mkc+6AO^6(Egsw z%OcD`6R8h)!5Zq1W8mB(#_8E=aaA}-S2*;ShE#l=FNwzJUd+GoDF5cwN}lAz@%i(K zR}V8x6v+qbX+>?6ho`AvUvJc5tvP}r|D2^Qu;QfDr%3?LfPXU0uw2D-N Igjv}C0T$v=j{pDw diff --git a/experiments/beeware_pythonnative/tests/__init__.py b/experiments/beeware_pythonnative/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/experiments/beeware_pythonnative/tests/beeware_pythonnative.py b/experiments/beeware_pythonnative/tests/beeware_pythonnative.py deleted file mode 100644 index e1324c6..0000000 --- a/experiments/beeware_pythonnative/tests/beeware_pythonnative.py +++ /dev/null @@ -1,36 +0,0 @@ -import os -import sys -import tempfile -from pathlib import Path - -import pytest - - -def run_tests(): - project_path = Path(__file__).parent.parent - os.chdir(project_path) - - # Determine any args to pass to pytest. If there aren't any, - # default to running the whole test suite. - args = sys.argv[1:] - if len(args) == 0: - args = ["tests"] - - returncode = pytest.main( - [ - # Turn up verbosity - "-vv", - # Disable color - "--color=no", - # Overwrite the cache directory to somewhere writable - "-o", - f"cache_dir={tempfile.gettempdir()}/.pytest_cache", - ] - + args - ) - - print(f">>>>>>>>>> EXIT {returncode} <<<<<<<<<<") - - -if __name__ == "__main__": - run_tests() diff --git a/experiments/beeware_pythonnative/tests/test_app.py b/experiments/beeware_pythonnative/tests/test_app.py deleted file mode 100644 index 896e9a8..0000000 --- a/experiments/beeware_pythonnative/tests/test_app.py +++ /dev/null @@ -1,3 +0,0 @@ -def test_first(): - "An initial test for the app" - assert 1 + 1 == 2 diff --git a/experiments/metadata_generators/__init__.py b/experiments/metadata_generators/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/experiments/metadata_generators/android_metadata_generator.py b/experiments/metadata_generators/android_metadata_generator.py deleted file mode 100644 index b50acda..0000000 --- a/experiments/metadata_generators/android_metadata_generator.py +++ /dev/null @@ -1,51 +0,0 @@ -import os - -# Set the classpath to include the android.jar file -# This approach will allow Pyjnius to find the necessary Java classes when -# interacting with the Android SDK from within your Python script -os.environ[ - "CLASSPATH" -] = "/Users/owencarey/Library/Android/sdk/platforms/android-33/android.jar" - -# Use OpenJDK 8 -os.environ["JAVA_HOME"] = "/usr/local/opt/openjdk@8/libexec/openjdk.jdk/Contents/Home" - -from jnius import autoclass -import json - -# Load the necessary Java classes using pyjnius -ContextClass = autoclass("android.widget.Button") -ModifierClass = autoclass("java.lang.reflect.Modifier") - - -def extract(java_class): - # Get all the methods of the Android class - methods = java_class.getMethods() - # Extract metadata for each method - data = [] - for method in methods: - method_name = method.getName() - method_return_type = method.getReturnType().getSimpleName() - method_parameters = method.getParameterTypes() - method_parameter_types = [param.getSimpleName() for param in method_parameters] - method_modifiers = ModifierClass.toString(method.getModifiers()) - method_metadata = { - "Name": method_name, - "ReturnType": method_return_type, - "ParameterTypes": method_parameter_types, - "Modifiers": method_modifiers, - "Type": "Method", # since we're only dealing with methods here - } - data.append(method_metadata) - return data - - -def main(): - metadata = extract(ContextClass) - # Save the extracted metadata - with open("android_metadata.json", "w") as f: - json.dump(metadata, f, indent=2) - - -if __name__ == "__main__": - main() diff --git a/experiments/metadata_generators/ios_metadata_generator.py b/experiments/metadata_generators/ios_metadata_generator.py deleted file mode 100644 index 8de8ada..0000000 --- a/experiments/metadata_generators/ios_metadata_generator.py +++ /dev/null @@ -1,67 +0,0 @@ -import clang.cindex -import json - -clang.cindex.Config.set_library_path("/usr/local/Cellar/llvm/16.0.4/lib/") -index = clang.cindex.Index.create() - - -def extract(cursor): - print(f"{cursor.kind}: {cursor.spelling}") - data = {"Name": cursor.spelling} - if cursor.kind == clang.cindex.CursorKind.OBJC_INTERFACE_DECL: - data["Type"] = "Interface" - elif cursor.kind in [ - clang.cindex.CursorKind.OBJC_INSTANCE_METHOD_DECL, - clang.cindex.CursorKind.OBJC_CLASS_METHOD_DECL, - ]: - data["Type"] = "Method" - elif cursor.kind == clang.cindex.CursorKind.OBJC_PROPERTY_DECL: - data["Type"] = "Property" - else: - data["Type"] = "Other" # Add this line - try: - children = [extract(c) for c in cursor.get_children()] - except ValueError as e: - print(f"Encountered error with cursor {cursor.spelling}: {e}") - children = [] - children = [c for c in children if c is not None] - if children: - data["Children"] = children - return data - - -def main(): - args = [ - "-x", - "objective-c", - "-arch", - "arm64", - "-fno-objc-arc", - # "-fmodules", - # "-fmodule-maps", - "-ferror-limit=0", - "-isysroot", - "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk", - "-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include", - "-I/usr/local/include", - "-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.3/include", - "-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include", - "-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include", - "-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks", - ] - tu = index.parse( - "/Applications/Xcode.app/Contents/Developer/Platforms/" - "iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/" - "Library/Frameworks/UIKit.framework/Headers/UIKit.h", - args, - ) - print(f"Translation unit: {tu.spelling}") - for diag in tu.diagnostics: - print(diag) - metadata = extract(tu.cursor) - with open("ios_metadata.json", "w") as f: - json.dump(metadata, f, indent=2) - - -if __name__ == "__main__": - main() diff --git a/experiments/rubicon_tests/__init__.py b/experiments/rubicon_tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/experiments/rubicon_tests/rubicon_java_tests.py b/experiments/rubicon_tests/rubicon_java_tests.py deleted file mode 100644 index e18ea78..0000000 --- a/experiments/rubicon_tests/rubicon_java_tests.py +++ /dev/null @@ -1,14 +0,0 @@ -from rubicon.java import JavaClass - - -def main(): - """ - https://github.com/beeware/rubicon-java. - """ - URL = JavaClass("java/net/URL") - url = URL("https://beeware.org") - print(url.getHost()) - - -if __name__ == "__main__": - main() diff --git a/experiments/rubicon_tests/rubicon_objc_test.py b/experiments/rubicon_tests/rubicon_objc_test.py deleted file mode 100644 index 26ce69c..0000000 --- a/experiments/rubicon_tests/rubicon_objc_test.py +++ /dev/null @@ -1,16 +0,0 @@ -from rubicon.objc import ObjCClass - - -def main(): - """ - https://rubicon-objc.readthedocs.io/en/stable/tutorial/tutorial-1.html. - """ - NSURL = ObjCClass("NSURL") - base = NSURL.URLWithString("https://beeware.org/") - full = NSURL.URLWithString("contributing/", relativeToURL=base) - absolute = full.absoluteURL - print(absolute.description) - - -if __name__ == "__main__": - main() diff --git a/experiments/ui_elements/__init__.py b/experiments/ui_elements/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/experiments/ui_elements/android_ui_elements.py b/experiments/ui_elements/android_ui_elements.py deleted file mode 100644 index f4df562..0000000 --- a/experiments/ui_elements/android_ui_elements.py +++ /dev/null @@ -1,52 +0,0 @@ -from java import jclass - -# Layouts -AbsoluteLayout = jclass("android.widget.AbsoluteLayout") -CoordinatorLayout = jclass("androidx.coordinatorlayout.widget.CoordinatorLayout") -ConstraintLayout = jclass("androidx.constraintlayout.widget.ConstraintLayout") -DrawerLayout = jclass("androidx.drawerlayout.widget.DrawerLayout") -FrameLayout = jclass("android.widget.FrameLayout") -GridLayout = jclass("android.widget.GridLayout") -HorizontalScrollView = jclass("android.widget.HorizontalScrollView") -LinearLayout = jclass("android.widget.LinearLayout") -RelativeLayout = jclass("android.widget.RelativeLayout") -RecyclerView = jclass("androidx.recyclerview.widget.RecyclerView") -ScrollView = jclass("android.widget.ScrollView") -TableLayout = jclass("android.widget.TableLayout") -TableRow = jclass("android.widget.TableRow") - -# Widgets -AutoCompleteTextView = jclass("android.widget.AutoCompleteTextView") -Button = jclass("android.widget.Button") -CheckBox = jclass("android.widget.CheckBox") -DatePicker = jclass("android.widget.DatePicker") -EditText = jclass("android.widget.EditText") -ImageView = jclass("android.widget.ImageView") -ProgressBar = jclass("android.widget.ProgressBar") -RadioButton = jclass("android.widget.RadioButton") -RatingBar = jclass("android.widget.RatingBar") -SeekBar = jclass("android.widget.SeekBar") -Spinner = jclass("android.widget.Spinner") -Switch = jclass("android.widget.Switch") -TextView = jclass("android.widget.TextView") -TimePicker = jclass("android.widget.TimePicker") -ToggleButton = jclass("android.widget.ToggleButton") -ViewFlipper = jclass("android.widget.ViewFlipper") -ViewSwitcher = jclass("android.widget.ViewSwitcher") -WebView = jclass("android.webkit.WebView") - -# Material Components -BottomNavigationView = jclass( - "com.google.android.material.bottomnavigation.BottomNavigationView" -) -BottomSheetDialogFragment = jclass( - "com.google.android.material.bottomsheet.BottomSheetDialogFragment" -) -Chip = jclass("com.google.android.material.chip.Chip") -FloatingActionButton = jclass( - "com.google.android.material.floatingactionbutton.FloatingActionButton" -) -MaterialCardView = jclass("com.google.android.material.card.MaterialCardView") -NavigationView = jclass("com.google.android.material.navigation.NavigationView") -Snackbar = jclass("com.google.android.material.snackbar.Snackbar") -TextInputLayout = jclass("com.google.android.material.textfield.TextInputLayout") diff --git a/experiments/ui_elements/ios_ui_elements.py b/experiments/ui_elements/ios_ui_elements.py deleted file mode 100644 index 9cae5fa..0000000 --- a/experiments/ui_elements/ios_ui_elements.py +++ /dev/null @@ -1,132 +0,0 @@ -from rubicon.objc import ObjCClass - -# App and Window -UIApplication = ObjCClass("UIApplication") -UIWindow = ObjCClass("UIWindow") - -# Base classes -UIView = ObjCClass("UIView") -UIViewController = ObjCClass("UIViewController") - -# Bar classes -UIBarButtonItem = ObjCClass("UIBarButtonItem") -UINavigationBar = ObjCClass("UINavigationBar") -UITabBar = ObjCClass("UITabBar") -UITabBarItem = ObjCClass("UITabBarItem") -UIToolbar = ObjCClass("UIToolbar") - -# Controls -UIButton = ObjCClass("UIButton") -UIDatePicker = ObjCClass("UIDatePicker") -UIImageView = ObjCClass("UIImageView") -UILabel = ObjCClass("UILabel") -UIPickerView = ObjCClass("UIPickerView") -UIProgressView = ObjCClass("UIProgressView") -UISegmentedControl = ObjCClass("UISegmentedControl") -UISlider = ObjCClass("UISlider") -UISwitch = ObjCClass("UISwitch") -UITextField = ObjCClass("UITextField") -UITextView = ObjCClass("UITextView") - -# Controllers -UINavigationController = ObjCClass("UINavigationController") -UITabBarController = ObjCClass("UITabBarController") - -# Indicators -UIActivityIndicatorView = ObjCClass("UIActivityIndicatorView") -UIPageControl = ObjCClass("UIPageControl") -UIProgressView = ObjCClass("UIProgressView") -UIRefreshControl = ObjCClass("UIRefreshControl") - -# Layouts and Views -UICollectionView = ObjCClass("UICollectionView") -UIScrollView = ObjCClass("UIScrollView") -UITableView = ObjCClass("UITableView") -UIStackView = ObjCClass("UIStackView") -UIView = ObjCClass("UIView") - -# Misc -UIAlertController = ObjCClass("UIAlertController") -UIAlertAction = ObjCClass("UIAlertAction") -UIColor = ObjCClass("UIColor") - -# Web view -WKWebView = ObjCClass("WKWebView") - -# Gesture Recognizers -UIGestureRecognizer = ObjCClass("UIGestureRecognizer") -UILongPressGestureRecognizer = ObjCClass("UILongPressGestureRecognizer") -UIPanGestureRecognizer = ObjCClass("UIPanGestureRecognizer") -UIPinchGestureRecognizer = ObjCClass("UIPinchGestureRecognizer") -UIRotationGestureRecognizer = ObjCClass("UIRotationGestureRecognizer") -UIScreenEdgePanGestureRecognizer = ObjCClass("UIScreenEdgePanGestureRecognizer") -UISwipeGestureRecognizer = ObjCClass("UISwipeGestureRecognizer") -UITapGestureRecognizer = ObjCClass("UITapGestureRecognizer") - -# Audio and Video -AVAudioPlayer = ObjCClass("AVAudioPlayer") -AVPlayer = ObjCClass("AVPlayer") -AVPlayerViewController = ObjCClass("AVPlayerViewController") -MPMoviePlayerController = ObjCClass("MPMoviePlayerController") - -# Data and Documents -UIDocument = ObjCClass("UIDocument") -UIDocumentInteractionController = ObjCClass("UIDocumentInteractionController") -UIDocumentMenuViewController = ObjCClass("UIDocumentMenuViewController") -UIDocumentPickerViewController = ObjCClass("UIDocumentPickerViewController") -UIDocumentBrowserViewController = ObjCClass("UIDocumentBrowserViewController") - -# Drawing and Graphics -UIGraphicsImageRenderer = ObjCClass("UIGraphicsImageRenderer") - -# Feedback -UIFeedbackGenerator = ObjCClass("UIFeedbackGenerator") - -# Interactions and Effects -UIBlurEffect = ObjCClass("UIBlurEffect") -UIInterpolatingMotionEffect = ObjCClass("UIInterpolatingMotionEffect") -UIVibrancyEffect = ObjCClass("UIVibrancyEffect") -UIVisualEffect = ObjCClass("UIVisualEffect") -UIVisualEffectView = ObjCClass("UIVisualEffectView") - -# Popovers and Modality -UIPopoverController = ObjCClass("UIPopoverController") -UIPresentationController = ObjCClass("UIPresentationController") - -# Printing -UIPrintInteractionController = ObjCClass("UIPrintInteractionController") -UIPrintPageRenderer = ObjCClass("UIPrintPageRenderer") -UIPrintPaper = ObjCClass("UIPrintPaper") - -# Text and Fonts -UIFont = ObjCClass("UIFont") -UIFontDescriptor = ObjCClass("UIFontDescriptor") - -# Touches and Gestures -UITouch = ObjCClass("UITouch") - -# Traits and Environment -UITraitCollection = ObjCClass("UITraitCollection") - -# View Controller Presentation -UIAdaptivePresentationControllerDelegate = ObjCClass( - "UIAdaptivePresentationControllerDelegate" -) - -# View Management -UILayoutGuide = ObjCClass("UILayoutGuide") -UIResponder = ObjCClass("UIResponder") -UIScreen = ObjCClass("UIScreen") -UIViewPropertyAnimator = ObjCClass("UIViewPropertyAnimator") -UIWindowScene = ObjCClass("UIWindowScene") - -# Visualization -UIBezierPath = ObjCClass("UIBezierPath") -UIGraphicsRenderer = ObjCClass("UIGraphicsRenderer") -UIGraphicsRendererContext = ObjCClass("UIGraphicsRendererContext") -UIGraphicsRendererFormat = ObjCClass("UIGraphicsRendererFormat") -UIImage = ObjCClass("UIImage") -UIMotionEffect = ObjCClass("UIMotionEffect") - -# Miscellaneous -UILocalNotification = ObjCClass("UILocalNotification") From a326ceb23c2cfaba409f11451a1c0000f0afbf5e Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Tue, 14 Oct 2025 10:30:26 -0700 Subject: [PATCH 64/66] refactor(components,core): align component names with docs --- src/pythonnative/__init__.py | 6 +++++- ...idicator_view.py => material_activity_indicator_view.py} | 0 ...avigation_view.py => material_bottom_navigation_view.py} | 0 .../{top_navigation_view.py => material_toolbar.py} | 0 4 files changed, 5 insertions(+), 1 deletion(-) rename src/pythonnative/{material_activity_inidicator_view.py => material_activity_indicator_view.py} (100%) rename src/pythonnative/{bottom_navigation_view.py => material_bottom_navigation_view.py} (100%) rename src/pythonnative/{top_navigation_view.py => material_toolbar.py} (100%) diff --git a/src/pythonnative/__init__.py b/src/pythonnative/__init__.py index 048ae32..11912e5 100644 --- a/src/pythonnative/__init__.py +++ b/src/pythonnative/__init__.py @@ -15,6 +15,8 @@ "MaterialSearchBar", "MaterialSwitch", "MaterialTimePicker", + "MaterialBottomNavigationView", + "MaterialToolbar", "Page", "PickerView", "ProgressView", @@ -35,13 +37,15 @@ "ImageView": ".image_view", "Label": ".label", "ListView": ".list_view", - "MaterialActivityIndicatorView": ".material_activity_inidicator_view", + "MaterialActivityIndicatorView": ".material_activity_indicator_view", "MaterialButton": ".material_button", "MaterialDatePicker": ".material_date_picker", "MaterialProgressView": ".material_progress_view", "MaterialSearchBar": ".material_search_bar", "MaterialSwitch": ".material_switch", "MaterialTimePicker": ".material_time_picker", + "MaterialBottomNavigationView": ".material_bottom_navigation_view", + "MaterialToolbar": ".material_toolbar", "Page": ".page", "PickerView": ".picker_view", "ProgressView": ".progress_view", diff --git a/src/pythonnative/material_activity_inidicator_view.py b/src/pythonnative/material_activity_indicator_view.py similarity index 100% rename from src/pythonnative/material_activity_inidicator_view.py rename to src/pythonnative/material_activity_indicator_view.py diff --git a/src/pythonnative/bottom_navigation_view.py b/src/pythonnative/material_bottom_navigation_view.py similarity index 100% rename from src/pythonnative/bottom_navigation_view.py rename to src/pythonnative/material_bottom_navigation_view.py diff --git a/src/pythonnative/top_navigation_view.py b/src/pythonnative/material_toolbar.py similarity index 100% rename from src/pythonnative/top_navigation_view.py rename to src/pythonnative/material_toolbar.py From 64ab2666fe09f036934d3922ab55e8e599df3c35 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Tue, 14 Oct 2025 10:42:16 -0700 Subject: [PATCH 65/66] chore(templates): scrub DEVELOPMENT_TEAM from iOS template --- .../ios_template.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj b/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj index c43f4bc..1f86685 100644 --- a/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +++ b/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj @@ -478,7 +478,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = VCRNX87X5M; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ios_template/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -506,7 +506,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = VCRNX87X5M; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ios_template/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -534,7 +534,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = VCRNX87X5M; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.4; MARKETING_VERSION = 1.0; @@ -554,7 +554,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = VCRNX87X5M; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.4; MARKETING_VERSION = 1.0; @@ -573,7 +573,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = VCRNX87X5M; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-templateUITests"; @@ -591,7 +591,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = VCRNX87X5M; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "com.pythonnative.ios-templateUITests"; From d3f8d31942c3ca5d1657024e3a5cb332787afcd8 Mon Sep 17 00:00:00 2001 From: Owen Carey Date: Tue, 14 Oct 2025 11:05:21 -0700 Subject: [PATCH 66/66] chore(repo,core,mkdocs): bump version to 0.2.0 --- docs/meta/roadmap.md | 1 - pyproject.toml | 2 +- src/pythonnative/__init__.py | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/meta/roadmap.md b/docs/meta/roadmap.md index 1dd140a..5cb3873 100644 --- a/docs/meta/roadmap.md +++ b/docs/meta/roadmap.md @@ -7,7 +7,6 @@ title: Roadmap This roadmap focuses on transforming PythonNative into a workable, React Native / Expo-like framework from a developer-experience and simplicity standpoint. Releases are incremental and designed to be shippable, with DX-first improvements balanced with platform capability. Assumptions -- Current version: 0.1.0 - Scope: Android (Chaquopy/Java bridge) and iOS (Rubicon-ObjC), Python 3.9–3.12 - Goals: Zero-config templates, one CLI, fast iteration loop, portable component API, and a curated subset of native capabilities with room to expand. diff --git a/pyproject.toml b/pyproject.toml index 585dd5c..4ca1465 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pythonnative" -version = "0.1.0" +version = "0.2.0" description = "Cross-platform native UI toolkit for Android and iOS" authors = [ { name = "Owen Carey" } diff --git a/src/pythonnative/__init__.py b/src/pythonnative/__init__.py index 11912e5..78d2ebc 100644 --- a/src/pythonnative/__init__.py +++ b/src/pythonnative/__init__.py @@ -1,6 +1,8 @@ from importlib import import_module from typing import Any, Dict +__version__ = "0.2.0" + __all__ = [ "ActivityIndicatorView", "Button",