reflex/reflex/utils/imports.py

79 lines
1.9 KiB
Python

"""Import operations."""
from __future__ import annotations
from collections import defaultdict
from typing import Dict, List, Optional
from reflex.base import Base
def merge_imports(*imports) -> ImportDict:
"""Merge multiple import dicts together.
Args:
*imports: The list of import dicts to merge.
Returns:
The merged import dicts.
"""
all_imports = defaultdict(list)
for import_dict in imports:
for lib, fields in import_dict.items():
all_imports[lib].extend(fields)
return all_imports
def collapse_imports(imports: ImportDict) -> ImportDict:
"""Remove all duplicate ImportVar within an ImportDict.
Args:
imports: The import dict to collapse.
Returns:
The collapsed import dict.
"""
return {lib: list(set(import_vars)) for lib, import_vars in imports.items()}
class ImportVar(Base):
"""An import var."""
# The name of the import tag.
tag: Optional[str]
# whether the import is default or named.
is_default: Optional[bool] = False
# The tag alias.
alias: Optional[str] = None
# Whether this import need to install the associated lib
install: Optional[bool] = True
# whether this import should be rendered or not
render: Optional[bool] = True
@property
def name(self) -> str:
"""The name of the import.
Returns:
The name(tag name with alias) of tag.
"""
if self.alias:
return self.alias if self.is_default else " as ".join([self.tag, self.alias]) # type: ignore
else:
return self.tag or ""
def __hash__(self) -> int:
"""Define a hash function for the import var.
Returns:
The hash of the var.
"""
return hash((self.tag, self.is_default, self.alias, self.install, self.render))
ImportDict = Dict[str, List[ImportVar]]