From 8ba131732d2859a87cade1f55a96e18eb32a3e67 Mon Sep 17 00:00:00 2001 From: yifeitao Date: Fri, 25 Jun 2021 17:56:30 +0800 Subject: [PATCH 1/7] imp.find_module can't find namespace package, update to importlib to resolve package path --- pyhocon/config_parser.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index 9241de87..721f1061 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -1,7 +1,7 @@ import codecs import contextlib import copy -import imp +import importlib.util import itertools import logging import os @@ -727,10 +727,16 @@ def resolve_package_path(cls, package_path): if ':' not in package_path: raise ValueError("Expected format is 'PACKAGE:PATH'") package_name, path_relative = package_path.split(':', 1) - package_dir = imp.find_module(package_name)[1] - path_abs = os.path.join(package_dir, path_relative) - return path_abs - + spec = importlib.util.find_spec(package_name) + if spec: + search_locations = spec.submodule_search_locations + for package_dir in search_locations: + path_abs = os.path.join(package_dir, path_relative) + if os.path.exists(path_abs): + return path_abs + raise ImportError("Can't find {path_relative} in package:{package_name}".format( + path_relative=path_relative, + package_name=package_name)) class ListParser(TokenConverter): """Parse a list [elt1, etl2, ...] From 835a3866f5794b36fd2e66d52a50b0c9dbdd5201 Mon Sep 17 00:00:00 2001 From: yifeitao Date: Fri, 25 Jun 2021 17:59:19 +0800 Subject: [PATCH 2/7] clean code --- pyhocon/config_parser.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index 721f1061..174c75e8 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -729,8 +729,7 @@ def resolve_package_path(cls, package_path): package_name, path_relative = package_path.split(':', 1) spec = importlib.util.find_spec(package_name) if spec: - search_locations = spec.submodule_search_locations - for package_dir in search_locations: + for package_dir in spec.submodule_search_locations: path_abs = os.path.join(package_dir, path_relative) if os.path.exists(path_abs): return path_abs From de87e92590799f507075b687930309da7cb55dab Mon Sep 17 00:00:00 2001 From: Francois Dang Ngoc Date: Sun, 11 Jul 2021 19:14:17 -0500 Subject: [PATCH 3/7] Update config_parser.py flake8 --- pyhocon/config_parser.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index 630b55c0..d09d21fb 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -1,7 +1,6 @@ import codecs import contextlib import copy -import importlib.util import itertools import logging import os @@ -766,10 +765,10 @@ def resolve_package_path(cls, package_path): if os.path.exists(path_abs): return path_abs raise ImportError("Can't find {path_relative} in package:{package_name}".format( - path_relative=path_relative, + path_relative=path_relative, package_name=package_name)) - + class ListParser(TokenConverter): """Parse a list [elt1, etl2, ...] """ From 86c7b7dcb9b92e3b71b70183c33a59259cf72cab Mon Sep 17 00:00:00 2001 From: Francois Dang Ngoc Date: Sun, 11 Jul 2021 19:20:39 -0500 Subject: [PATCH 4/7] Update config_parser.py put back importlib.util at the top --- pyhocon/config_parser.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index d09d21fb..74d5205a 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -7,6 +7,7 @@ import re import socket import sys +import importlib.util from datetime import timedelta import pyparsing @@ -66,8 +67,6 @@ def glob(pathname, recursive=False): # Fix deprecated warning with 'imp' library and Python 3.4+. # See: https://github.com/chimpler/pyhocon/issues/248 if sys.version_info >= (3, 4): - import importlib.util - def find_package_dir(name): spec = importlib.util.find_spec(name) # When `imp.find_module()` cannot find a package it raises ImportError. From 5a47cd90b9a8645c408a911dbbaf0689ccfe479e Mon Sep 17 00:00:00 2001 From: Francois Dang Ngoc Date: Sun, 11 Jul 2021 19:28:15 -0500 Subject: [PATCH 5/7] put back importlib.util for >= 3.4 and importlib otherwise --- pyhocon/config_parser.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index 74d5205a..6a54e875 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -67,6 +67,8 @@ def glob(pathname, recursive=False): # Fix deprecated warning with 'imp' library and Python 3.4+. # See: https://github.com/chimpler/pyhocon/issues/248 if sys.version_info >= (3, 4): + import importlib.util + def find_package_dir(name): spec = importlib.util.find_spec(name) # When `imp.find_module()` cannot find a package it raises ImportError. @@ -77,6 +79,7 @@ def find_package_dir(name): return os.path.dirname(spec.origin) else: import imp + import importlib def find_package_dir(name): return imp.find_module(name)[1] From 504eec8f83e3f5f3c855490d410a041eed794133 Mon Sep 17 00:00:00 2001 From: Francois Dang Ngoc Date: Sun, 11 Jul 2021 19:32:31 -0500 Subject: [PATCH 6/7] flake8 --- pyhocon/config_parser.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index 6a54e875..3e0cdcba 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -7,7 +7,6 @@ import re import socket import sys -import importlib.util from datetime import timedelta import pyparsing @@ -68,7 +67,7 @@ def glob(pathname, recursive=False): # See: https://github.com/chimpler/pyhocon/issues/248 if sys.version_info >= (3, 4): import importlib.util - + def find_package_dir(name): spec = importlib.util.find_spec(name) # When `imp.find_module()` cannot find a package it raises ImportError. From e2b0e1f94168f2e39adf1297626ccd61584af222 Mon Sep 17 00:00:00 2001 From: yifeitao Date: Tue, 13 Jul 2021 11:18:49 +0800 Subject: [PATCH 7/7] keep the compatibility with py2.7. pass tests --- pyhocon/config_parser.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py index 3e0cdcba..6846589d 100644 --- a/pyhocon/config_parser.py +++ b/pyhocon/config_parser.py @@ -68,20 +68,20 @@ def glob(pathname, recursive=False): if sys.version_info >= (3, 4): import importlib.util - def find_package_dir(name): + def find_package_dirs(name): spec = importlib.util.find_spec(name) # When `imp.find_module()` cannot find a package it raises ImportError. # Here we should simulate it to keep the compatibility with older # versions. if not spec: raise ImportError('No module named {!r}'.format(name)) - return os.path.dirname(spec.origin) + return spec.submodule_search_locations else: import imp import importlib - def find_package_dir(name): - return imp.find_module(name)[1] + def find_package_dirs(name): + return [imp.find_module(name)[1]] logger = logging.getLogger(__name__) @@ -759,12 +759,11 @@ def resolve_package_path(cls, package_path): if ':' not in package_path: raise ValueError("Expected format is 'PACKAGE:PATH'") package_name, path_relative = package_path.split(':', 1) - spec = importlib.util.find_spec(package_name) - if spec: - for package_dir in spec.submodule_search_locations: - path_abs = os.path.join(package_dir, path_relative) - if os.path.exists(path_abs): - return path_abs + package_dirs = find_package_dirs(package_name) + for package_dir in package_dirs: + path_abs = os.path.join(package_dir, path_relative) + if os.path.exists(path_abs): + return path_abs raise ImportError("Can't find {path_relative} in package:{package_name}".format( path_relative=path_relative, package_name=package_name))