Module isort.utils
None
None
View Source
import os
import sys
from pathlib import Path
from typing import Any, Dict, Optional, Tuple
class TrieNode:
def __init__(self, config_file: str = "", config_data: Optional[Dict[str, Any]] = None) -> None:
if not config_data:
config_data = {}
self.nodes: Dict[str, TrieNode] = {}
self.config_info: Tuple[str, Dict[str, Any]] = (config_file, config_data)
class Trie:
"""
A prefix tree to store the paths of all config files and to search the nearest config
associated with each file
"""
def __init__(self, config_file: str = "", config_data: Optional[Dict[str, Any]] = None) -> None:
self.root: TrieNode = TrieNode(config_file, config_data)
def insert(self, config_file: str, config_data: Dict[str, Any]) -> None:
resolved_config_path_as_tuple = Path(config_file).parent.resolve().parts
temp = self.root
for path in resolved_config_path_as_tuple:
if path not in temp.nodes:
temp.nodes[path] = TrieNode()
temp = temp.nodes[path]
temp.config_info = (config_file, config_data)
def search(self, filename: str) -> Tuple[str, Dict[str, Any]]:
"""
Returns the closest config relative to filename by doing a depth
first search on the prefix tree.
"""
resolved_file_path_as_tuple = Path(filename).resolve().parts
temp = self.root
last_stored_config: Tuple[str, Dict[str, Any]] = ("", {})
for path in resolved_file_path_as_tuple:
if temp.config_info[0]:
last_stored_config = temp.config_info
if path not in temp.nodes:
break
temp = temp.nodes[path]
return last_stored_config
def exists_case_sensitive(path: str) -> bool:
"""Returns if the given path exists and also matches the case on Windows.
When finding files that can be imported, it is important for the cases to match because while
file os.path.exists("module.py") and os.path.exists("MODULE.py") both return True on Windows,
Python can only import using the case of the real file.
"""
result = os.path.exists(path)
if (sys.platform.startswith("win") or sys.platform == "darwin") and result: # pragma: no cover
directory, basename = os.path.split(path)
result = basename in os.listdir(directory)
return result
Functions
exists_case_sensitive
def exists_case_sensitive(
path: str
) -> bool
Returns if the given path exists and also matches the case on Windows.
When finding files that can be imported, it is important for the cases to match because while file os.path.exists("module.py") and os.path.exists("MODULE.py") both return True on Windows, Python can only import using the case of the real file.
View Source
def exists_case_sensitive(path: str) -> bool:
"""Returns if the given path exists and also matches the case on Windows.
When finding files that can be imported, it is important for the cases to match because while
file os.path.exists("module.py") and os.path.exists("MODULE.py") both return True on Windows,
Python can only import using the case of the real file.
"""
result = os.path.exists(path)
if (sys.platform.startswith("win") or sys.platform == "darwin") and result: # pragma: no cover
directory, basename = os.path.split(path)
result = basename in os.listdir(directory)
return result
Classes
Trie
class Trie(
config_file: str = '',
config_data: Optional[Dict[str, Any]] = None
)
View Source
class Trie:
"""
A prefix tree to store the paths of all config files and to search the nearest config
associated with each file
"""
def __init__(self, config_file: str = "", config_data: Optional[Dict[str, Any]] = None) -> None:
self.root: TrieNode = TrieNode(config_file, config_data)
def insert(self, config_file: str, config_data: Dict[str, Any]) -> None:
resolved_config_path_as_tuple = Path(config_file).parent.resolve().parts
temp = self.root
for path in resolved_config_path_as_tuple:
if path not in temp.nodes:
temp.nodes[path] = TrieNode()
temp = temp.nodes[path]
temp.config_info = (config_file, config_data)
def search(self, filename: str) -> Tuple[str, Dict[str, Any]]:
"""
Returns the closest config relative to filename by doing a depth
first search on the prefix tree.
"""
resolved_file_path_as_tuple = Path(filename).resolve().parts
temp = self.root
last_stored_config: Tuple[str, Dict[str, Any]] = ("", {})
for path in resolved_file_path_as_tuple:
if temp.config_info[0]:
last_stored_config = temp.config_info
if path not in temp.nodes:
break
temp = temp.nodes[path]
return last_stored_config
Methods
insert
def insert(
self,
config_file: str,
config_data: Dict[str, Any]
) -> None
View Source
def insert(self, config_file: str, config_data: Dict[str, Any]) -> None:
resolved_config_path_as_tuple = Path(config_file).parent.resolve().parts
temp = self.root
for path in resolved_config_path_as_tuple:
if path not in temp.nodes:
temp.nodes[path] = TrieNode()
temp = temp.nodes[path]
temp.config_info = (config_file, config_data)
search
def search(
self,
filename: str
) -> Tuple[str, Dict[str, Any]]
Returns the closest config relative to filename by doing a depth
first search on the prefix tree.
View Source
def search(self, filename: str) -> Tuple[str, Dict[str, Any]]:
"""
Returns the closest config relative to filename by doing a depth
first search on the prefix tree.
"""
resolved_file_path_as_tuple = Path(filename).resolve().parts
temp = self.root
last_stored_config: Tuple[str, Dict[str, Any]] = ("", {})
for path in resolved_file_path_as_tuple:
if temp.config_info[0]:
last_stored_config = temp.config_info
if path not in temp.nodes:
break
temp = temp.nodes[path]
return last_stored_config
TrieNode
class TrieNode(
config_file: str = '',
config_data: Optional[Dict[str, Any]] = None
)
View Source
class TrieNode:
def __init__(self, config_file: str = "", config_data: Optional[Dict[str, Any]] = None) -> None:
if not config_data:
config_data = {}
self.nodes: Dict[str, TrieNode] = {}
self.config_info: Tuple[str, Dict[str, Any]] = (config_file, config_data)