diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index db04efa..e258692 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,13 +9,17 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.12.1 hooks: - - id: ruff - args: ["check", "crudadmin", "--fix"] + - id: ruff-check + args: ["crudadmin", "--fix"] - id: ruff-format args: ["crudadmin"] - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.1 + - repo: local hooks: - id: mypy - args: ["crudadmin", "--strict"] + name: mypy + entry: uv run mypy crudadmin/ + language: system + types: [python] + pass_filenames: false + args: [--config-file=pyproject.toml] diff --git a/crudadmin/admin_interface/model_view.py b/crudadmin/admin_interface/model_view.py index 0c75f5f..fb58d09 100644 --- a/crudadmin/admin_interface/model_view.py +++ b/crudadmin/admin_interface/model_view.py @@ -1092,10 +1092,12 @@ async def get_model_update_page_inner( ) form_fields = _get_form_fields_from_schema(self.update_schema) + field_values: Dict[str, Any] = {} for field in form_fields: field_name = field["name"] if field_name in item: field["value"] = item[field_name] + field_values[field_name] = item[field_name] return self.templates.TemplateResponse( template, @@ -1103,6 +1105,7 @@ async def get_model_update_page_inner( "request": request, "model_name": self.model_key, "form_fields": form_fields, + "field_values": field_values, "url_prefix": self.get_url_prefix(), "id": id, }, diff --git a/crudadmin/session/backends/redis.py b/crudadmin/session/backends/redis.py index 97408de..5215a78 100644 --- a/crudadmin/session/backends/redis.py +++ b/crudadmin/session/backends/redis.py @@ -339,8 +339,15 @@ async def get_user_sessions(self, user_id: int) -> list[str]: user_sessions_key = self.get_user_sessions_key(user_id) try: - members = await self.client.smembers(user_sessions_key) - return [m.decode("utf-8") if isinstance(m, bytes) else m for m in members] + members = self.client.smembers(user_sessions_key) + if not hasattr(members, "__await__"): + raise TypeError( + f"Expected awaitable from smembers, got {type(members)}" + ) + members_await = await members + return [ + m.decode("utf-8") if isinstance(m, bytes) else m for m in members_await + ] except self.RedisError as e: logger.error(f"Error getting user sessions: {e}") raise diff --git a/pyproject.toml b/pyproject.toml index 153a0bf..9384cd9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -152,12 +152,20 @@ ignore = [ known-third-party = ["fastapi", "pydantic", "starlette"] [tool.mypy] -python_version = "3.8" -strict = true +python_version = "3.9" warn_return_any = true warn_unused_configs = true -disallow_untyped_defs = true -disallow_incomplete_defs = true +disallow_untyped_defs = false +disallow_incomplete_defs = false +check_untyped_defs = true +disallow_untyped_decorators = false +no_implicit_optional = true +strict_optional = true +warn_redundant_casts = true +warn_unused_ignores = true +warn_no_return = true +warn_unreachable = true + [tool.coverage.run] source = ["crudadmin"] diff --git a/tests/event/test_models.py b/tests/event/test_models.py index abf6ee8..ed5b176 100644 --- a/tests/event/test_models.py +++ b/tests/event/test_models.py @@ -52,7 +52,9 @@ def test_create_admin_event_log_repr_method(self): repr_str = repr(instance) assert "AdminEventLog" in repr_str assert "id=1" in repr_str - assert any(s in repr_str for s in ("event_type=create", "event_type=EventType.CREATE")) + assert any( + s in repr_str for s in ("event_type=create", "event_type=EventType.CREATE") + ) assert "user_id=123" in repr_str def test_create_admin_event_log_returns_existing_class(self): diff --git a/tests/session/test_integration.py b/tests/session/test_integration.py index d950cb5..c7085ea 100644 --- a/tests/session/test_integration.py +++ b/tests/session/test_integration.py @@ -17,11 +17,9 @@ class TestSessionManagerIntegration: @pytest.fixture def session_manager_with_mocks(self, mock_session_storage, mock_csrf_storage): """Create a session manager with mock storage.""" - with ( - patch( - "crudadmin.session.manager.get_session_storage", - return_value=mock_session_storage, - ), + with patch( + "crudadmin.session.manager.get_session_storage", + return_value=mock_session_storage, ): manager = SessionManager(session_storage=mock_session_storage) manager.csrf_storage = mock_csrf_storage