From 5b914efbafadc452042ecd787ac525ec77eb07a2 Mon Sep 17 00:00:00 2001 From: Bago Amirbekian Date: Mon, 6 Nov 2023 17:38:42 -0800 Subject: [PATCH 01/12] Add aliases to auto complete search --- rope/contrib/autoimport/defs.py | 6 ++++++ rope/contrib/autoimport/models.py | 21 +++++++++++++++++++++ rope/contrib/autoimport/sqlite.py | 13 +++++++++++++ ropetest/contrib/autoimporttest.py | 14 ++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/rope/contrib/autoimport/defs.py b/rope/contrib/autoimport/defs.py index b5559221c..5a9664c27 100644 --- a/rope/contrib/autoimport/defs.py +++ b/rope/contrib/autoimport/defs.py @@ -92,6 +92,12 @@ class Package(NamedTuple): type: PackageType +class Alias(NamedTuple): + """A module alias to be added to the database.""" + alias: str + modname: str + + class Name(NamedTuple): """A Name to be added to the database.""" diff --git a/rope/contrib/autoimport/models.py b/rope/contrib/autoimport/models.py index 817a51ae7..58f72abb8 100644 --- a/rope/contrib/autoimport/models.py +++ b/rope/contrib/autoimport/models.py @@ -85,6 +85,27 @@ class Metadata(Model): objects = Query(table_name, columns) +class Alias(Model): + table_name = "aliases" + schema = { + "alias": "TEXT", + "module": "TEXT", + } + columns = list(schema.keys()) + objects = Query(table_name, columns) + + @classmethod + def create_table(cls, connection): + super().create_table(connection) + connection.execute("CREATE INDEX IF NOT EXISTS alias ON aliases(alias)") + + modules = Query( + "(SELECT DISTINCT aliases.*, package, source, type FROM aliases INNER JOIN names on aliases.module = names.module)", + columns + ["package", "source", "type"], + ) + search_modules_with_alias = modules.where("alias LIKE (?)") + + class Name(Model): table_name = "names" schema = { diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index eb7c27ded..bc1e77b27 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -19,6 +19,7 @@ from rope.contrib.autoimport import models from rope.contrib.autoimport.defs import ( ModuleFile, + Alias, Name, NameType, Package, @@ -293,6 +294,12 @@ def _search_module( yield SearchResult( f"import {module}", module, source, NameType.Module.value ) + for alias, module, source in self._execute( + models.Alias.search_modules_with_alias.select("alias", "module", "source"), (name,) + ): + yield SearchResult( + f"import {module} as {alias}", alias, source, NameType.Module.value + ) def get_modules(self, name) -> List[str]: """Get the list of modules that have global `name`.""" @@ -434,9 +441,11 @@ def clear_cache(self): """ with self.connection: self._execute(models.Name.objects.drop_table()) + self._execute(models.Alias.objects.drop_table()) self._execute(models.Package.objects.drop_table()) self._execute(models.Metadata.objects.drop_table()) models.Name.create_table(self.connection) + models.Alias.create_table(self.connection) models.Package.create_table(self.connection) models.Metadata.create_table(self.connection) data = ( @@ -548,6 +557,10 @@ def _convert_name(name: Name) -> tuple: name.source.value, name.name_type.value, ) + + def add_aliases(self, aliases: Iterable[Alias]): + if aliases is not None: + self._executemany(models.Alias.objects.insert_into(), aliases) def _add_names(self, names: Iterable[Name]): if names is not None: diff --git a/ropetest/contrib/autoimporttest.py b/ropetest/contrib/autoimporttest.py index 62b6db293..f439f2741 100644 --- a/ropetest/contrib/autoimporttest.py +++ b/ropetest/contrib/autoimporttest.py @@ -1,6 +1,7 @@ import unittest from rope.contrib.autoimport import sqlite as autoimport +from rope.contrib.autoimport.defs import Alias from ropetest import testutils @@ -124,6 +125,19 @@ def test_search_module(self): self.assertIn(import_statement, self.importer.search("os")) self.assertIn(import_statement, self.importer.search("o")) + def test_search_alias(self): + self.mod2.write("myvar = None\n") + self.importer.update_resource(self.mod2) + self.importer.add_aliases([("noMatch", "does_not_exists_this")]) + self.importer.add_aliases([("hasMatch", "pkg.mod2")]) + + self.assertEqual([], self.importer.search("noMatch", exact_match=True)) + + import_statement = ("import pkg.mod2 as hasMatch", "hasMatch") + self.assertIn(import_statement, self.importer.search("hasMatch", exact_match=True)) + self.assertIn(import_statement, self.importer.search("hasM")) + self.assertIn(import_statement, self.importer.search("h")) + def test_search(self): self.importer.update_module("typing") import_statement = ("from typing import Dict", "Dict") From 4702c3ac7f07b46a4201b353421201c4b2ee1977 Mon Sep 17 00:00:00 2001 From: Bago Amirbekian Date: Mon, 6 Nov 2023 17:52:23 -0800 Subject: [PATCH 02/12] fixup --- ropetest/contrib/autoimporttest.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ropetest/contrib/autoimporttest.py b/ropetest/contrib/autoimporttest.py index f439f2741..2ea41378c 100644 --- a/ropetest/contrib/autoimporttest.py +++ b/ropetest/contrib/autoimporttest.py @@ -128,8 +128,10 @@ def test_search_module(self): def test_search_alias(self): self.mod2.write("myvar = None\n") self.importer.update_resource(self.mod2) - self.importer.add_aliases([("noMatch", "does_not_exists_this")]) - self.importer.add_aliases([("hasMatch", "pkg.mod2")]) + self.importer.add_aliases([ + ("noMatch", "does_not_exists_this"), + ("hasMatch", "pkg.mod2"), + ]) self.assertEqual([], self.importer.search("noMatch", exact_match=True)) From dcd12bacd8e0bbbc77937baa999bac72a8975e4d Mon Sep 17 00:00:00 2001 From: Bago Amirbekian Date: Thu, 30 Nov 2023 16:16:05 -0800 Subject: [PATCH 03/12] add import aliases as to prefs config --- rope/base/prefs.py | 16 ++++++++++++++++ rope/contrib/autoimport/sqlite.py | 3 ++- ropetest/contrib/autoimporttest.py | 9 +++++++++ ropetest/testutils.py | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/rope/base/prefs.py b/rope/base/prefs.py index 9d4fd4a43..42caa43fd 100644 --- a/rope/base/prefs.py +++ b/rope/base/prefs.py @@ -140,6 +140,22 @@ class Prefs: """), ) + import_aliases: List[Tuple[str, str]] = field( + default_factory=lambda : [ + ("np", "numpy"), + ("pd", "pandas"), + ("plt", "matplotlib.pyplot"), + ("sns", "seaborn"), + ("tf", "tensorflow"), + ("sk", "sklearn"), + ("sm", "statsmodels"), + ], + description=dedent(""" + Aliases for module names. For example, `[('np', 'numpy')]` makes rope recomend + ``import numpy as np``. + """), + ) + prefer_module_from_imports: bool = field( default=False, description=dedent(""" diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index bc1e77b27..58cf3f108 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -448,6 +448,7 @@ def clear_cache(self): models.Alias.create_table(self.connection) models.Package.create_table(self.connection) models.Metadata.create_table(self.connection) + self.add_aliases(self.project.prefs.import_aliases) data = ( versioning.calculate_version_hash(self.project), json.dumps(versioning.get_version_hash_data(self.project)), @@ -559,7 +560,7 @@ def _convert_name(name: Name) -> tuple: ) def add_aliases(self, aliases: Iterable[Alias]): - if aliases is not None: + if aliases: self._executemany(models.Alias.objects.insert_into(), aliases) def _add_names(self, names: Iterable[Name]): diff --git a/ropetest/contrib/autoimporttest.py b/ropetest/contrib/autoimporttest.py index 2ea41378c..4ad11b50a 100644 --- a/ropetest/contrib/autoimporttest.py +++ b/ropetest/contrib/autoimporttest.py @@ -140,6 +140,15 @@ def test_search_alias(self): self.assertIn(import_statement, self.importer.search("hasM")) self.assertIn(import_statement, self.importer.search("h")) + def test_alias_updated_frpom_prefs(self): + self.mod2.write("myvar = None\n") + self.project.prefs.import_aliases = [("mod2_alias", "pkg.mod2")] + self.importer.clear_cache() + self.importer.update_resource(self.mod2) + import_statement = ("import pkg.mod2 as mod2_alias", "mod2_alias") + self.assertIn(import_statement, self.importer.search("mod2_alias", exact_match=True)) + self.assertIn(import_statement, self.importer.search("mod2", exact_match=False)) + def test_search(self): self.importer.update_module("typing") import_statement = ("from typing import Dict", "Dict") diff --git a/ropetest/testutils.py b/ropetest/testutils.py index 11f58ccfe..f836fb8c4 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -26,6 +26,7 @@ def sample_project(foldername=None, **kwds): "automatic_soa": False, "ignored_resources": [".ropeproject", "*.pyc"], "import_dynload_stdmods": False, + "import_aliases": [], } prefs.update(kwds) project = rope.base.project.Project(root, **prefs) From 1665040fd41bfd04ddeab06c1bf4db137f03a4bb Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Thu, 21 Dec 2023 10:49:50 +1100 Subject: [PATCH 04/12] Fix typos --- rope/base/prefs.py | 2 +- ropetest/contrib/autoimporttest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rope/base/prefs.py b/rope/base/prefs.py index 42caa43fd..d62559dab 100644 --- a/rope/base/prefs.py +++ b/rope/base/prefs.py @@ -151,7 +151,7 @@ class Prefs: ("sm", "statsmodels"), ], description=dedent(""" - Aliases for module names. For example, `[('np', 'numpy')]` makes rope recomend + Aliases for module names. For example, `[('np', 'numpy')]` makes rope recommend ``import numpy as np``. """), ) diff --git a/ropetest/contrib/autoimporttest.py b/ropetest/contrib/autoimporttest.py index 4ad11b50a..1dfbb3bf0 100644 --- a/ropetest/contrib/autoimporttest.py +++ b/ropetest/contrib/autoimporttest.py @@ -140,7 +140,7 @@ def test_search_alias(self): self.assertIn(import_statement, self.importer.search("hasM")) self.assertIn(import_statement, self.importer.search("h")) - def test_alias_updated_frpom_prefs(self): + def test_alias_updated_from_prefs(self): self.mod2.write("myvar = None\n") self.project.prefs.import_aliases = [("mod2_alias", "pkg.mod2")] self.importer.clear_cache() From fdfbeca07403c4df6669488465602ef4bcc118be Mon Sep 17 00:00:00 2001 From: Bago Amirbekian Date: Thu, 25 Jan 2024 18:01:32 -0800 Subject: [PATCH 05/12] minor fixes --- CHANGELOG.md | 2 +- rope/contrib/autoimport/models.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05b30b20d..09ccfc280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # **Upcoming release** -- ... +- #730 Match on module aliases for autoimport suggestions # Release 1.12.0 diff --git a/rope/contrib/autoimport/models.py b/rope/contrib/autoimport/models.py index fe151f96e..cd49eb5db 100644 --- a/rope/contrib/autoimport/models.py +++ b/rope/contrib/autoimport/models.py @@ -100,7 +100,7 @@ class Alias(Model): @classmethod def create_table(cls, connection): super().create_table(connection) - connection.execute("CREATE INDEX IF NOT EXISTS alias ON aliases(alias)") + connection.execute("CREATE INDEX IF NOT EXISTS aliases_alias_nocase ON aliases(alias COLLATE NOCASE)") modules = Query( "(SELECT DISTINCT aliases.*, package, source, type FROM aliases INNER JOIN names on aliases.module = names.module)", From cf83daf227518dd03056437bb610e9753451b189 Mon Sep 17 00:00:00 2001 From: Bago Amirbekian Date: Thu, 25 Jan 2024 18:10:33 -0800 Subject: [PATCH 06/12] style --- docs/contributing.rst | 2 +- rope/contrib/autoimport/defs.py | 1 + rope/contrib/autoimport/models.py | 4 +++- rope/contrib/autoimport/sqlite.py | 5 +++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/contributing.rst b/docs/contributing.rst index b6b8acb2c..c0dfcdfb7 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -1,4 +1,4 @@ -====================== +s====================== Contributing to Rope ====================== diff --git a/rope/contrib/autoimport/defs.py b/rope/contrib/autoimport/defs.py index 5a9664c27..f689de168 100644 --- a/rope/contrib/autoimport/defs.py +++ b/rope/contrib/autoimport/defs.py @@ -94,6 +94,7 @@ class Package(NamedTuple): class Alias(NamedTuple): """A module alias to be added to the database.""" + alias: str modname: str diff --git a/rope/contrib/autoimport/models.py b/rope/contrib/autoimport/models.py index cd49eb5db..7b70c53f3 100644 --- a/rope/contrib/autoimport/models.py +++ b/rope/contrib/autoimport/models.py @@ -100,7 +100,9 @@ class Alias(Model): @classmethod def create_table(cls, connection): super().create_table(connection) - connection.execute("CREATE INDEX IF NOT EXISTS aliases_alias_nocase ON aliases(alias COLLATE NOCASE)") + connection.execute( + "CREATE INDEX IF NOT EXISTS aliases_alias_nocase ON aliases(alias COLLATE NOCASE)" + ) modules = Query( "(SELECT DISTINCT aliases.*, package, source, type FROM aliases INNER JOIN names on aliases.module = names.module)", diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index a6c1139f8..9c9cc78ed 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -332,7 +332,8 @@ def _search_module( f"import {module}", module, source, NameType.Module.value ) for alias, module, source in self._execute( - models.Alias.search_modules_with_alias.select("alias", "module", "source"), (name,) + models.Alias.search_modules_with_alias.select("alias", "module", "source"), + (name,) ): yield SearchResult( f"import {module} as {alias}", alias, source, NameType.Module.value @@ -604,7 +605,7 @@ def _convert_name(name: Name) -> tuple: name.source.value, name.name_type.value, ) - + def add_aliases(self, aliases: Iterable[Alias]): if aliases: self._executemany(models.Alias.objects.insert_into(), aliases) From d2639bcdc79affdb3238cb169138ca59240da951 Mon Sep 17 00:00:00 2001 From: Bago Amirbekian Date: Thu, 25 Jan 2024 18:11:56 -0800 Subject: [PATCH 07/12] style --- rope/contrib/autoimport/sqlite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index 9c9cc78ed..c0f6ad3b4 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -333,7 +333,7 @@ def _search_module( ) for alias, module, source in self._execute( models.Alias.search_modules_with_alias.select("alias", "module", "source"), - (name,) + (name,), ): yield SearchResult( f"import {module} as {alias}", alias, source, NameType.Module.value From 1667b67fb7ac4baaff3e89af2940118dd51ec76c Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 11:37:32 +1100 Subject: [PATCH 08/12] Remove stray character --- docs/contributing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contributing.rst b/docs/contributing.rst index c0dfcdfb7..b6b8acb2c 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -1,4 +1,4 @@ -s====================== +====================== Contributing to Rope ====================== From 253fdee001d016609bda3237f7a1e55035c85a51 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 13:28:49 +1100 Subject: [PATCH 09/12] Document an example of how to configure import_aliases --- docs/configuration.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 5aba53acb..ab105a81d 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -14,6 +14,11 @@ Will be used if [tool.rope] is configured. [tool.rope] split_imports = true + import_aliases = [ + ['dt', 'datetime'], + ['mp', 'multiprocessing'], + ] + config.py --------- @@ -48,9 +53,9 @@ Additionally, you can run an executable function at startup of rope. pytool.toml ----------- If neither a config.py or a pyproject.toml is present, rope will use a pytool.toml. -It follows the exact same syntax of the pyproject.toml. +It follows the exact same syntax as ``pyproject.toml``. -- Mac OS X: ``~/Library/Application Support/pytool.toml.`` +- Mac OS X: ``~/Library/Application Support/pytool.toml``. - Unix: ``~/.config/pytool.toml``` or in $XDG_CONFIG_HOME, if defined - Windows: ``C:\Users\\AppData\Local\pytool.toml`` From 9e494c331eb343d6910471cd894877df0a5034eb Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 13:32:35 +1100 Subject: [PATCH 10/12] Black --- rope/base/builtins.py | 1 + rope/base/fscommands.py | 1 + rope/base/libutils.py | 1 + rope/base/oi/soi.py | 1 + rope/base/oi/transform.py | 1 + rope/base/oi/type_hinting/providers/docstrings.py | 1 + rope/base/oi/type_hinting/providers/numpydocstrings.py | 1 + rope/base/simplify.py | 1 + rope/contrib/autoimport/__init__.py | 1 + rope/contrib/autoimport/defs.py | 1 + rope/contrib/autoimport/models.py | 6 ++---- rope/contrib/autoimport/pickle.py | 1 - rope/contrib/autoimport/utils.py | 1 + rope/contrib/finderrors.py | 1 + rope/contrib/fixmodnames.py | 1 + rope/refactor/__init__.py | 1 + rope/refactor/importutils/__init__.py | 1 + rope/refactor/inline.py | 6 +++--- rope/refactor/move.py | 1 + rope/refactor/occurrences.py | 1 - rope/refactor/similarfinder.py | 1 + 21 files changed, 22 insertions(+), 9 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 151c64742..9c8bd1611 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -1,4 +1,5 @@ """This module tries to support builtin types and functions.""" + import inspect import io diff --git a/rope/base/fscommands.py b/rope/base/fscommands.py index 00ba71c8a..a6104448c 100644 --- a/rope/base/fscommands.py +++ b/rope/base/fscommands.py @@ -6,6 +6,7 @@ `MercurialCommands` for example. """ + import os import re import shutil diff --git a/rope/base/libutils.py b/rope/base/libutils.py index f5b0ff461..0974b11e7 100644 --- a/rope/base/libutils.py +++ b/rope/base/libutils.py @@ -1,4 +1,5 @@ """A few useful functions for using rope as a library""" + import os.path import rope.base.project diff --git a/rope/base/oi/soi.py b/rope/base/oi/soi.py index 8bdadaa1c..090b10337 100644 --- a/rope/base/oi/soi.py +++ b/rope/base/oi/soi.py @@ -4,6 +4,7 @@ package. """ + import rope.base.builtins # Use full qualification for clarity. from rope.base import arguments, evaluate, pynames, pyobjects, utils from rope.base.oi.type_hinting.factory import get_type_hinting_factory diff --git a/rope/base/oi/transform.py b/rope/base/oi/transform.py index 968e70b25..ace4261f3 100644 --- a/rope/base/oi/transform.py +++ b/rope/base/oi/transform.py @@ -1,4 +1,5 @@ """Provides classes for persisting `PyObject`""" + import os import re diff --git a/rope/base/oi/type_hinting/providers/docstrings.py b/rope/base/oi/type_hinting/providers/docstrings.py index d50d2fd67..3ece79688 100644 --- a/rope/base/oi/type_hinting/providers/docstrings.py +++ b/rope/base/oi/type_hinting/providers/docstrings.py @@ -21,6 +21,7 @@ - https://groups.google.com/d/topic/rope-dev/LCFNN98vckI/discussion """ + import re from rope.base.oi.type_hinting import utils diff --git a/rope/base/oi/type_hinting/providers/numpydocstrings.py b/rope/base/oi/type_hinting/providers/numpydocstrings.py index 35788f797..1bd15b989 100644 --- a/rope/base/oi/type_hinting/providers/numpydocstrings.py +++ b/rope/base/oi/type_hinting/providers/numpydocstrings.py @@ -3,6 +3,7 @@ https://github.com/davidhalter/jedi/blob/b489019f5bd5750051122b94cc767df47751ecb7/jedi/evaluate/docstrings.py Thanks to @davidhalter for this utils under MIT License. """ + import re from rope.base.ast import literal_eval diff --git a/rope/base/simplify.py b/rope/base/simplify.py index ac5acce26..3198c26de 100644 --- a/rope/base/simplify.py +++ b/rope/base/simplify.py @@ -2,6 +2,7 @@ This module is here to help source code analysis. """ + import re from rope.base import codeanalyze, utils diff --git a/rope/contrib/autoimport/__init__.py b/rope/contrib/autoimport/__init__.py index 65459cef4..a151465f2 100644 --- a/rope/contrib/autoimport/__init__.py +++ b/rope/contrib/autoimport/__init__.py @@ -1,4 +1,5 @@ """AutoImport module for rope.""" + from .pickle import AutoImport as _PickleAutoImport from .sqlite import AutoImport as _SqliteAutoImport diff --git a/rope/contrib/autoimport/defs.py b/rope/contrib/autoimport/defs.py index f689de168..3078f7d65 100644 --- a/rope/contrib/autoimport/defs.py +++ b/rope/contrib/autoimport/defs.py @@ -1,4 +1,5 @@ """Definitions of types for the Autoimport program.""" + import pathlib from enum import Enum from typing import NamedTuple, Optional diff --git a/rope/contrib/autoimport/models.py b/rope/contrib/autoimport/models.py index 7b70c53f3..1fd1684e3 100644 --- a/rope/contrib/autoimport/models.py +++ b/rope/contrib/autoimport/models.py @@ -56,13 +56,11 @@ def delete_from(self) -> FinalQuery: class Model(ABC): @property @abstractmethod - def table_name(self) -> str: - ... + def table_name(self) -> str: ... @property @abstractmethod - def schema(self) -> Dict[str, str]: - ... + def schema(self) -> Dict[str, str]: ... @classmethod def create_table(cls, connection): diff --git a/rope/contrib/autoimport/pickle.py b/rope/contrib/autoimport/pickle.py index 431d994ee..619b40095 100644 --- a/rope/contrib/autoimport/pickle.py +++ b/rope/contrib/autoimport/pickle.py @@ -10,7 +10,6 @@ sqlite-based storage backend (rope.contrib.autoimport.sqlite.AutoImport). """ - import contextlib import re diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index 5238339de..d61bac6c2 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -1,4 +1,5 @@ """Utility functions for the autoimport code.""" + import pathlib import sys from collections import OrderedDict diff --git a/rope/contrib/finderrors.py b/rope/contrib/finderrors.py index 335e6d84a..32ee31f98 100644 --- a/rope/contrib/finderrors.py +++ b/rope/contrib/finderrors.py @@ -23,6 +23,7 @@ * ... ;-) """ + from rope.base import ast, evaluate, pyobjects diff --git a/rope/contrib/fixmodnames.py b/rope/contrib/fixmodnames.py index 493da5637..d784381ca 100644 --- a/rope/contrib/fixmodnames.py +++ b/rope/contrib/fixmodnames.py @@ -15,6 +15,7 @@ argument. """ + from rope.base import taskhandle from rope.contrib import changestack from rope.refactor import rename diff --git a/rope/refactor/__init__.py b/rope/refactor/__init__.py index 491e94237..c4beed7fc 100644 --- a/rope/refactor/__init__.py +++ b/rope/refactor/__init__.py @@ -45,6 +45,7 @@ monitoring the progress of refactorings. """ + from rope.refactor.importutils import ImportOrganizer # noqa from rope.refactor.topackage import ModuleToPackage # noqa diff --git a/rope/refactor/importutils/__init__.py b/rope/refactor/importutils/__init__.py index e13276eb1..ef0f1bac2 100644 --- a/rope/refactor/importutils/__init__.py +++ b/rope/refactor/importutils/__init__.py @@ -4,6 +4,7 @@ refactorings or as a separate task. """ + import rope.base.codeanalyze import rope.base.evaluate from rope.base import libutils diff --git a/rope/refactor/inline.py b/rope/refactor/inline.py index 23c8a8291..768d30b7d 100644 --- a/rope/refactor/inline.py +++ b/rope/refactor/inline.py @@ -406,9 +406,9 @@ def _get_definition_params(self): "Cannot inline functions with list and keyword arguments." ) if self.pyfunction.get_kind() == "classmethod": - paramdict[ - definition_info.args_with_defaults[0][0] - ] = self.pyfunction.parent.get_name() + paramdict[definition_info.args_with_defaults[0][0]] = ( + self.pyfunction.parent.get_name() + ) return paramdict def get_function_name(self): diff --git a/rope/refactor/move.py b/rope/refactor/move.py index 5916f00af..0ce59dab0 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -4,6 +4,7 @@ based on inputs. """ + from __future__ import annotations import typing diff --git a/rope/refactor/occurrences.py b/rope/refactor/occurrences.py index 89ffdcd91..5839cf3d8 100644 --- a/rope/refactor/occurrences.py +++ b/rope/refactor/occurrences.py @@ -35,7 +35,6 @@ arguments """ - import contextlib import re diff --git a/rope/refactor/similarfinder.py b/rope/refactor/similarfinder.py index 6d2d2e1bc..dd5bec362 100644 --- a/rope/refactor/similarfinder.py +++ b/rope/refactor/similarfinder.py @@ -1,4 +1,5 @@ """This module can be used for finding similar code""" + import re import rope.base.builtins # Use full qualification for clarity. From 9134d0357d03113665fc9098796a826ce8ee0c82 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 15:15:59 +1100 Subject: [PATCH 11/12] Use the new AutoimportPrefs namespace, move config key to autoimport.aliases --- docs/configuration.rst | 2 +- rope/base/prefs.py | 43 +++++++++++++++++++------------ rope/base/versioning.py | 5 +++- rope/contrib/autoimport/sqlite.py | 2 +- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index ab105a81d..b30bc314f 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -14,7 +14,7 @@ Will be used if [tool.rope] is configured. [tool.rope] split_imports = true - import_aliases = [ + autoimport.aliases = [ ['dt', 'datetime'], ['mp', 'multiprocessing'], ] diff --git a/rope/base/prefs.py b/rope/base/prefs.py index d62559dab..2e698eba1 100644 --- a/rope/base/prefs.py +++ b/rope/base/prefs.py @@ -12,6 +12,30 @@ from rope.base.resources import Folder +@dataclass +class AutoimportPrefs: + # underlined: bool = field( + # default=False, description="Cache underlined (private) modules") + # memory: bool = field(default=None, description="Cache in memory instead of disk") + # parallel: bool = field(default=True, description="Use multiple processes to parse") + + aliases: List[Tuple[str, str]] = field( + default_factory=lambda : [ + ("np", "numpy"), + ("pd", "pandas"), + ("plt", "matplotlib.pyplot"), + ("sns", "seaborn"), + ("tf", "tensorflow"), + ("sk", "sklearn"), + ("sm", "statsmodels"), + ], + description=dedent(""" + Aliases for module names. For example, `[('np', 'numpy')]` makes rope recommend + ``import numpy as np``. + """), + ) + + @dataclass class Prefs: """Class to store rope preferences.""" @@ -139,23 +163,6 @@ class Prefs: appear in the importing namespace. """), ) - - import_aliases: List[Tuple[str, str]] = field( - default_factory=lambda : [ - ("np", "numpy"), - ("pd", "pandas"), - ("plt", "matplotlib.pyplot"), - ("sns", "seaborn"), - ("tf", "tensorflow"), - ("sk", "sklearn"), - ("sm", "statsmodels"), - ], - description=dedent(""" - Aliases for module names. For example, `[('np', 'numpy')]` makes rope recommend - ``import numpy as np``. - """), - ) - prefer_module_from_imports: bool = field( default=False, description=dedent(""" @@ -222,6 +229,8 @@ class Prefs: Can only be set in config.py. """), ) + autoimport: AutoimportPrefs = field( + default_factory=AutoimportPrefs, description="Preferences for Autoimport") def set(self, key: str, value: Any): """Set the value of `key` preference to `value`.""" diff --git a/rope/base/versioning.py b/rope/base/versioning.py index 985255e47..4f0615902 100644 --- a/rope/base/versioning.py +++ b/rope/base/versioning.py @@ -1,3 +1,4 @@ +import dataclasses import hashlib import importlib.util import json @@ -31,7 +32,9 @@ def _get_prefs_data(project) -> str: del prefs_data["project_opened"] del prefs_data["callbacks"] del prefs_data["dependencies"] - return json.dumps(prefs_data, sort_keys=True, indent=2) + return json.dumps( + prefs_data, sort_keys=True, indent=2, default=lambda o: o.__dict__ + ) def _get_file_content(module_name: str) -> str: diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index c0f6ad3b4..2af7baab6 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -486,7 +486,7 @@ def clear_cache(self): models.Alias.create_table(self.connection) models.Package.create_table(self.connection) models.Metadata.create_table(self.connection) - self.add_aliases(self.project.prefs.import_aliases) + self.add_aliases(self.project.prefs.autoimport.aliases) data = ( versioning.calculate_version_hash(self.project), json.dumps(versioning.get_version_hash_data(self.project)), From b266addfd4e4aefd3c6137f3df39737e67eeb2ce Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Tue, 30 Jan 2024 15:36:43 +1100 Subject: [PATCH 12/12] Fix import_aliases config key in sample_project --- ropetest/contrib/autoimporttest.py | 2 +- ropetest/testutils.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ropetest/contrib/autoimporttest.py b/ropetest/contrib/autoimporttest.py index ac0dd9df7..d72f3f23f 100644 --- a/ropetest/contrib/autoimporttest.py +++ b/ropetest/contrib/autoimporttest.py @@ -142,7 +142,7 @@ def test_search_alias(self): def test_alias_updated_from_prefs(self): self.mod2.write("myvar = None\n") - self.project.prefs.import_aliases = [("mod2_alias", "pkg.mod2")] + self.project.prefs.autoimport.aliases = [("mod2_alias", "pkg.mod2")] self.importer.clear_cache() self.importer.update_resource(self.mod2) import_statement = ("import pkg.mod2 as mod2_alias", "mod2_alias") diff --git a/ropetest/testutils.py b/ropetest/testutils.py index f836fb8c4..11f58ccfe 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -26,7 +26,6 @@ def sample_project(foldername=None, **kwds): "automatic_soa": False, "ignored_resources": [".ropeproject", "*.pyc"], "import_dynload_stdmods": False, - "import_aliases": [], } prefs.update(kwds) project = rope.base.project.Project(root, **prefs)