Forráskód Böngészése

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

Elijah Ahianyo 1 éve
szülő
commit
689f078aa3
2 módosított fájl, 45 hozzáadás és 5 törlés
  1. 10 1
      reflex/utils/prerequisites.py
  2. 35 4
      tests/test_utils.py

+ 10 - 1
reflex/utils/prerequisites.py

@@ -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)
 

+ 35 - 4
tests/test_utils.py

@@ -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()