Skip to content

Commit 65482f4

Browse files
committed
[GR-74513] Raise ImportError when unsupported cjk codec modules import
1 parent 5fc3c37 commit 65482f4

14 files changed

Lines changed: 63 additions & 22 deletions

File tree

graalpython/com.oracle.graal.python.test/src/tests/test_codecs.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
55
import importlib
66
import sys
7+
from pathlib import Path
78

89

910
def coding_checker(self, coder):
@@ -893,12 +894,31 @@ def test_encode_dict_err_xmlcharrefreplace(self):
893894

894895
class MultibyteCodecTest(unittest.TestCase):
895896

896-
def test_missing_multibyte_codecs_raise_import_error(self):
897-
expected_exc = ImportError if sys.implementation.name == 'graalpy' else LookupError
897+
def test_missing_multibyte_codecs_raise_lookup_error(self):
898898
for module_name in ('_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw'):
899899
with self.subTest(module_name=module_name):
900900
module = importlib.import_module(module_name)
901-
self.assertRaises(expected_exc, module.getcodec, '__missing_codec__')
901+
self.assertRaises(LookupError, module.getcodec, '__missing_codec__')
902+
903+
def test_unsupported_multibyte_codec_modules_raise_import_error_on_graalpy(self):
904+
encodings_dir = Path(__file__).resolve().parents[3] / 'lib-python' / '3' / 'encodings'
905+
for module_name in (
906+
'encodings.euc_jis_2004',
907+
'encodings.euc_jisx0213',
908+
'encodings.iso2022_jp_1',
909+
'encodings.iso2022_jp_2004',
910+
'encodings.iso2022_jp_3',
911+
'encodings.iso2022_jp_ext',
912+
'encodings.shift_jis_2004',
913+
):
914+
with self.subTest(module_name=module_name):
915+
module_path = encodings_dir / f'{module_name.rsplit(".", 1)[1]}.py'
916+
spec = importlib.util.spec_from_file_location(f'test_{module_name.replace(".", "_")}', module_path)
917+
module = importlib.util.module_from_spec(spec)
918+
if sys.implementation.name == 'graalpy':
919+
self.assertRaises(ImportError, spec.loader.exec_module, module)
920+
else:
921+
spec.loader.exec_module(module)
902922

903923
# just a smoke test
904924
def test_encode(self):

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsCNModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.PyMultibyteCodec_CAPSULE_NAME;
4545
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.registerCodec;
4646
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.CreateCodecNode.createCodec;
47-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ImportError;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.J__CODECS_CN;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T__CODECS_CN;
5049
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_NAME_MUST_BE_A_STRING;
5150
import static com.oracle.graal.python.nodes.ErrorMessages.NO_SUCH_CODEC_IS_SUPPORTED;
51+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5252
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5353

5454
import java.util.List;
@@ -134,7 +134,7 @@ static Object getcodec(Object encoding,
134134

135135
MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual);
136136
if (codec == null) {
137-
throw raiseNode.raise(inliningTarget, ImportError, NO_SUCH_CODEC_IS_SUPPORTED);
137+
throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
138138
}
139139

140140
PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsHKModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.PyMultibyteCodec_CAPSULE_NAME;
4545
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.registerCodec;
4646
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.CreateCodecNode.createCodec;
47-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ImportError;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.J__CODECS_HK;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T__CODECS_HK;
5049
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_NAME_MUST_BE_A_STRING;
5150
import static com.oracle.graal.python.nodes.ErrorMessages.NO_SUCH_CODEC_IS_SUPPORTED;
51+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5252
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5353

5454
import java.util.List;
@@ -126,7 +126,7 @@ static Object getcodec(Object encoding,
126126

127127
MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual);
128128
if (codec == null) {
129-
throw raiseNode.raise(inliningTarget, ImportError, NO_SUCH_CODEC_IS_SUPPORTED);
129+
throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
130130
}
131131

132132
PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsISO2022ModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.PyMultibyteCodec_CAPSULE_NAME;
4545
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.registerCodec;
4646
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.CreateCodecNode.createCodec;
47-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ImportError;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.J__CODECS_ISO2022;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T__CODECS_ISO2022;
5049
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_NAME_MUST_BE_A_STRING;
5150
import static com.oracle.graal.python.nodes.ErrorMessages.NO_SUCH_CODEC_IS_SUPPORTED;
51+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5252
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5353

