Skip to content

Commit 4e02283

Browse files
committed
[GR-74513] Raise ImportError for missing multibyte cjk codecs
PullRequest: graalpython/4361
2 parents 8107d5a + a22647e commit 4e02283

16 files changed

Lines changed: 69 additions & 22 deletions

File tree

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
# Copyright (C) 1996-2017 Python Software Foundation
33
#
44
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
5+
import importlib
6+
import importlib.util
57
import sys
8+
from pathlib import Path
69

710

811
def coding_checker(self, coder):
@@ -892,6 +895,34 @@ def test_encode_dict_err_xmlcharrefreplace(self):
892895

893896
class MultibyteCodecTest(unittest.TestCase):
894897

898+
def test_missing_multibyte_codecs_raise_lookup_error(self):
899+
for module_name in ('_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw'):
900+
with self.subTest(module_name=module_name):
901+
module = importlib.import_module(module_name)
902+
self.assertRaises(LookupError, module.getcodec, '__missing_codec__')
903+
904+
def test_unsupported_multibyte_codec_modules_raise_import_error_on_graalpy(self):
905+
encodings_dir = Path(__file__).resolve().parents[3] / 'lib-python' / '3' / 'encodings'
906+
for module_name in (
907+
'encodings.euc_jis_2004',
908+
'encodings.euc_jisx0213',
909+
'encodings.iso2022_jp_1',
910+
'encodings.iso2022_jp_2004',
911+
'encodings.iso2022_jp_3',
912+
'encodings.iso2022_jp_ext',
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)
922+
923+
def test_shift_jis_2004_codec_module_imports(self):
924+
import encodings.shift_jis_2004
925+
895926
# just a smoke test
896927
def test_encode(self):
897928
import _codecs_tw

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/util/CharsetMapping.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ private static void addAlias(String alias, String pythonName) {
306306
addMapping("mac_turkish", "x-MacTurkish");
307307
addMapping("palmos", null);
308308
addMapping("ptcp154", null);
309-
addMapping("shift_jis_2004", "Shift_JISX0213");
309+
addMapping("shift_jis_2004", "x-SJIS_0213");
310310
addMapping("shift_jis", "Shift_JIS");
311311
addMapping("shift_jisx0213", "x-SJIS_0213");
312312
addMapping("utf_16_be", "UTF-16BE");
@@ -438,10 +438,6 @@ private static void addAlias(String alias, String pythonName) {
438438
addAlias("uhc", "cp949");
439439
addAlias("950", "cp950");
440440
addAlias("ms950", "cp950");
441-
addAlias("jisx0213", "euc_jis_2004");
442-
addAlias("eucjis2004", "euc_jis_2004");
443-
addAlias("euc_jis2004", "euc_jis_2004");
444-
addAlias("eucjisx0213", "euc_jisx0213");
445441
addAlias("eucjp", "euc_jp");
446442
addAlias("ujis", "euc_jp");
447443
addAlias("u_jis", "euc_jp");

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -491,10 +491,9 @@
491491
's_jis' : 'shift_jis',
492492

493493
# shift_jis_2004 codec
494-
# GraalPy change: Java doesn't have this codec
495-
# 'shiftjis2004' : 'shift_jis_2004',
496-
# 'sjis_2004' : 'shift_jis_2004',
497-
# 's_jis_2004' : 'shift_jis_2004',
494+
'shiftjis2004' : 'shift_jis_2004',
495+
'sjis_2004' : 'shift_jis_2004',
496+
's_jis_2004' : 'shift_jis_2004',
498497

499498
# shift_jisx0213 codec
500499
'shiftjisx0213' : 'shift_jisx0213',

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

0 commit comments

Comments
 (0)