hyb
2026-01-30 7657e1b2fa251a2ea372710ad75cb395a3c0e374
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Copyright (c) 2025 Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0, as
# published by the Free Software Foundation.
#
# This program is designed to work with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an
# additional permission to link the program and your derivative works
# with the separately licensed software that they have either included with
# the program or referenced in the documentation.
#
# Without limiting anything contained in the foregoing, this file,
# which is part of MySQL Connector/Python, is also subject to the
# Universal FOSS Exception, version 1.0, a copy of which can be found at
# http://oss.oracle.com/licenses/universal-foss-exception.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 
"""Dependency checking utilities for AI features in MySQL Connector/Python.
 
Provides check_dependencies() to assert required optional packages are present
with acceptable minimum versions at runtime.
"""
 
import importlib.metadata
 
from typing import List
 
 
def check_dependencies(tasks: List[str]) -> None:
    """
    Check required runtime dependencies and minimum versions; raise an error
    if any are missing or version-incompatible.
 
    This verifies the presence and minimum version of essential Python packages.
    Missing or insufficient versions cause an ImportError listing the packages
    and a suggested install command.
 
    Args:
        tasks (List[str]): Task types to check requirements for.
 
    Raises:
        ImportError: If any required dependencies are missing or below the
            minimum version.
    """
    task_set = set(tasks)
    task_set.add("BASE")
 
    # Requirements: (import_name, min_version)
    task_to_requirement = {
        "BASE": [("pandas", "1.5.0")],
        "GENAI": [
            ("langchain", "0.1.11"),
            ("langchain_core", "0.1.11"),
            ("pydantic", "1.10.0"),
        ],
        "ML": [("scikit-learn", "1.3.0")],
    }
    requirements = []
    for task in task_set:
        requirements.extend(task_to_requirement[task])
    requirements_set = set(requirements)
 
    problems = []
    for name, min_version in requirements_set:
        try:
            installed_version = importlib.metadata.version(name)
            # Version comparison uses simple string comparison to avoid extra
            # dependencies. This is valid for the dependencies defined above;
            # reconsider if adding packages with version schemes that do not
            # compare correctly as strings.
            error = installed_version < min_version
        except importlib.metadata.PackageNotFoundError:
            error = True
        if error:
            problems.append(f"{name} v{min_version} (or later)")
    if problems:
        raise ImportError("Please install " + ", ".join(problems) + ".")