|
@@ -1,20 +1,28 @@
|
|
import json
|
|
import json
|
|
import re
|
|
import re
|
|
|
|
+import shutil
|
|
import tempfile
|
|
import tempfile
|
|
|
|
+from pathlib import Path
|
|
from unittest.mock import Mock, mock_open
|
|
from unittest.mock import Mock, mock_open
|
|
|
|
|
|
import pytest
|
|
import pytest
|
|
|
|
+from typer.testing import CliRunner
|
|
|
|
|
|
from reflex import constants
|
|
from reflex import constants
|
|
from reflex.config import Config
|
|
from reflex.config import Config
|
|
|
|
+from reflex.reflex import cli
|
|
|
|
+from reflex.testing import chdir
|
|
from reflex.utils.prerequisites import (
|
|
from reflex.utils.prerequisites import (
|
|
CpuInfo,
|
|
CpuInfo,
|
|
_update_next_config,
|
|
_update_next_config,
|
|
cached_procedure,
|
|
cached_procedure,
|
|
get_cpu_info,
|
|
get_cpu_info,
|
|
initialize_requirements_txt,
|
|
initialize_requirements_txt,
|
|
|
|
+ rename_imports_and_app_name,
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+runner = CliRunner()
|
|
|
|
+
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
@pytest.mark.parametrize(
|
|
"config, export, expected_output",
|
|
"config, export, expected_output",
|
|
@@ -224,3 +232,156 @@ def test_get_cpu_info():
|
|
for attr in ("manufacturer_id", "model_name", "address_width"):
|
|
for attr in ("manufacturer_id", "model_name", "address_width"):
|
|
value = getattr(cpu_info, attr)
|
|
value = getattr(cpu_info, attr)
|
|
assert value.strip() if attr != "address_width" else value
|
|
assert value.strip() if attr != "address_width" else value
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@pytest.fixture
|
|
|
|
+def temp_directory():
|
|
|
|
+ temp_dir = tempfile.mkdtemp()
|
|
|
|
+ yield Path(temp_dir)
|
|
|
|
+ shutil.rmtree(temp_dir)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@pytest.mark.parametrize(
|
|
|
|
+ "config_code,expected",
|
|
|
|
+ [
|
|
|
|
+ ("rx.Config(app_name='old_name')", 'rx.Config(app_name="new_name")'),
|
|
|
|
+ ('rx.Config(app_name="old_name")', 'rx.Config(app_name="new_name")'),
|
|
|
|
+ ("rx.Config('old_name')", 'rx.Config("new_name")'),
|
|
|
|
+ ('rx.Config("old_name")', 'rx.Config("new_name")'),
|
|
|
|
+ ],
|
|
|
|
+)
|
|
|
|
+def test_rename_imports_and_app_name(temp_directory, config_code, expected):
|
|
|
|
+ file_path = temp_directory / "rxconfig.py"
|
|
|
|
+ content = f"""
|
|
|
|
+config = {config_code}
|
|
|
|
+"""
|
|
|
|
+ file_path.write_text(content)
|
|
|
|
+
|
|
|
|
+ rename_imports_and_app_name(file_path, "old_name", "new_name")
|
|
|
|
+
|
|
|
|
+ updated_content = file_path.read_text()
|
|
|
|
+ expected_content = f"""
|
|
|
|
+config = {expected}
|
|
|
|
+"""
|
|
|
|
+ assert updated_content == expected_content
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def test_regex_edge_cases(temp_directory):
|
|
|
|
+ file_path = temp_directory / "example.py"
|
|
|
|
+ content = """
|
|
|
|
+from old_name.module import something
|
|
|
|
+import old_name
|
|
|
|
+from old_name import something_else as alias
|
|
|
|
+from old_name
|
|
|
|
+"""
|
|
|
|
+ file_path.write_text(content)
|
|
|
|
+
|
|
|
|
+ rename_imports_and_app_name(file_path, "old_name", "new_name")
|
|
|
|
+
|
|
|
|
+ updated_content = file_path.read_text()
|
|
|
|
+ expected_content = """
|
|
|
|
+from new_name.module import something
|
|
|
|
+import new_name
|
|
|
|
+from new_name import something_else as alias
|
|
|
|
+from new_name
|
|
|
|
+"""
|
|
|
|
+ assert updated_content == expected_content
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def test_cli_rename_command(temp_directory):
|
|
|
|
+ foo_dir = temp_directory / "foo"
|
|
|
|
+ foo_dir.mkdir()
|
|
|
|
+ (foo_dir / "__init__").touch()
|
|
|
|
+ (foo_dir / ".web").mkdir()
|
|
|
|
+ (foo_dir / "assets").mkdir()
|
|
|
|
+ (foo_dir / "foo").mkdir()
|
|
|
|
+ (foo_dir / "foo" / "__init__.py").touch()
|
|
|
|
+ (foo_dir / "rxconfig.py").touch()
|
|
|
|
+ (foo_dir / "rxconfig.py").write_text(
|
|
|
|
+ """
|
|
|
|
+import reflex as rx
|
|
|
|
+
|
|
|
|
+config = rx.Config(
|
|
|
|
+ app_name="foo",
|
|
|
|
+)
|
|
|
|
+"""
|
|
|
|
+ )
|
|
|
|
+ (foo_dir / "foo" / "components").mkdir()
|
|
|
|
+ (foo_dir / "foo" / "components" / "__init__.py").touch()
|
|
|
|
+ (foo_dir / "foo" / "components" / "base.py").touch()
|
|
|
|
+ (foo_dir / "foo" / "components" / "views.py").touch()
|
|
|
|
+ (foo_dir / "foo" / "components" / "base.py").write_text(
|
|
|
|
+ """
|
|
|
|
+import reflex as rx
|
|
|
|
+from foo.components import views
|
|
|
|
+from foo.components.views import *
|
|
|
|
+from .base import *
|
|
|
|
+
|
|
|
|
+def random_component():
|
|
|
|
+ return rx.fragment()
|
|
|
|
+"""
|
|
|
|
+ )
|
|
|
|
+ (foo_dir / "foo" / "foo.py").touch()
|
|
|
|
+ (foo_dir / "foo" / "foo.py").write_text(
|
|
|
|
+ """
|
|
|
|
+import reflex as rx
|
|
|
|
+import foo.components.base
|
|
|
|
+from foo.components.base import random_component
|
|
|
|
+
|
|
|
|
+class State(rx.State):
|
|
|
|
+ pass
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def index():
|
|
|
|
+ return rx.text("Hello, World!")
|
|
|
|
+
|
|
|
|
+app = rx.App()
|
|
|
|
+app.add_page(index)
|
|
|
|
+"""
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ with chdir(temp_directory / "foo"):
|
|
|
|
+ result = runner.invoke(cli, ["rename", "bar"])
|
|
|
|
+
|
|
|
|
+ assert result.exit_code == 0
|
|
|
|
+ assert (foo_dir / "rxconfig.py").read_text() == (
|
|
|
|
+ """
|
|
|
|
+import reflex as rx
|
|
|
|
+
|
|
|
|
+config = rx.Config(
|
|
|
|
+ app_name="bar",
|
|
|
|
+)
|
|
|
|
+"""
|
|
|
|
+ )
|
|
|
|
+ assert (foo_dir / "bar").exists()
|
|
|
|
+ assert not (foo_dir / "foo").exists()
|
|
|
|
+ assert (foo_dir / "bar" / "components" / "base.py").read_text() == (
|
|
|
|
+ """
|
|
|
|
+import reflex as rx
|
|
|
|
+from bar.components import views
|
|
|
|
+from bar.components.views import *
|
|
|
|
+from .base import *
|
|
|
|
+
|
|
|
|
+def random_component():
|
|
|
|
+ return rx.fragment()
|
|
|
|
+"""
|
|
|
|
+ )
|
|
|
|
+ assert (foo_dir / "bar" / "bar.py").exists()
|
|
|
|
+ assert not (foo_dir / "bar" / "foo.py").exists()
|
|
|
|
+ assert (foo_dir / "bar" / "bar.py").read_text() == (
|
|
|
|
+ """
|
|
|
|
+import reflex as rx
|
|
|
|
+import bar.components.base
|
|
|
|
+from bar.components.base import random_component
|
|
|
|
+
|
|
|
|
+class State(rx.State):
|
|
|
|
+ pass
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def index():
|
|
|
|
+ return rx.text("Hello, World!")
|
|
|
|
+
|
|
|
|
+app = rx.App()
|
|
|
|
+app.add_page(index)
|
|
|
|
+"""
|
|
|
|
+ )
|