-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[internal] Simplify import resolvers #1746
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -277,21 +277,9 @@ def _fail(code: str, message: str) -> MaybeDependency: | |
|
||
class BaseImportResolver(abc.ABC): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. redundant: we no longer need There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it's necessary to avoid circular imports (same as BaseNotebookResolver) |
||
|
||
def __init__(self, next_resolver: BaseImportResolver | None): | ||
self._next_resolver = next_resolver | ||
|
||
@abc.abstractmethod | ||
def with_next_resolver(self, resolver: BaseImportResolver) -> BaseImportResolver: | ||
"""required to create a linked list of resolvers""" | ||
|
||
@property | ||
def next_resolver(self): | ||
return self._next_resolver | ||
|
||
def resolve_import(self, path_lookup: PathLookup, name: str) -> MaybeDependency: | ||
# TODO: remove StubResolver and return MaybeDependency(None, [...]) | ||
assert self._next_resolver is not None | ||
return self._next_resolver.resolve_import(path_lookup, name) | ||
"""resolve a simple or composite import name""" | ||
|
||
|
||
class BaseFileResolver(abc.ABC): | ||
|
@@ -317,22 +305,6 @@ def _fail(code: str, message: str): | |
return MaybeDependency(None, [DependencyProblem(code, message)]) | ||
|
||
|
||
class StubImportResolver(BaseImportResolver): | ||
|
||
def __init__(self): | ||
super().__init__(None) | ||
|
||
def with_next_resolver(self, resolver: BaseImportResolver) -> BaseImportResolver: | ||
raise NotImplementedError("Should never happen!") | ||
|
||
def resolve_import(self, path_lookup: PathLookup, name: str) -> MaybeDependency: | ||
return self._fail('import-not-found', f"Could not locate import: {name}") | ||
|
||
@staticmethod | ||
def _fail(code: str, message: str): | ||
return MaybeDependency(None, [DependencyProblem(code, message)]) | ||
|
||
|
||
@dataclass | ||
class MaybeDependency: | ||
dependency: Dependency | None | ||
|
@@ -351,12 +323,12 @@ def __init__( | |
self, | ||
library_resolvers: list[BaseLibraryResolver], | ||
notebook_resolver: BaseNotebookResolver, | ||
import_resolvers: list[BaseImportResolver], | ||
import_resolver: BaseImportResolver, | ||
path_lookup: PathLookup, | ||
): | ||
self._library_resolver = self._chain_library_resolvers(library_resolvers) | ||
self._notebook_resolver = notebook_resolver | ||
self._import_resolver = self._chain_import_resolvers(import_resolvers) | ||
self._import_resolver = import_resolver | ||
self._path_lookup = path_lookup | ||
|
||
@staticmethod | ||
|
@@ -367,14 +339,6 @@ def _chain_library_resolvers(library_resolvers: list[BaseLibraryResolver]) -> Ba | |
previous = resolver | ||
return previous | ||
|
||
@staticmethod | ||
def _chain_import_resolvers(import_resolvers: list[BaseImportResolver]) -> BaseImportResolver: | ||
previous: BaseImportResolver = StubImportResolver() | ||
for resolver in import_resolvers: | ||
resolver = resolver.with_next_resolver(previous) | ||
previous = resolver | ||
return previous | ||
|
||
def resolve_notebook(self, path_lookup: PathLookup, path: Path) -> MaybeDependency: | ||
return self._notebook_resolver.resolve_notebook(path_lookup, path) | ||
|
||
|
@@ -406,11 +370,8 @@ def build_local_file_dependency_graph(self, path: Path) -> MaybeGraph: | |
|
||
@property | ||
def _local_file_resolver(self) -> BaseFileResolver | None: | ||
resolver = self._import_resolver | ||
while resolver is not None: | ||
if isinstance(resolver, BaseFileResolver): | ||
return resolver | ||
resolver = resolver.next_resolver | ||
if isinstance(self._import_resolver, BaseFileResolver): | ||
return self._import_resolver | ||
return None | ||
|
||
def build_notebook_dependency_graph(self, path: Path) -> MaybeGraph: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,10 +9,8 @@ | |
|
||
from yaml import load_all as load_yaml, Loader | ||
|
||
from databricks.labs.ucx.source_code.path_lookup import PathLookup | ||
|
||
from databricks.labs.ucx.source_code.graph import ( | ||
BaseImportResolver, | ||
DependencyGraph, | ||
DependencyProblem, | ||
MaybeDependency, | ||
|
@@ -22,16 +20,13 @@ | |
logger = logging.getLogger(__name__) | ||
|
||
|
||
class WhitelistResolver(BaseImportResolver): | ||
class WhitelistResolver: | ||
|
||
def __init__(self, whitelist: Whitelist, next_resolver: BaseImportResolver | None = None): | ||
super().__init__(next_resolver) | ||
def __init__(self, whitelist: Whitelist): | ||
super().__init__() | ||
self._whitelist = whitelist | ||
|
||
def with_next_resolver(self, resolver: BaseImportResolver) -> BaseImportResolver: | ||
return WhitelistResolver(self._whitelist, resolver) | ||
|
||
def resolve_import(self, path_lookup: PathLookup, name: str) -> MaybeDependency: | ||
def resolve_import(self, name: str) -> MaybeDependency | None: | ||
# TODO attach compatibility to dependency, see https://github.com/databrickslabs/ucx/issues/1382 | ||
compatibility = self._whitelist.compatibility(name) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. move the body of this method as private method to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
if compatibility == UCCompatibility.FULL: | ||
|
@@ -43,7 +38,7 @@ def resolve_import(self, path_lookup: PathLookup, name: str) -> MaybeDependency: | |
if compatibility == UCCompatibility.PARTIAL: | ||
problem = DependencyProblem("dependency-check", f"Package {name} is only partially supported by UC") | ||
return MaybeDependency(None, [problem]) | ||
return super().resolve_import(path_lookup, name) | ||
return None | ||
|
||
|
||
class StubContainer(SourceContainer): | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and get rid of BaseImportResolver.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
renamed to ImportFileResolver