From d4d32e954e6138f04d35176b7e627e351ad0b2cd Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 15:51:57 +1100 Subject: [PATCH 1/5] Add type hint for Future objects --- rope/contrib/autoimport/sqlite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index ceee2598..91ebedb6 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -43,7 +43,7 @@ def get_future_names( packages: List[Package], underlined: bool, job_set: taskhandle.BaseJobSet -) -> Generator[Future, None, None]: +) -> Generator[Future[Iterable[Name]], None, None]: """Get all names as futures.""" with ProcessPoolExecutor() as executor: for package in packages: @@ -593,7 +593,7 @@ def _removed(self, resource): modname = self._resource_to_module(resource).modname self._del_if_exist(modname) - def _add_future_names(self, names: Future): + def _add_future_names(self, names: Future[Iterable[Name]]): self._add_names(names.result()) @staticmethod From a1c1d230bb1fa72d0877c57592bdc457b38a1223 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 16:00:06 +1100 Subject: [PATCH 2/5] Fix mypy type error on AutoImport.connection --- rope/contrib/autoimport/sqlite.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index 91ebedb6..5d4ca7d0 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -81,7 +81,6 @@ class AutoImport: """ - connection: sqlite3.Connection memory: bool project: Project project_package: Package @@ -179,7 +178,7 @@ def calculate_project_hash(data: str) -> str: return sqlite3.connect(project.ropefolder.pathlib / "autoimport.db") @property - def connection(self): + def connection(self) -> sqlite3.Connection: """ Creates a new connection if called from a new thread. From 48d3eae2f9a1cc45e8fc05d2be0b079f6791e06e Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 16:05:03 +1100 Subject: [PATCH 3/5] Change Iterable to Collection These can't be Iterable, since `if obj` may not necessarily work with arbitrary Iterable, only Container types. --- rope/contrib/autoimport/sqlite.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index 5d4ca7d0..8e1a6955 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -14,6 +14,7 @@ from itertools import chain from pathlib import Path from threading import local +from collections.abc import Collection from typing import Generator, Iterable, Iterator, List, Optional, Set, Tuple from rope.base import exceptions, libutils, resourceobserver, taskhandle, versioning @@ -43,7 +44,7 @@ def get_future_names( packages: List[Package], underlined: bool, job_set: taskhandle.BaseJobSet -) -> Generator[Future[Iterable[Name]], None, None]: +) -> Generator[Future[Collection[Name]], None, None]: """Get all names as futures.""" with ProcessPoolExecutor() as executor: for package in packages: @@ -592,7 +593,7 @@ def _removed(self, resource): modname = self._resource_to_module(resource).modname self._del_if_exist(modname) - def _add_future_names(self, names: Future[Iterable[Name]]): + def _add_future_names(self, names: Future[List[Name]]): self._add_names(names.result()) @staticmethod @@ -605,12 +606,12 @@ def _convert_name(name: Name) -> tuple: name.name_type.value, ) - def add_aliases(self, aliases: Iterable[Alias]): + def add_aliases(self, aliases: Collection[Alias]): if aliases: self._executemany(models.Alias.objects.insert_into(), aliases) - def _add_names(self, names: Iterable[Name]): - if names is not None: + def _add_names(self, names: Collection[Name]): + if names: self._executemany( models.Name.objects.insert_into(), [self._convert_name(name) for name in names], From 2fb3a4676756d938b026cb16927983ff25471165 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 16:07:05 +1100 Subject: [PATCH 4/5] Remove unused function --- rope/contrib/autoimport/sqlite.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index 8e1a6955..d4ac4aa0 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -593,9 +593,6 @@ def _removed(self, resource): modname = self._resource_to_module(resource).modname self._del_if_exist(modname) - def _add_future_names(self, names: Future[List[Name]]): - self._add_names(names.result()) - @staticmethod def _convert_name(name: Name) -> tuple: return ( From 7a3d4c8af472f6432e73607a06f48b1c4b423f1b Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Fri, 8 Mar 2024 11:14:32 +1100 Subject: [PATCH 5/5] Fix 'ABCMeta' object is not subscriptable error in Python 3.8 --- rope/contrib/autoimport/sqlite.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index d4ac4aa0..54a6d03c 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -1,5 +1,7 @@ """AutoImport module for rope.""" +from __future__ import annotations + import contextlib import json import re @@ -14,8 +16,16 @@ from itertools import chain from pathlib import Path from threading import local -from collections.abc import Collection -from typing import Generator, Iterable, Iterator, List, Optional, Set, Tuple +from typing import ( + Generator, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + TYPE_CHECKING, +) from rope.base import exceptions, libutils, resourceobserver, taskhandle, versioning from rope.base.project import Project @@ -42,6 +52,10 @@ from rope.refactor import importutils +if TYPE_CHECKING: + from collections.abc import Collection + + def get_future_names( packages: List[Package], underlined: bool, job_set: taskhandle.BaseJobSet ) -> Generator[Future[Collection[Name]], None, None]: