Fix Node Installation on ARM-based Macs with FNM (#1701)

This commit is contained in:
Elijah Ahianyo 2023-08-29 21:59:56 +00:00 committed by GitHub
parent 1372042228
commit 689f078aa3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 5 deletions

View File

@ -5,6 +5,7 @@ from __future__ import annotations
import glob
import json
import os
import platform
import re
import stat
import sys
@ -326,14 +327,22 @@ def install_node():
# Add execute permissions to fnm executable.
os.chmod(constants.FNM_EXE, stat.S_IXUSR)
# Install node.
# Specify arm64 arch explicitly for M1s and M2s.
architecture_arg = (
["--arch=arm64"]
if platform.system() == "Darwin" and platform.machine() == "arm64"
else []
)
process = processes.new_process(
[
constants.FNM_EXE,
"install",
*architecture_arg,
constants.NODE_VERSION,
"--fnm-dir",
constants.FNM_DIR,
]
],
)
processes.show_status("Installing node", process)

View File

@ -549,13 +549,32 @@ def test_node_install_windows(tmp_path, mocker):
download.assert_called_once()
def test_node_install_unix(tmp_path, mocker):
@pytest.mark.parametrize(
"machine, system",
[
("x64", "Darwin"),
("arm64", "Darwin"),
("x64", "Windows"),
("arm64", "Windows"),
("armv7", "Linux"),
("armv8-a", "Linux"),
("armv8.1-a", "Linux"),
("armv8.2-a", "Linux"),
("armv8.3-a", "Linux"),
("armv8.4-a", "Linux"),
("aarch64", "Linux"),
("aarch32", "Linux"),
],
)
def test_node_install_unix(tmp_path, mocker, machine, system):
fnm_root_path = tmp_path / "reflex" / "fnm"
fnm_exe = fnm_root_path / "fnm"
mocker.patch("reflex.utils.prerequisites.constants.FNM_DIR", fnm_root_path)
mocker.patch("reflex.utils.prerequisites.constants.FNM_EXE", fnm_exe)
mocker.patch("reflex.utils.prerequisites.constants.IS_WINDOWS", False)
mocker.patch("reflex.utils.prerequisites.platform.machine", return_value=machine)
mocker.patch("reflex.utils.prerequisites.platform.system", return_value=system)
class Resp(Base):
status_code = 200
@ -571,9 +590,21 @@ def test_node_install_unix(tmp_path, mocker):
assert fnm_root_path.exists()
download.assert_called_once()
process.assert_called_with(
[fnm_exe, "install", constants.NODE_VERSION, "--fnm-dir", fnm_root_path]
)
if system == "Darwin" and machine == "arm64":
process.assert_called_with(
[
fnm_exe,
"install",
"--arch=arm64",
constants.NODE_VERSION,
"--fnm-dir",
fnm_root_path,
]
)
else:
process.assert_called_with(
[fnm_exe, "install", constants.NODE_VERSION, "--fnm-dir", fnm_root_path]
)
chmod.assert_called_once()