Skip to content
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

Add exclude_stdlib argument to build_graph #144

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ authors = [
requires-python = ">=3.8"
dependencies = [
"typing-extensions>=3.10.0.0",
"stdlibs; python_version < '3.10'",
]
classifiers = [
"Development Status :: 5 - Production/Stable",
Expand Down
17 changes: 15 additions & 2 deletions src/grimp/adaptors/caching.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,13 @@ def make_data_file_name(
found_packages: Set[FoundPackage],
include_external_packages: bool,
exclude_type_checking_imports: bool,
exclude_stdlib: bool,
) -> str:
identifier = cls.make_data_file_unique_string(
found_packages, include_external_packages, exclude_type_checking_imports
found_packages,
include_external_packages,
exclude_type_checking_imports,
exclude_stdlib,
)

bytes_identifier = identifier.encode()
Expand All @@ -43,6 +47,7 @@ def make_data_file_unique_string(
found_packages: Set[FoundPackage],
include_external_packages: bool,
exclude_type_checking_imports: bool,
exclude_stdlib: bool,
) -> str:
"""
Construct a unique string that identifies the analysis parameters.
Expand All @@ -55,8 +60,12 @@ def make_data_file_unique_string(
exclude_type_checking_imports_option = (
":no_type_checking" if exclude_type_checking_imports else ""
)
exclude_stdlib = ":exclude_stdlib" if exclude_stdlib else ""
return (
csv_packages + include_external_packages_option + exclude_type_checking_imports_option
csv_packages
+ include_external_packages_option
+ exclude_type_checking_imports_option
+ exclude_stdlib
)


Expand All @@ -79,6 +88,7 @@ def setup(
found_packages: Set[FoundPackage],
include_external_packages: bool,
exclude_type_checking_imports: bool = False,
exclude_stdlib: bool = False,
cache_dir: Optional[str] = None,
namer: Type[CacheFileNamer] = CacheFileNamer,
) -> "Cache":
Expand All @@ -87,6 +97,7 @@ def setup(
found_packages=found_packages,
include_external_packages=include_external_packages,
exclude_type_checking_imports=exclude_type_checking_imports,
exclude_stdlib=exclude_stdlib,
cache_dir=cls.cache_dir_or_default(cache_dir),
namer=namer,
)
Expand Down Expand Up @@ -142,6 +153,7 @@ def write(
found_packages=self.found_packages,
include_external_packages=self.include_external_packages,
exclude_type_checking_imports=self.exclude_type_checking_imports,
exclude_stdlib=self.exclude_stdlib,
),
)
self.file_system.write(data_cache_filename, serialized)
Expand Down Expand Up @@ -196,6 +208,7 @@ def _read_data_map_file(self) -> Dict[Module, Set[DirectImport]]:
found_packages=self.found_packages,
include_external_packages=self.include_external_packages,
exclude_type_checking_imports=self.exclude_type_checking_imports,
exclude_stdlib=self.exclude_stdlib,
),
)
try:
Expand Down
19 changes: 18 additions & 1 deletion src/grimp/adaptors/importscanner.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import ast
import logging
import sys
from typing import Dict, List, Optional, Set, Union
from ast import NodeVisitor, Import, ImportFrom, If, Attribute, Name

Expand Down Expand Up @@ -51,6 +52,7 @@ def scan_for_imports(
found_packages=self.found_packages,
found_packages_by_module=self._found_packages_by_module,
include_external_packages=self.include_external_packages,
exclude_stdlib=self.exclude_stdlib,
is_package=is_package,
)

Expand All @@ -60,6 +62,7 @@ def scan_for_imports(
found_packages=self.found_packages,
found_packages_by_module=self._found_packages_by_module,
include_external_packages=self.include_external_packages,
exclude_stdlib=self.exclude_stdlib,
is_package=is_package,
)

Expand Down Expand Up @@ -128,13 +131,24 @@ def __init__(
found_packages_by_module: Dict[Module, FoundPackage],
is_package: bool,
include_external_packages: bool,
exclude_stdlib: bool,
) -> None:
self.module = module
self.found_package = found_package
self.found_packages = found_packages
self.module_is_package = is_package
self.found_packages_by_module = found_packages_by_module
self.include_external_packages = include_external_packages
self.exclude_stdlib = exclude_stdlib
if exclude_stdlib:
if hasattr(sys, "stdlib_module_names"):
self.stdlib = sys.stdlib_module_names
else:
# Backwards compatibility < py3.10

from stdlibs import module_names

self.stdlib = module_names

def determine_imported_modules(self, node: ast.AST) -> Set[Module]:
"""
Expand Down Expand Up @@ -234,7 +248,10 @@ def _module_from_name(self, module_name: str) -> Optional[Module]:
return module
else:
if self.include_external_packages:
return self._distill_external_module(module)
module_name = self._distill_external_module(module)
if self.exclude_stdlib and module_name in self.stdlib:
return None
return module_name
else:
return None

Expand Down
4 changes: 4 additions & 0 deletions src/grimp/application/ports/caching.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ def __init__(
file_system: AbstractFileSystem,
include_external_packages: bool,
exclude_type_checking_imports: bool,
exclude_stdlib: bool,
found_packages: Set[FoundPackage],
cache_dir: str,
) -> None:
Expand All @@ -26,6 +27,7 @@ def __init__(
self.found_packages = found_packages
self.include_external_packages = include_external_packages
self.exclude_type_checking_imports = exclude_type_checking_imports
self.exclude_stdlib = exclude_stdlib
self.cache_dir = cache_dir

@classmethod
Expand All @@ -36,13 +38,15 @@ def setup(
*,
include_external_packages: bool,
exclude_type_checking_imports: bool = False,
exclude_stdlib: bool = False,
cache_dir: Optional[str] = None,
) -> "Cache":
cache = cls(
file_system=file_system,
found_packages=found_packages,
include_external_packages=include_external_packages,
exclude_type_checking_imports=exclude_type_checking_imports,
exclude_stdlib=exclude_stdlib,
cache_dir=cls.cache_dir_or_default(cache_dir),
)
return cache
Expand Down
4 changes: 4 additions & 0 deletions src/grimp/application/ports/importscanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ def __init__(
file_system: AbstractFileSystem,
found_packages: Set[FoundPackage],
include_external_packages: bool = False,
exclude_stdlib: bool = False,
) -> None:
"""
Args:
Expand All @@ -25,9 +26,12 @@ def __init__(
- include_external_packages: Whether to include imports of external modules (i.e.
modules not contained in modules_by_package_directory)
in the results.
- exclude_stdlib: Whether to exclude imports of stdlib modules
(only used when `include_external_packages` is `True`)
"""
self.file_system = file_system
self.include_external_packages = include_external_packages
self.exclude_stdlib = exclude_stdlib
self.found_packages = found_packages

# Flatten all the modules into a set.
Expand Down
9 changes: 8 additions & 1 deletion src/grimp/application/usecases.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,19 @@ def build_graph(
*additional_package_names,
include_external_packages: bool = False,
exclude_type_checking_imports: bool = False,
exclude_stdlib: bool = False,
cache_dir: Union[str, Type[NotSupplied], None] = NotSupplied,
) -> ImportGraph:
"""
Build and return an import graph for the supplied package name(s).

Args:
- package_name: the name of the top level package for which to build the graph.
- additional_package_names: tuple of the
- additional_package_names: tuple of additional package names
- include_external_packages: whether to include any external packages in the graph.
- exclude_type_checking_imports: whether to exclude imports made in type checking guards.
- exclude_stdlib: whether to exclude standard library packages in the graph. Only used when
`include_external_packages` is `True`.
- cache_dir: The directory to use for caching the graph.
Examples:

Expand Down Expand Up @@ -59,6 +62,7 @@ def build_graph(
file_system=file_system,
include_external_packages=include_external_packages,
exclude_type_checking_imports=exclude_type_checking_imports,
exclude_stdlib=exclude_stdlib,
cache_dir=cache_dir,
)

Expand Down Expand Up @@ -104,6 +108,7 @@ def _scan_packages(
file_system: AbstractFileSystem,
include_external_packages: bool,
exclude_type_checking_imports: bool,
exclude_stdlib: bool,
cache_dir: Union[str, Type[NotSupplied], None],
) -> Dict[Module, Set[DirectImport]]:
imports_by_module: Dict[Module, Set[DirectImport]] = {}
Expand All @@ -114,12 +119,14 @@ def _scan_packages(
found_packages=found_packages,
include_external_packages=include_external_packages,
exclude_type_checking_imports=exclude_type_checking_imports,
exclude_stdlib=exclude_stdlib,
cache_dir=cache_dir_if_supplied,
)
import_scanner: AbstractImportScanner = settings.IMPORT_SCANNER_CLASS(
file_system=file_system,
found_packages=found_packages,
include_external_packages=include_external_packages,
exclude_stdlib=exclude_stdlib,
)

for found_package in found_packages:
Expand Down
Loading