From 4face6d8bf73cf69ba5f2b89a132aa9520b2c291 Mon Sep 17 00:00:00 2001 From: mart-r Date: Sat, 20 Dec 2025 15:42:50 +0000 Subject: [PATCH 1/4] CU-869bj3d4g: Add a few tests for import utils - should raise if partial deps found --- medcat-v2/tests/utils/test_import_utils.py | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 medcat-v2/tests/utils/test_import_utils.py diff --git a/medcat-v2/tests/utils/test_import_utils.py b/medcat-v2/tests/utils/test_import_utils.py new file mode 100644 index 000000000..8e6d44b3e --- /dev/null +++ b/medcat-v2/tests/utils/test_import_utils.py @@ -0,0 +1,43 @@ +from medcat.utils import import_utils + +import unittest +import unittest.mock + + +class ImportUtilsTests(unittest.TestCase): + + @unittest.mock.patch( + "medcat.utils.import_utils.get_installed_extra_dependencies") + @unittest.mock.patch("medcat.utils.import_utils.get_required_extra_deps") + def test_raises_upon_partial( + self, + mock_get_required_extra_deps, + mock_get_installed_extra_dependencies): + mock_get_installed_extra_dependencies.return_value = ["A", "B"] + mock_get_required_extra_deps.return_value = ["A", "B", "C"] + with self.assertRaises(import_utils.MissingDependenciesError): + import_utils.ensure_optional_extras_installed("medcat", "WHATEVER") + + @unittest.mock.patch( + "medcat.utils.import_utils.get_installed_extra_dependencies") + @unittest.mock.patch("medcat.utils.import_utils.get_required_extra_deps") + def test_raises_upon_none( + self, + mock_get_required_extra_deps, + mock_get_installed_extra_dependencies): + mock_get_installed_extra_dependencies.return_value = [] + mock_get_required_extra_deps.return_value = ["A", "B", "C"] + with self.assertRaises(import_utils.MissingDependenciesError): + import_utils.ensure_optional_extras_installed("medcat", "WHATEVER") + + @unittest.mock.patch( + "medcat.utils.import_utils.get_installed_extra_dependencies") + @unittest.mock.patch("medcat.utils.import_utils.get_required_extra_deps") + def test_no_raises_upon_all_deps( + self, + mock_get_required_extra_deps, + mock_get_installed_extra_dependencies): + mock_get_installed_extra_dependencies.return_value = ["A", "B", "C"] + mock_get_required_extra_deps.return_value = ["A", "B", "C"] + # NOTE: just no raise + import_utils.ensure_optional_extras_installed("medcat", "WHATEVER") From c8f144457f55afa6442f422b7077512ffb0dbcd3 Mon Sep 17 00:00:00 2001 From: mart-r Date: Sat, 20 Dec 2025 15:43:33 +0000 Subject: [PATCH 2/4] CU-869bj3d4g: Fix issue with missing deps with partially installed deps --- medcat-v2/medcat/utils/import_utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/medcat-v2/medcat/utils/import_utils.py b/medcat-v2/medcat/utils/import_utils.py index 669021341..a4d30efa4 100644 --- a/medcat-v2/medcat/utils/import_utils.py +++ b/medcat-v2/medcat/utils/import_utils.py @@ -89,10 +89,10 @@ def ensure_optional_extras_installed(package_name: str, extra_name: str): MissingDependenciesError: If the extra dependency isn't provided. """ installed = get_installed_extra_dependencies(package_name, extra_name) - if not installed: - req = get_required_extra_deps(package_name, extra_name) - if not req: - raise IncorrectExtraComponent(package_name, extra_name) + req = get_required_extra_deps(package_name, extra_name) + if not req: + raise IncorrectExtraComponent(package_name, extra_name) + if len(installed) != len(req): missing = [requirement for requirement in req if requirement not in installed] raise MissingDependenciesError(package_name, extra_name, missing) From 8b572a06e433a9e2f658ffe03086a94c52feeb59 Mon Sep 17 00:00:00 2001 From: mart-r Date: Sat, 20 Dec 2025 16:16:57 +0000 Subject: [PATCH 3/4] CU-869bj3d4g: Fix install targets in rel-cat tutorials --- .../relcat/1._Supervised_Training_Relation_Extraction.ipynb | 2 +- ...ering_relations_from_annotations_with_Relation_toolkit.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/medcat-v2-tutorials/notebooks/introductory/relcat/1._Supervised_Training_Relation_Extraction.ipynb b/medcat-v2-tutorials/notebooks/introductory/relcat/1._Supervised_Training_Relation_Extraction.ipynb index e2194b09b..f167ca639 100644 --- a/medcat-v2-tutorials/notebooks/introductory/relcat/1._Supervised_Training_Relation_Extraction.ipynb +++ b/medcat-v2-tutorials/notebooks/introductory/relcat/1._Supervised_Training_Relation_Extraction.ipynb @@ -101,7 +101,7 @@ ], "source": [ "# Install medcat\n", - "! pip install \"medcat[spacy,rel-cat,meta-cat]~=2.1.0\" # NOTE: VERSION-STRING" + "! pip install \"medcat[spacy,rel-cat,meta-cat]~=2.4.0\" # NOTE: VERSION-STRING" ] }, { diff --git a/medcat-v2-tutorials/notebooks/introductory/relcat/2._Infering_relations_from_annotations_with_Relation_toolkit.ipynb b/medcat-v2-tutorials/notebooks/introductory/relcat/2._Infering_relations_from_annotations_with_Relation_toolkit.ipynb index 121f36111..24e961ceb 100644 --- a/medcat-v2-tutorials/notebooks/introductory/relcat/2._Infering_relations_from_annotations_with_Relation_toolkit.ipynb +++ b/medcat-v2-tutorials/notebooks/introductory/relcat/2._Infering_relations_from_annotations_with_Relation_toolkit.ipynb @@ -92,7 +92,7 @@ ], "source": [ "# Install medcat\n", - "! pip install \"medcat[spacy,rel-cat]~=2.1.0\" # NOTE: VERSION-STRING" + "! pip install \"medcat[spacy,rel-cat]~=2.4.0\" # NOTE: VERSION-STRING" ] }, { From 3790468fe07c27fdc1725705c0a241349704acaa Mon Sep 17 00:00:00 2001 From: mart-r Date: Sat, 20 Dec 2025 16:27:37 +0000 Subject: [PATCH 4/4] CU-869bj3d4g: Fix scikit learn name mapping --- medcat-v2/medcat/utils/import_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/medcat-v2/medcat/utils/import_utils.py b/medcat-v2/medcat/utils/import_utils.py index a4d30efa4..628a90abe 100644 --- a/medcat-v2/medcat/utils/import_utils.py +++ b/medcat-v2/medcat/utils/import_utils.py @@ -14,7 +14,8 @@ def __missing__(self, key): # Map the project name to the package needed to be imported where appropraite. # Default to the package name itself. _DEP_NAME_MAPPER = KeyDefaultDict({ - "pyahocorasick": "ahocorasick" + "pyahocorasick": "ahocorasick", + "scikit-learn": "sklearn", })