From d4307bab24d13c5979ac0a7af3c8a2c99b22b1bc Mon Sep 17 00:00:00 2001 From: kurianbenoy-sarvam Date: Sat, 14 Jun 2025 23:01:15 +0530 Subject: [PATCH 1/2] remove deprecate pkg_resource from nbdev --- nbdev/doclinks.py | 10 +++--- nbs/api/05_doclinks.ipynb | 66 ++++++++++++++++++++++++++++++++------- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/nbdev/doclinks.py b/nbdev/doclinks.py index 8efbb40c7..90648a25d 100644 --- a/nbdev/doclinks.py +++ b/nbdev/doclinks.py @@ -17,7 +17,8 @@ from fastcore.net import urlread import ast,builtins,contextlib -import pkg_resources,importlib +import importlib.metadata +import importlib.util from astunparse import unparse from io import BytesIO @@ -236,9 +237,10 @@ def _build_lookup_table(strip_libs=None, incl_libs=None, skip_mods=None): strip_libs = L(strip_libs) if incl_libs is not None: incl_libs = (L(incl_libs)+strip_libs).unique() entries = {} - for o in pkg_resources.iter_entry_points(group='nbdev'): - if incl_libs is not None and o.dist.key not in incl_libs: continue - try: entries[o.name] = _qual_syms(o.resolve()) + eps = importlib.metadata.entry_points() + for o in eps.select(group='nbdev') if hasattr(eps, 'select') else eps.get('nbdev', []): + if incl_libs is not None and o.dist.name not in incl_libs: continue + try: entries[o.name] = _qual_syms(o.load()) except Exception: pass py_syms = merge(*L(o['syms'].values() for o in entries.values()).concat()) for m in strip_libs: diff --git a/nbs/api/05_doclinks.ipynb b/nbs/api/05_doclinks.ipynb index 4b4097eda..97064611b 100644 --- a/nbs/api/05_doclinks.ipynb +++ b/nbs/api/05_doclinks.ipynb @@ -22,7 +22,20 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "expected 'except' or 'finally' block (doclinks.py, line 244)", + "output_type": "error", + "traceback": [ + "Traceback \u001b[36m(most recent call last)\u001b[39m:\n", + " File \u001b[92m~/git/nbdev/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3672\u001b[39m in \u001b[95mrun_code\u001b[39m\n exec(code_obj, self.user_global_ns, self.user_ns)\n", + " Cell \u001b[92mIn[2]\u001b[39m\u001b[92m, line 2\u001b[39m\n from nbdev.config import *\n", + "\u001b[36m \u001b[39m\u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/__init__.py:3\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mfrom .doclinks import nbdev_export\u001b[39m\n", + " \u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/doclinks.py:244\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mpy_syms = merge(*L(o['syms'].values() for o in entries.values()).concat())\u001b[39m\n ^\n\u001b[31mSyntaxError\u001b[39m\u001b[31m:\u001b[39m expected 'except' or 'finally' block\n" + ] + } + ], "source": [ "#|export\n", "from nbdev.config import *\n", @@ -36,7 +49,8 @@ "from fastcore.net import urlread\n", "\n", "import ast,builtins,contextlib\n", - "import pkg_resources,importlib\n", + "import importlib.metadata\n", + "import importlib.util\n", "\n", "from astunparse import unparse\n", "from io import BytesIO\n", @@ -51,7 +65,20 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "expected 'except' or 'finally' block (doclinks.py, line 244)", + "output_type": "error", + "traceback": [ + "Traceback \u001b[36m(most recent call last)\u001b[39m:\n", + " File \u001b[92m~/git/nbdev/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3672\u001b[39m in \u001b[95mrun_code\u001b[39m\n exec(code_obj, self.user_global_ns, self.user_ns)\n", + " Cell \u001b[92mIn[3]\u001b[39m\u001b[92m, line 7\u001b[39m\n from nbdev.showdoc import show_doc\n", + "\u001b[36m \u001b[39m\u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/__init__.py:3\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mfrom .doclinks import nbdev_export\u001b[39m\n", + " \u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/doclinks.py:244\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mpy_syms = merge(*L(o['syms'].values() for o in entries.values()).concat())\u001b[39m\n ^\n\u001b[31mSyntaxError\u001b[39m\u001b[31m:\u001b[39m expected 'except' or 'finally' block\n" + ] + } + ], "source": [ "#|hide\n", "from IPython.display import Markdown,display\n", @@ -619,9 +646,10 @@ " strip_libs = L(strip_libs)\n", " if incl_libs is not None: incl_libs = (L(incl_libs)+strip_libs).unique()\n", " entries = {}\n", - " for o in pkg_resources.iter_entry_points(group='nbdev'):\n", - " if incl_libs is not None and o.dist.key not in incl_libs: continue\n", - " try: entries[o.name] = _qual_syms(o.resolve())\n", + " eps = importlib.metadata.entry_points()\n", + " for o in eps.select(group='nbdev') if hasattr(eps, 'select') else eps.get('nbdev', []):\n", + " if incl_libs is not None and o.dist.name not in incl_libs: continue\n", + " try: entries[o.name] = _qual_syms(o.load())\n", " except Exception: pass\n", " py_syms = merge(*L(o['syms'].values() for o in entries.values()).concat())\n", " for m in strip_libs:\n", @@ -675,13 +703,13 @@ "# Create mock entry points\n", "class BadEntryPoint:\n", " name = 'bad_entry'\n", - " dist = type('Dist', (), {'key': 'bad_lib'})()\n", - " def resolve(self): raise AttributeError(\"Simulated error\")\n", + " dist = type('Dist', (), {'name': 'bad_lib'})()\n", + " def load(self): raise AttributeError(\"Simulated error\")\n", "\n", "class GoodEntryPoint:\n", " name = 'good_entry'\n", - " dist = type('Dist', (), {'key': 'good_lib'})()\n", - " def resolve(self): return {'syms': {}, 'settings': {}}" + " dist = type('Dist', (), {'name': 'good_lib'})()\n", + " def load(self): return {'syms': {}, 'settings': {}}" ] }, { @@ -704,8 +732,22 @@ "# Clear the cache before testing\n", "_build_lookup_table.cache_clear()\n", "\n", - "# Patch iter_entry_points\n", - "with xpatch('pkg_resources.iter_entry_points', return_value=[BadEntryPoint(), GoodEntryPoint()]):\n", + "# Create a mock entry points object that supports both access patterns\n", + "class MockEntryPoints:\n", + " def __init__(self, entries):\n", + " self.entries = entries\n", + " \n", + " def select(self, group):\n", + " return self.entries if group == 'nbdev' else []\n", + " \n", + " def get(self, group, default=None):\n", + " return self.entries if group == 'nbdev' else (default or [])\n", + "\n", + "# Create mock entry points\n", + "mock_eps = MockEntryPoints([BadEntryPoint(), GoodEntryPoint()])\n", + "\n", + "# Patch importlib.metadata.entry_points\n", + "with xpatch('importlib.metadata.entry_points', return_value=mock_eps):\n", " entries, py_syms = _build_lookup_table()\n", " \n", " # Should only contain the good entry\n", From 83795e3d9945f885cac571dcd70c23815555baf1 Mon Sep 17 00:00:00 2001 From: kurianbenoy-sarvam Date: Sun, 22 Jun 2025 21:31:39 +0530 Subject: [PATCH 2/2] update codebase to fix invalid python syntax --- nbdev/doclinks.py | 8 ++++-- nbs/api/05_doclinks.ipynb | 54 ++++++++++++--------------------------- 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/nbdev/doclinks.py b/nbdev/doclinks.py index 90648a25d..779bd2844 100644 --- a/nbdev/doclinks.py +++ b/nbdev/doclinks.py @@ -232,16 +232,19 @@ def _build_lookup_table(strip_libs=None, incl_libs=None, skip_mods=None): cfg = get_config() if strip_libs is None: try: strip_libs = cfg.get('strip_libs', cfg.get('lib_path', 'nbdev').name).split() - except FileNotFoundError: strip_libs = 'nbdev' + except FileNotFoundError: strip_libs = ['nbdev'] skip_mods = setify(skip_mods) strip_libs = L(strip_libs) if incl_libs is not None: incl_libs = (L(incl_libs)+strip_libs).unique() + entries = {} eps = importlib.metadata.entry_points() - for o in eps.select(group='nbdev') if hasattr(eps, 'select') else eps.get('nbdev', []): + nbdev_eps = eps.select(group='nbdev') if hasattr(eps, 'select') else eps.get('nbdev', []) + for o in nbdev_eps: if incl_libs is not None and o.dist.name not in incl_libs: continue try: entries[o.name] = _qual_syms(o.load()) except Exception: pass + py_syms = merge(*L(o['syms'].values() for o in entries.values()).concat()) for m in strip_libs: if m in entries: @@ -253,6 +256,7 @@ def _build_lookup_table(strip_libs=None, incl_libs=None, skip_mods=None): k = remove_prefix(k,f"{mod}.") if k not in stripped: stripped[k] = v py_syms = merge(stripped, py_syms) + return entries,py_syms # %% ../nbs/api/05_doclinks.ipynb diff --git a/nbs/api/05_doclinks.ipynb b/nbs/api/05_doclinks.ipynb index 97064611b..939ad84d5 100644 --- a/nbs/api/05_doclinks.ipynb +++ b/nbs/api/05_doclinks.ipynb @@ -22,20 +22,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "expected 'except' or 'finally' block (doclinks.py, line 244)", - "output_type": "error", - "traceback": [ - "Traceback \u001b[36m(most recent call last)\u001b[39m:\n", - " File \u001b[92m~/git/nbdev/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3672\u001b[39m in \u001b[95mrun_code\u001b[39m\n exec(code_obj, self.user_global_ns, self.user_ns)\n", - " Cell \u001b[92mIn[2]\u001b[39m\u001b[92m, line 2\u001b[39m\n from nbdev.config import *\n", - "\u001b[36m \u001b[39m\u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/__init__.py:3\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mfrom .doclinks import nbdev_export\u001b[39m\n", - " \u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/doclinks.py:244\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mpy_syms = merge(*L(o['syms'].values() for o in entries.values()).concat())\u001b[39m\n ^\n\u001b[31mSyntaxError\u001b[39m\u001b[31m:\u001b[39m expected 'except' or 'finally' block\n" - ] - } - ], + "outputs": [], "source": [ "#|export\n", "from nbdev.config import *\n", @@ -65,20 +52,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "expected 'except' or 'finally' block (doclinks.py, line 244)", - "output_type": "error", - "traceback": [ - "Traceback \u001b[36m(most recent call last)\u001b[39m:\n", - " File \u001b[92m~/git/nbdev/.venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3672\u001b[39m in \u001b[95mrun_code\u001b[39m\n exec(code_obj, self.user_global_ns, self.user_ns)\n", - " Cell \u001b[92mIn[3]\u001b[39m\u001b[92m, line 7\u001b[39m\n from nbdev.showdoc import show_doc\n", - "\u001b[36m \u001b[39m\u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/__init__.py:3\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mfrom .doclinks import nbdev_export\u001b[39m\n", - " \u001b[36mFile \u001b[39m\u001b[32m~/git/nbdev/nbdev/doclinks.py:244\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mpy_syms = merge(*L(o['syms'].values() for o in entries.values()).concat())\u001b[39m\n ^\n\u001b[31mSyntaxError\u001b[39m\u001b[31m:\u001b[39m expected 'except' or 'finally' block\n" - ] - } - ], + "outputs": [], "source": [ "#|hide\n", "from IPython.display import Markdown,display\n", @@ -641,16 +615,19 @@ " cfg = get_config()\n", " if strip_libs is None:\n", " try: strip_libs = cfg.get('strip_libs', cfg.get('lib_path', 'nbdev').name).split()\n", - " except FileNotFoundError: strip_libs = 'nbdev'\n", + " except FileNotFoundError: strip_libs = ['nbdev']\n", " skip_mods = setify(skip_mods)\n", " strip_libs = L(strip_libs)\n", " if incl_libs is not None: incl_libs = (L(incl_libs)+strip_libs).unique()\n", + " \n", " entries = {}\n", " eps = importlib.metadata.entry_points()\n", - " for o in eps.select(group='nbdev') if hasattr(eps, 'select') else eps.get('nbdev', []):\n", + " nbdev_eps = eps.select(group='nbdev') if hasattr(eps, 'select') else eps.get('nbdev', [])\n", + " for o in nbdev_eps:\n", " if incl_libs is not None and o.dist.name not in incl_libs: continue\n", " try: entries[o.name] = _qual_syms(o.load())\n", " except Exception: pass\n", + "\n", " py_syms = merge(*L(o['syms'].values() for o in entries.values()).concat())\n", " for m in strip_libs:\n", " if m in entries:\n", @@ -662,6 +639,7 @@ " k = remove_prefix(k,f\"{mod}.\")\n", " if k not in stripped: stripped[k] = v\n", " py_syms = merge(stripped, py_syms)\n", + " \n", " return entries,py_syms" ] }, @@ -826,7 +804,7 @@ "text/plain": [ "('https://nbdev.fast.ai/api/doclinks.html#nbdevlookup',\n", " 'nbdev/doclinks.py',\n", - " 'https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py')" + " 'https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py')" ] }, "execution_count": null, @@ -849,7 +827,7 @@ "text/markdown": [ "---\n", "\n", - "[source](https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py#L269){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", + "[source](https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py#L276){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### NbdevLookup.doc\n", "\n", @@ -860,7 +838,7 @@ "text/plain": [ "---\n", "\n", - "[source](https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py#L269){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", + "[source](https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py#L276){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### NbdevLookup.doc\n", "\n", @@ -951,7 +929,7 @@ "text/markdown": [ "---\n", "\n", - "[source](https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py#L274){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", + "[source](https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py#L281){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### NbdevLookup.code\n", "\n", @@ -962,7 +940,7 @@ "text/plain": [ "---\n", "\n", - "[source](https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py#L274){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", + "[source](https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py#L281){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### NbdevLookup.code\n", "\n", @@ -988,7 +966,7 @@ { "data": { "text/plain": [ - "'https://github.com/AnswerDotAI/fastcore/blob/master/fastcore/net.py#LNone'" + "'https://github.com/AnswerDotAI/fastcore/blob/main/fastcore/net.py#LNone'" ] }, "execution_count": null, @@ -1010,7 +988,7 @@ "text/markdown": [ "---\n", "\n", - "[source](https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py#L292){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", + "[source](https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py#L299){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### NbdevLookup.linkify\n", "\n", @@ -1019,7 +997,7 @@ "text/plain": [ "---\n", "\n", - "[source](https://github.com/AnswerDotAI/nbdev/blob/master/nbdev/doclinks.py#L292){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", + "[source](https://github.com/AnswerDotAI/nbdev/blob/main/nbdev/doclinks.py#L299){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### NbdevLookup.linkify\n", "\n",