Skip to content

Commit 33868c8

Browse files
committed
fix(py37): add importlib.metadata compatibility shim for Python 3.7
Python 3.7 doesn't have built-in importlib.metadata (added in 3.8). Added try/except fallback to importlib_metadata backport package in all import locations. Files fixed: - src/omnipkg/commands/run.py - src/omnipkg/core.py - src/omnipkg/integration/cli_executor.py - src/omnipkg/integration/environment.py - src/omnipkg/isolation/worker_daemon.py (dynamic code execution) - src/omnipkg/loader.py (dynamic code execution) - src/omnipkg/package_meta_builder.py This resolves 'ModuleNotFoundError: No module named importlib.metadata' on Python 3.7 installations.
1 parent c7eaa4b commit 33868c8

7 files changed

Lines changed: 26 additions & 8 deletions

File tree

src/omnipkg/commands/run.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,10 @@ def is_package_corrupted(pkg_name, missing_module_name):
945945
Checks if a package is 'Ghosted' (metadata exists so pip thinks it's installed,
946946
but the actual module cannot be imported).
947947
"""
948-
import importlib.metadata
948+
try:
949+
 import importlib.metadata as importlib_metadata
950+
except ImportError:
951+
 import importlib_metadata
949952
import importlib.util
950953

951954
# 1. Is it installed according to metadata?

src/omnipkg/core.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
from omnipkg.common_utils import safe_print, print_header
1313

1414
import hashlib
15-
import importlib.metadata
15+
try:
16+
 import importlib.metadata as importlib_metadata
17+
except ImportError:
18+
 import importlib_metadata
1619
import io
1720
import json
1821
import locale as sys_locale
@@ -13461,7 +13464,10 @@ def _get_file_list_for_packages_live(self, package_names: List[str]) -> Dict[str
1346113464
import sys, json, traceback
1346213465

1346313466
try:
13464-
import importlib.metadata as metadata
13467+
try:
13468+
import importlib.metadata as metadata
13469+
except ImportError:
13470+
import importlib_metadata as metadata
1346513471
except ImportError:
1346613472
import importlib_metadata as metadata
1346713473

src/omnipkg/integration/cli_executor.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
This makes omnipkg actually usable for real development work
66
"""
77

8-
import importlib.metadata
8+
try:
9+
 import importlib.metadata as importlib_metadata
10+
except ImportError:
11+
 import importlib_metadata
912
import os
1013
import shutil
1114
import subprocess

src/omnipkg/integration/environment.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
have to prefix commands with '8pkg run'
88
"""
99

10-
import importlib.metadata
10+
try:
11+
 import importlib.metadata as importlib_metadata
12+
except ImportError:
13+
 import importlib_metadata
1114
import os
1215
import shutil
1316
import stat

src/omnipkg/isolation/worker_daemon.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3350,7 +3350,7 @@ def execute(self, code: str):
33503350
}
33513351

33523352
def get_version(self, package_name):
3353-
code = f"import importlib.metadata; result = {{'version': importlib.metadata.version('{package_name}'), 'path': __import__('{package_name}').__file__}}"
3353+
code = f"try: import importlib.metadata as meta\nexcept ImportError: import importlib_metadata as meta\nresult = {{'version': meta.version('{package_name}'), 'path': __import__('{package_name}').__file__}}"
33543354
res = self.execute(code)
33553355
if res.get("success"):
33563356
return {"success": True, "version": "unknown", "path": "daemon"}

src/omnipkg/loader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4004,7 +4004,7 @@ def execute(self, code: str) -> dict:
40044004
def get_version(self, package_name):
40054005
# Execute code to get version and path
40064006
# The worker extracts the local variable named 'result' and merges it into the response
4007-
code = f"import importlib.metadata; result = {{'version': importlib.metadata.version('{package_name}'), 'path': __import__('{package_name}').__file__}}"
4007+
code = f"try: import importlib.metadata as meta\nexcept ImportError: import importlib_metadata as meta\nresult = {{'version': meta.version('{package_name}'), 'path': __import__('{package_name}').__file__}}"
40084008
res = self.execute(code)
40094009

40104010
if res.get("success"):

src/omnipkg/package_meta_builder.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
"""
1515
import concurrent.futures
1616
import hashlib
17-
import importlib.metadata
17+
try:
18+
 import importlib.metadata as importlib_metadata
19+
except ImportError:
20+
 import importlib_metadata
1821
import json
1922
import os
2023
import re

0 commit comments

Comments
 (0)