Skip to content

Commit b068fbe

Browse files
committed
Pass a RealFileSystem in
1 parent ef2e394 commit b068fbe

4 files changed

Lines changed: 42 additions & 3 deletions

File tree

rust/src/lib.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ use pyo3::types::{IntoPyDict, PyDict, PyFrozenSet, PyList, PySet, PyString, PyTu
1818
use rayon::prelude::*;
1919
use rustc_hash::FxHashSet;
2020
use std::collections::HashSet;
21+
use std::fs;
22+
use std::io;
2123

2224
#[pymodule]
2325
fn _rustgrimp(py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
2426
m.add_wrapped(wrap_pyfunction!(parse_imported_objects_from_code))?;
2527
m.add_class::<GraphWrapper>()?;
28+
m.add_class::<RealFileSystem>()?;
2629
m.add("ModuleNotPresent", py.get_type::<ModuleNotPresent>())?;
2730
m.add("NoSuchContainer", py.get_type::<NoSuchContainer>())?;
2831
m.add(
@@ -640,3 +643,20 @@ struct Route {
640643
middle: Vec<String>,
641644
tails: Vec<String>,
642645
}
646+
647+
648+
#[pyclass]
649+
struct RealFileSystem {}
650+
651+
652+
#[pymethods]
653+
impl RealFileSystem {
654+
#[new]
655+
fn new() -> Self {
656+
RealFileSystem {}
657+
}
658+
659+
fn read(&self, filename: &str) -> Result<String, io::Error> {
660+
fs::read_to_string(filename)
661+
}
662+
}

src/grimp/application/usecases.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import joblib # type: ignore
99

1010
from ..application.ports import caching
11-
from ..application.ports.filesystem import AbstractFileSystem
11+
from ..application.ports.filesystem import AbstractFileSystem, FileSystem2
1212
from ..application.ports.graph import ImportGraph
1313
from ..application.ports.importscanner import AbstractImportScanner
1414
from ..application.ports.modulefinder import AbstractModuleFinder, FoundPackage, ModuleFile
@@ -61,6 +61,7 @@ def build_graph(
6161
"""
6262

6363
file_system: AbstractFileSystem = settings.FILE_SYSTEM
64+
file_system_2: FileSystem2 | None = settings.FILE_SYSTEM_2
6465

6566
found_packages = _find_packages(
6667
file_system=file_system,
@@ -70,6 +71,7 @@ def build_graph(
7071
imports_by_module = _scan_packages(
7172
found_packages=found_packages,
7273
file_system=file_system,
74+
file_system_2=file_system_2,
7375
include_external_packages=include_external_packages,
7476
exclude_type_checking_imports=exclude_type_checking_imports,
7577
cache_dir=cache_dir,
@@ -115,6 +117,7 @@ def _validate_package_names_are_strings(
115117
def _scan_packages(
116118
found_packages: Set[FoundPackage],
117119
file_system: AbstractFileSystem,
120+
file_system_2: FileSystem2 | None,
118121
include_external_packages: bool,
119122
exclude_type_checking_imports: bool,
120123
cache_dir: Union[str, Type[NotSupplied], None],
@@ -146,6 +149,7 @@ def _scan_packages(
146149
_scan_imports(
147150
remaining_module_files_to_scan,
148151
file_system=file_system,
152+
file_system_2=file_system_2,
149153
found_packages=found_packages,
150154
include_external_packages=include_external_packages,
151155
exclude_type_checking_imports=exclude_type_checking_imports,
@@ -214,14 +218,20 @@ def _scan_imports(
214218
module_files: Collection[ModuleFile],
215219
*,
216220
file_system: AbstractFileSystem,
221+
file_system_2: FileSystem2 | None,
217222
found_packages: Set[FoundPackage],
218223
include_external_packages: bool,
219224
exclude_type_checking_imports: bool,
220225
) -> Dict[ModuleFile, Set[DirectImport]]:
221-
chunks = _create_chunks(module_files)
226+
if file_system_2:
227+
# Multiprocessing is not supported - just do one chunk.
228+
chunks = (module_files,)
229+
else:
230+
chunks = _create_chunks(module_files)
222231
return _scan_chunks(
223232
chunks,
224233
file_system,
234+
file_system_2,
225235
found_packages,
226236
include_external_packages,
227237
exclude_type_checking_imports,
@@ -259,12 +269,14 @@ def _decide_number_of_processes(number_of_module_files: int) -> int:
259269
def _scan_chunks(
260270
chunks: Collection[Collection[ModuleFile]],
261271
file_system: AbstractFileSystem,
272+
file_system_2: FileSystem2 | None,
262273
found_packages: Set[FoundPackage],
263274
include_external_packages: bool,
264275
exclude_type_checking_imports: bool,
265276
) -> Dict[ModuleFile, Set[DirectImport]]:
266277
import_scanner: AbstractImportScanner = settings.IMPORT_SCANNER_CLASS(
267278
file_system=file_system,
279+
file_system_2=file_system_2,
268280
found_packages=found_packages,
269281
include_external_packages=include_external_packages,
270282
)

src/grimp/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
from .adaptors.timing import SystemClockTimer
1010
from .application.config import settings
1111
from .application.usecases import build_graph
12+
from grimp import _rustgrimp as rust # type: ignore[attr-defined]
1213

1314
settings.configure(
1415
MODULE_FINDER=ModuleFinder(),
1516
FILE_SYSTEM=FileSystem(),
17+
FILE_SYSTEM_2=rust.RealFileSystem(),
1618
IMPORT_SCANNER_CLASS=ImportScanner,
1719
IMPORT_GRAPH_CLASS=ImportGraph,
1820
PACKAGE_FINDER=ImportLibPackageFinder(),

tests/unit/application/test_usecases.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ def test_happy_path(self, include_external_packages):
4545
class FakePackageFinder(BaseFakePackageFinder):
4646
directory_map = {"mypackage": "/path/to/mypackage"}
4747

48-
with override_settings(FILE_SYSTEM=file_system, PACKAGE_FINDER=FakePackageFinder()):
48+
with override_settings(
49+
FILE_SYSTEM=file_system,
50+
FILE_SYSTEM_2=None,
51+
PACKAGE_FINDER=FakePackageFinder(),
52+
):
4953
graph = usecases.build_graph(
5054
"mypackage", include_external_packages=include_external_packages
5155
)
@@ -200,6 +204,7 @@ class FakeModuleFinder(BaseFakeModuleFinder):
200204

201205
with override_settings(
202206
FILE_SYSTEM=FakeFileSystem(),
207+
FILE_SYSTEM_2=None,
203208
PACKAGE_FINDER=FakePackageFinder(),
204209
MODULE_FINDER=FakeModuleFinder(),
205210
), patch.object(os, "environ", fake_environ):

0 commit comments

Comments
 (0)