Skip to content

Commit edb69a2

Browse files
committed
formatting
1 parent 317024a commit edb69a2

File tree

3 files changed

+41
-19
lines changed

3 files changed

+41
-19
lines changed

src/databricks/labs/ucx/source_code/python/python_infer.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
Const,
1111
decorators,
1212
Dict,
13-
FormattedValue,
1413
Instance,
15-
JoinedStr,
1614
Name,
1715
NodeNG,
1816
Uninferable,

tests/integration/source_code/solacc.py

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import os
3+
import shutil
34
import sys
45
from dataclasses import dataclass, field
56
from pathlib import Path
@@ -13,6 +14,7 @@
1314
from databricks.labs.ucx.hive_metastore.table_migration_status import TableMigrationIndex
1415
from databricks.labs.ucx.source_code.base import LocatedAdvice
1516
from databricks.labs.ucx.source_code.linters.context import LinterContext
17+
from databricks.labs.ucx.source_code.path_lookup import PathLookup
1618

1719
logger = logging.getLogger("verify-accelerators")
1820

@@ -79,16 +81,16 @@ class SolaccContext:
7981
missing_imports: dict[str, dict[str, int]] = field(default_factory=dict)
8082

8183
@classmethod
82-
def create(cls, lint_all: bool):
84+
def create(cls, for_all_dirs: bool):
8385
unparsed_path: Path | None = None
8486
# if lint_all, recreate "solacc-unparsed.txt"
85-
if lint_all is None:
87+
if for_all_dirs:
8688
unparsed_path = Path(Path(__file__).parent, "solacc-unparsed.txt")
8789
if unparsed_path.exists():
8890
os.remove(unparsed_path)
8991
files_to_skip: set[str] | None = None
9092
malformed = Path(__file__).parent / "solacc-malformed.txt"
91-
if lint_all and malformed.exists():
93+
if for_all_dirs and malformed.exists():
9294
lines = malformed.read_text(encoding="utf-8").split("\n")
9395
files_to_skip = set(line for line in lines if len(line) > 0 and not line.startswith("#"))
9496
return SolaccContext(unparsed_path=unparsed_path, files_to_skip=files_to_skip)
@@ -103,28 +105,30 @@ def register_missing_import(self, missing_import: str):
103105
details[missing_import] = count + 1
104106

105107
def log_missing_imports(self):
106-
missing_imports = dict(sorted(self.missing_imports.items(), key=lambda item: sum(item[1].values()), reverse=True))
108+
missing_imports = dict(
109+
sorted(self.missing_imports.items(), key=lambda item: sum(item[1].values()), reverse=True)
110+
)
107111
for prefix, details in missing_imports.items():
108112
logger.info(f"Missing import '{prefix}'")
109113
for item, count in details.items():
110114
logger.info(f" {item}: {count} occurrences")
111115

112116

113-
114117
def lint_one(solacc: SolaccContext, file: Path, ctx: LocalCheckoutContext) -> None:
115118
try:
116119
advices = list(ctx.local_code_linter.lint_path(file, set()))
117120
solacc.parseable_count += 1
118-
missing_imports = collect_missing_imports(advices)
119-
for missing_import in missing_imports:
121+
for missing_import in collect_missing_imports(advices):
120122
solacc.register_missing_import(missing_import)
121-
uninferrable_count = collect_uninferrable_count(advices)
122-
solacc.uninferrable_count += uninferrable_count
123+
solacc.uninferrable_count += collect_uninferrable_count(advices)
123124
print_advices(advices, file)
124125
except Exception as e: # pylint: disable=broad-except
125126
# here we're most likely catching astroid & sqlglot errors
126127
# when linting single file, log exception details
127-
logger.error(f"Error during parsing of {file}: {e}".replace("\n", " "), exc_info=e if solacc.unparsed_path is None else None)
128+
logger.error(
129+
f"Error during parsing of {file}: {e}".replace("\n", " "),
130+
exc_info=e if solacc.unparsed_path is None else None,
131+
)
128132
if solacc.unparsed_path:
129133
logger.error(f"Error during parsing of {file}: {e}".replace("\n", " "))
130134
# populate solacc-unparsed.txt
@@ -133,17 +137,37 @@ def lint_one(solacc: SolaccContext, file: Path, ctx: LocalCheckoutContext) -> No
133137
f.write("\n")
134138

135139

136-
def lint_dir(solacc: SolaccContext, dir: Path, file_to_lint: str | None = None):
140+
class _CleanablePathLookup(PathLookup):
141+
142+
def __init__(self):
143+
super().__init__(Path.cwd(), [Path(path) for path in sys.path])
144+
self._original_sys_paths = set(self._sys_paths)
145+
146+
def clean_tmp_sys_paths(self):
147+
for path in self._sys_paths:
148+
if path in self._original_sys_paths:
149+
continue
150+
if path.is_file():
151+
path.unlink()
152+
if path.is_dir():
153+
shutil.rmtree(path)
154+
155+
156+
def lint_dir(solacc: SolaccContext, soldir: Path, file_to_lint: str | None = None):
157+
path_lookup = _CleanablePathLookup()
137158
ws = WorkspaceClient(host='...', token='...')
138159
ctx = LocalCheckoutContext(ws).replace(
139-
linter_context_factory=lambda session_state: LinterContext(TableMigrationIndex([]), session_state)
160+
linter_context_factory=lambda session_state: LinterContext(TableMigrationIndex([]), session_state),
161+
path_lookup=path_lookup,
140162
)
141-
all_files = list(dir.glob('**/*.py')) if file_to_lint is None else [Path(dir, file_to_lint)]
163+
all_files = list(soldir.glob('**/*.py')) if file_to_lint is None else [Path(soldir, file_to_lint)]
164+
solacc.total_count += len(all_files)
142165
for file in all_files:
143-
solacc.total_count += 1
144166
if solacc.files_to_skip and file.relative_to(dist).as_posix() in solacc.files_to_skip:
145167
continue
146168
lint_one(solacc, file, ctx)
169+
# cleanup tmp dirs
170+
path_lookup.clean_tmp_sys_paths()
147171

148172

149173
def lint_file(file_to_lint: str):
@@ -154,8 +178,8 @@ def lint_file(file_to_lint: str):
154178

155179
def lint_all():
156180
solacc = SolaccContext.create(True)
157-
for dir in os.listdir(dist):
158-
lint_dir(solacc, dist / dir)
181+
for soldir in os.listdir(dist):
182+
lint_dir(solacc, dist / soldir)
159183
all_files_len = solacc.total_count - (len(solacc.files_to_skip) if solacc.files_to_skip else 0)
160184
parseable_pct = int(solacc.parseable_count / all_files_len * 100)
161185
missing_imports_count = sum(sum(details.values()) for details in solacc.missing_imports.values())

tests/unit/source_code/test_notebook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ def test_notebook_builds_python_dependency_graph_with_fstring_loop(mock_path_loo
249249
container = maybe.dependency.load(mock_path_lookup)
250250
assert container is not None
251251
container.build_dependency_graph(graph)
252-
expected_paths = [path, "leaf1.py", "leaf2.py", "leaf3.py"]
252+
expected_paths = [path, "leaf1.py", "leaf2.py", "leaf3.py"]
253253
all_paths = set(d.path for d in graph.all_dependencies)
254254
assert all_paths == {mock_path_lookup.cwd / path for path in expected_paths}
255255

0 commit comments

Comments
 (0)