Skip to content

medcat.utils.import_utils

Classes:

Functions:

IncorrectExtraComponent

IncorrectExtraComponent(package_name: str, extra_name: str)

Bases: Exception

Attributes:

Source code in medcat-v2/medcat/utils/import_utils.py
117
118
119
120
121
122
def __init__(self, package_name: str, extra_name: str):
    super().__init__(f"The '{extra_name}' part does not exist in as"
                     f"an optional part in {package_name} "
                     "(or does not define dependencies)")
    self.package_name = package_name
    self.extra_name = extra_name

extra_name instance-attribute

extra_name = extra_name

package_name instance-attribute

package_name = package_name

KeyDefaultDict

Bases: dict

MissingDependenciesError

MissingDependenciesError(package_name: str, extra_name: str, missing: list[str])

Bases: Exception

Custom exception for missing optional dependencies.

Attributes:

Source code in medcat-v2/medcat/utils/import_utils.py
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
def __init__(self, package_name: str, extra_name: str,
             missing: list[str]):
    super().__init__(f"The optional dependency set '{extra_name}' "
                     f"is missing for {package_name}. The list of "
                     f"missing dependencies: {missing}. "
                     "If this came up when using the package, you need "
                     "to install the optional dependency alongside the "
                     "package. For instance, you can use "
                     f"`pip install {package_name}[{extra_name}]`. "
                     "PS: If you require multiple extras, you need to "
                     "specify them all ans separate by comma, e.g "
                     "`pkg[add1,add2]`")
    self.package_name = package_name
    self.extra_name = extra_name
    self.missing = missing

extra_name instance-attribute

extra_name = extra_name

missing instance-attribute

missing = missing

package_name instance-attribute

package_name = package_name

ensure_optional_extras_installed

ensure_optional_extras_installed(package_name: str, extra_name: str)

Ensure that an optional dependency set is installed.

Parameters:

  • package_name

    (str) –

    The base package name.

  • extra_name

    (str) –

    The name of the extra dependency.

Raises:

Source code in medcat-v2/medcat/utils/import_utils.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
def ensure_optional_extras_installed(package_name: str, extra_name: str):
    """Ensure that an optional dependency set is installed.

    Args:
        package_name (str): The base package name.
        extra_name (str): The name of the extra dependency.

    Raises:
        MissingDependenciesError: If the extra dependency isn't provided.
    """
    installed = get_installed_extra_dependencies(package_name, extra_name)
    req = get_required_extra_deps(package_name, extra_name)
    if not req:
        raise IncorrectExtraComponent(package_name, extra_name)
    if installed != req:
        missing = [requirement for requirement in req
                   if requirement not in installed]
        raise MissingDependenciesError(package_name, extra_name, missing)

get_all_extra_deps_raw

get_all_extra_deps_raw(package_name: str) -> set[str]

Get all the dependencies for a pcakge that are for an extra component.

The output will include extra information such as the extra it's tied to.

Parameters:

  • package_name

    (str) –

    The package name.

Raises:

Returns:

  • set[str]

    set[str]: The set of extra dependencies, including extra information.

Source code in medcat-v2/medcat/utils/import_utils.py
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def get_all_extra_deps_raw(package_name: str) -> set[str]:
    """Get all the dependencies for a pcakge that are for an extra component.

    The output will include extra information such as the extra it's tied to.

    Args:
        package_name (str): The package name.

    Raises:
        ValueError: If the package isn't installed.

    Returns:
        set[str]: The set of extra dependencies, including extra information.
    """
    try:
        dependencies = importlib.metadata.requires(package_name)
        if dependencies is None:
            return set()
    except importlib.metadata.PackageNotFoundError:
        raise ValueError(f"Package '{package_name}' is not installed")
    return {dep for dep in dependencies
            if "extra == " in dep}

get_installed_extra_dependencies

get_installed_extra_dependencies(package_name: str, extra_name: str) -> set[str]

Get installed dependencies for a given package's extra parts.

Parameters:

  • package_name

    (str) –

    The package name.

Returns:

  • set[str]

    set[str]: The list of extra packages installed.

Source code in medcat-v2/medcat/utils/import_utils.py
80
81
82
83
84
85
86
87
88
89
90
91
92
def get_installed_extra_dependencies(package_name: str, extra_name: str
                                     ) -> set[str]:
    """Get installed dependencies for a given package's extra parts.

    Args:
        package_name (str): The package name.

    Returns:
        set[str]: The list of extra packages installed.
    """
    extra_deps = get_required_extra_deps(package_name, extra_name)
    return {dep for dep in extra_deps
            if importlib.util.find_spec(_DEP_NAME_MAPPER[dep]) is not None}

get_module_base_name

get_module_base_name(entry_point_value: str) -> str

Extracts the base module name from an entry point value string.

Parameters:

  • entry_point_value

    (str) –

    The value string of an EntryPoint object, e.g., "my_plugin.module:load_func".

Returns:

  • str ( str ) –

    The base module name, e.g., "my_plugin.module".

Source code in medcat-v2/medcat/utils/import_utils.py
22
23
24
25
26
27
28
29
30
31
32
def get_module_base_name(entry_point_value: str) -> str:
    """Extracts the base module name from an entry point value string.

    Args:
        entry_point_value (str): The value string of an EntryPoint object,
            e.g., "my_plugin.module:load_func".

    Returns:
        str: The base module name, e.g., "my_plugin.module".
    """
    return entry_point_value.split(':')[0]

get_required_extra_deps

get_required_extra_deps(package_name: str, extra_name: str) -> set[str]

Get the extra dependencies required for this extra part.

Parameters:

  • package_name

    (str) –

    The package name.

  • extra_name

    (str) –

    The extra name.

Returns:

  • set[str]

    set[str]: All the required extra dependencies for this part.

Source code in medcat-v2/medcat/utils/import_utils.py
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
def get_required_extra_deps(package_name: str, extra_name: str) -> set[str]:
    """Get the extra dependencies required for this extra part.

    Args:
        package_name (str): The package name.
        extra_name (str): The extra name.

    Returns:
        set[str]: All the required extra dependencies for this part.
    """
    dependencies = get_all_extra_deps_raw(package_name)
    return {
        # just package name
        _DEP_PATTERN.match(dep).group(1)  # type: ignore
        for dep in dependencies
        # check that this is an extra related to this name
        if (f"extra == '{extra_name}'" in dep
            or f'extra == "{extra_name}"' in dep)
    }