5454
import java.util.List;
@@ -136,7 +136,7 @@ static Object getcodec(Object encoding,
136136

137137
MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual);
138138
if (codec == null) {
139-
throw raiseNode.raise(inliningTarget, ImportError, NO_SUCH_CODEC_IS_SUPPORTED);
139+
throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
140140
}
141141

142142
PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsJPModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.PyMultibyteCodec_CAPSULE_NAME;
4545
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.registerCodec;
4646
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.CreateCodecNode.createCodec;
47-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ImportError;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.J__CODECS_JP;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T__CODECS_JP;
5049
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_NAME_MUST_BE_A_STRING;
5150
import static com.oracle.graal.python.nodes.ErrorMessages.NO_SUCH_CODEC_IS_SUPPORTED;
51+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5252
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5353

5454
import java.util.List;
@@ -158,7 +158,7 @@ static Object getcodec(Object encoding,
158158

159159
MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual);
160160
if (codec == null) {
161-
throw raiseNode.raise(inliningTarget, ImportError, NO_SUCH_CODEC_IS_SUPPORTED);
161+
throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
162162
}
163163

164164
PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsKRModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.PyMultibyteCodec_CAPSULE_NAME;
4545
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.registerCodec;
4646
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.CreateCodecNode.createCodec;
47-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ImportError;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.J__CODECS_KR;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T__CODECS_KR;
5049
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_NAME_MUST_BE_A_STRING;
5150
import static com.oracle.graal.python.nodes.ErrorMessages.NO_SUCH_CODEC_IS_SUPPORTED;
51+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5252
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5353

5454
import java.util.List;
@@ -131,7 +131,7 @@ static Object getcodec(Object encoding,
131131

132132
MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual);
133133
if (codec == null) {
134-
throw raiseNode.raise(inliningTarget, ImportError, NO_SUCH_CODEC_IS_SUPPORTED);
134+
throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
135135
}
136136

137137
PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsTWModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.PyMultibyteCodec_CAPSULE_NAME;
4545
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.registerCodec;
4646
import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.CreateCodecNode.createCodec;
47-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ImportError;
4847
import static com.oracle.graal.python.nodes.BuiltinNames.J__CODECS_TW;
4948
import static com.oracle.graal.python.nodes.BuiltinNames.T__CODECS_TW;
5049
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODING_NAME_MUST_BE_A_STRING;
5150
import static com.oracle.graal.python.nodes.ErrorMessages.NO_SUCH_CODEC_IS_SUPPORTED;
51+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.LookupError;
5252
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5353

5454
import java.util.List;
@@ -126,7 +126,7 @@ static Object getcodec(Object encoding,
126126

127127
MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual);
128128
if (codec == null) {
129-
throw raiseNode.raise(inliningTarget, ImportError, NO_SUCH_CODEC_IS_SUPPORTED);
129+
throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
130130
}
131131

132132
PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME);

graalpython/lib-python/3/encodings/euc_jis_2004.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import _codecs_jp, codecs
88
import _multibytecodec as mbc
99

10-
codec = _codecs_jp.getcodec('euc_jis_2004')
10+
try:
11+
codec = _codecs_jp.getcodec('euc_jis_2004')
12+
except LookupError as e:
13+
raise ImportError(str(e)) from e
1114

1215
class Codec(codecs.Codec):
1316
encode = codec.encode

graalpython/lib-python/3/encodings/euc_jisx0213.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import _codecs_jp, codecs
88
import _multibytecodec as mbc
99

10-
codec = _codecs_jp.getcodec('euc_jisx0213')
10+
try:
11+
codec = _codecs_jp.getcodec('euc_jisx0213')
12+
except LookupError as e:
13+
raise ImportError(str(e)) from e
1114

1215
class Codec(codecs.Codec):
1316
encode = codec.encode

graalpython/lib-python/3/encodings/iso2022_jp_1.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import _codecs_iso2022, codecs
88
import _multibytecodec as mbc
99

10-
codec = _codecs_iso2022.getcodec('iso2022_jp_1')
10+
try:
11+
codec = _codecs_iso2022.getcodec('iso2022_jp_1')
12+
except LookupError as e:
13+
raise ImportError(str(e)) from e
1114

1215
class Codec(codecs.Codec):
1316
encode = codec.encode

0 commit comments

Comments
 (0)