Skip to content

Commit 80e6b44

Browse files
committed
Use importlib where available.
- This does change the shape of the `ply_dist` object inside util but users shouldn't normally and have no reason to depend on that. Fixes #47
1 parent 1742aa8 commit 80e6b44

File tree

2 files changed

+54
-21
lines changed

2 files changed

+54
-21
lines changed

src/calmjs/parse/tests/__init__.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from io import StringIO
99
from os.path import basename
1010
from os.path import dirname
11-
from pkg_resources import get_distribution
1211

1312
examples = {
1413
'/tmp/html4.js': dedent("""
@@ -63,14 +62,21 @@ def open(p, flag='r'):
6362
doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
6463
)
6564

66-
dist = get_distribution('calmjs.parse')
67-
if dist:
68-
if dist.has_metadata('PKG-INFO'):
69-
pkgdesc = dist.get_metadata('PKG-INFO').replace('\r', '')
70-
elif dist.has_metadata('METADATA'):
71-
pkgdesc = dist.get_metadata('METADATA').replace('\r', '')
72-
else:
73-
pkgdesc = ''
65+
try:
66+
from importlib import metadata
67+
pkgdesc = metadata.metadata('calmjs.parse').get('description')
68+
pkgdesc = pkgdesc.replace('\r', '') if pkgdesc else ''
69+
except ImportError:
70+
from pkg_resources import get_distribution
71+
dist = get_distribution('calmjs.parse')
72+
if dist:
73+
if dist.has_metadata('PKG-INFO'):
74+
pkgdesc = dist.get_metadata('PKG-INFO').replace('\r', '')
75+
elif dist.has_metadata('METADATA'):
76+
pkgdesc = dist.get_metadata('METADATA').replace('\r', '')
77+
else:
78+
pkgdesc = ''
79+
7480
pkgdesc_tests = [
7581
t for t in parser.parse(pkgdesc) if isinstance(t, doctest.Example)]
7682

src/calmjs/parse/utils.py

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,47 @@
99
from os.path import normpath
1010
from os.path import relpath
1111

12+
13+
class _Distribution(object):
14+
def __init__(self, project_name, version):
15+
self.project_name = project_name
16+
self.version = version
17+
18+
1219
try:
13-
from pkg_resources import working_set
14-
from pkg_resources import Requirement
15-
ply_dist = working_set.find(Requirement.parse('ply'))
16-
# note that for **extremely** ancient versions of setuptools, e.g.
17-
# setuptools<0.6c11, or some very non-standard environment that does
18-
# not include the required metadata (e.g. pyinstaller without the
19-
# required metadata), will require the following workaround...
20-
if ply_dist is None: # pragma: no cover
21-
from pkg_resources import Distribution
22-
import ply
23-
ply_dist = Distribution(project_name='ply', version=ply.__version__)
20+
from importlib import metadata
21+
try:
22+
ply_version = metadata.version('ply')
23+
except Exception: # pragma: no cover
24+
ply_dist = None
25+
else:
26+
ply_dist = _Distribution(project_name='ply', version=ply_version)
2427
except ImportError: # pragma: no cover
25-
ply_dist = None
28+
try:
29+
from pkg_resources import working_set
30+
from pkg_resources import Requirement
31+
ply_dist = working_set.find(Requirement.parse('ply'))
32+
# note that for **extremely** ancient versions of setuptools, e.g.
33+
# setuptools<0.6c11, or some very non-standard environment that does
34+
# not include the required metadata (e.g. pyinstaller without the
35+
# required metadata), will require the following workaround...
36+
if ply_dist:
37+
# convert to our private version class
38+
ply_dist = _Distribution(
39+
project_name='ply',
40+
version=ply_dist.version,
41+
)
42+
else:
43+
try:
44+
import ply
45+
ply_dist = _Distribution(
46+
project_name='ply',
47+
version=ply.__version__,
48+
)
49+
except ImportError:
50+
ply_dist = None
51+
except ImportError: # pragma: no cover
52+
ply_dist = None
2653

2754
py_major = sys.version_info.major
2855
unicode = unicode if py_major < 3 else None # noqa: F821

0 commit comments

Comments
 (0)