1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
import shutil
import sys
from unittest.mock import MagicMock, call
import pytest
from briefcase.integrations.subprocess import Subprocess
from briefcase.platforms.iOS.xcode import iOSXcodeUpdateCommand
from ....utils import create_file
@pytest.fixture
def update_command(dummy_console, tmp_path):
return iOSXcodeUpdateCommand(
console=dummy_console,
base_path=tmp_path / "base_path",
data_path=tmp_path / "briefcase",
)
@pytest.mark.parametrize(
"old_config, device_config_path, sim_config_path",
[
(
False,
"Python.xcframework/ios-arm64/platform-config/arm64-iphoneos",
"Python.xcframework/ios-arm64_x86_64-simulator/platform-config/wonky-iphonesimulator",
),
(
True,
"platform-site/iphoneos.arm64",
"platform-site/iphonesimulator.wonky",
),
],
)
def test_extra_pip_args(
update_command,
first_app_generated,
old_config,
device_config_path,
sim_config_path,
tmp_path,
):
"""Extra iOS-specific args are included in calls to pip during update."""
# If we're testing an old config, delete the xcframework. This deletes the platform
# config folders, forcing a fallback to the older locations.
if old_config:
shutil.rmtree(
tmp_path / "base_path/build/first-app/ios/xcode/Support/Python.xcframework"
)
# Create the old-style VERSIONS file with a deliberately weird min iOS version
create_file(
tmp_path / "base_path/build/first-app/ios/xcode/Support/VERSIONS",
"\n".join(
[
"Python version: 3.10.15",
"Build: b11",
"Min iOS version: 12.0",
"---------------------",
"BZip2: 1.0.8-1",
"libFFI: 3.4.6-1",
"OpenSSL: 3.0.15-1",
"XZ: 5.6.2-1",
"",
]
),
)
# Hard code the current architecture for testing. We only install simulator
# requirements for the current platform.
update_command.tools.host_arch = "wonky"
first_app_generated.requires = ["something==1.2.3", "other>=2.3.4"]
update_command.tools[first_app_generated].app_context = MagicMock(
spec_set=Subprocess
)
update_command.install_app_requirements(first_app_generated)
bundle_path = tmp_path / "base_path/build/first-app/ios/xcode"
assert update_command.tools[first_app_generated].app_context.run.mock_calls == [
call(
[
sys.executable,
"-u",
"-X",
"utf8",
"-m",
"pip",
"install",
"--disable-pip-version-check",
"--upgrade",
"--no-user",
f"--target={bundle_path / 'app_packages.iphoneos'}",
"--only-binary=:all:",
"--extra-index-url",
"https://pypi.anaconda.org/beeware/simple",
"--platform=ios_12_0_arm64_iphoneos",
"something==1.2.3",
"other>=2.3.4",
],
check=True,
encoding="UTF-8",
env={
"PYTHONPATH": str(
tmp_path
/ "base_path/build/first-app/ios/xcode/Support"
/ device_config_path
),
"PIP_REQUIRE_VIRTUALENV": None,
},
),
call(
[
sys.executable,
"-u",
"-X",
"utf8",
"-m",
"pip",
"install",
"--disable-pip-version-check",
"--upgrade",
"--no-user",
f"--target={bundle_path / 'app_packages.iphonesimulator'}",
"--only-binary=:all:",
"--extra-index-url",
"https://pypi.anaconda.org/beeware/simple",
"--platform=ios_12_0_wonky_iphonesimulator",
"something==1.2.3",
"other>=2.3.4",
],
check=True,
encoding="UTF-8",
env={
"PYTHONPATH": str(
tmp_path
/ "base_path/build/first-app/ios/xcode/Support"
/ sim_config_path
),
"PIP_REQUIRE_VIRTUALENV": None,
},
),
]
|