From 6270c4781e0488a705189496362c0073057c4d2c Mon Sep 17 00:00:00 2001 From: "Lance.Moe" Date: Wed, 11 Dec 2024 22:34:14 +0900 Subject: [PATCH] fix: error when there is __init__.py in the migration folder (#272) * fix: error when there is __init__.py in the migration folder * fix: check __init__.py in the migration folder * refactor * refactor & add test * refactor * Update changelog --------- Co-authored-by: Waket Zheng --- CHANGELOG.md | 1 + aerich/migrate.py | 16 ++++++++++++---- tests/test_migrate.py | 24 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f518021..094dc16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### [0.8.1](Unreleased) #### Fixed +- fix: error when there is __init__.py in the migration folder (#272) - Setting null=false on m2m field causes migration to fail. (#334) - Fix NonExistentKey when running `aerich init` without `[tool]` section in config file. (#284) - Fix configuration file reading error when containing Chinese characters. (#286) diff --git a/aerich/migrate.py b/aerich/migrate.py index 5429ac8..3158b93 100644 --- a/aerich/migrate.py +++ b/aerich/migrate.py @@ -54,10 +54,18 @@ class Migrate: @classmethod def get_all_version_files(cls) -> List[str]: - return sorted( - filter(lambda x: x.endswith("py"), os.listdir(cls.migrate_location)), - key=lambda x: int(x.split("_")[0]), - ) + def get_file_version(file_name: str) -> str: + return file_name.split("_")[0] + + def is_version_file(file_name: str) -> bool: + if not file_name.endswith("py"): + return False + if "_" not in file_name: + return False + return get_file_version(file_name).isdigit() + + files = filter(is_version_file, os.listdir(cls.migrate_location)) + return sorted(files, key=lambda x: int(get_file_version(x))) @classmethod def _get_model(cls, model: str) -> Type[Model]: diff --git a/tests/test_migrate.py b/tests/test_migrate.py index 1f7802a..6cb1d33 100644 --- a/tests/test_migrate.py +++ b/tests/test_migrate.py @@ -1054,6 +1054,30 @@ def test_sort_all_version_files(mocker): ] +def test_sort_files_containing_non_migrations(mocker): + mocker.patch( + "os.listdir", + return_value=[ + "1_datetime_update.py", + "11_datetime_update.py", + "10_datetime_update.py", + "2_datetime_update.py", + "not_a_migration.py", + "999.py", + "123foo_not_a_migration.py", + ], + ) + + Migrate.migrate_location = "." + + assert Migrate.get_all_version_files() == [ + "1_datetime_update.py", + "2_datetime_update.py", + "10_datetime_update.py", + "11_datetime_update.py", + ] + + async def test_empty_migration(mocker, tmp_path: Path) -> None: mocker.patch("os.listdir", return_value=[]) Migrate.app = "foo"