Skip to content

Commit a2396bd

Browse files
committed
Add mypy typings to project compatible with python 3.10
1 parent e84a0e6 commit a2396bd

File tree

7 files changed

+82
-41
lines changed

7 files changed

+82
-41
lines changed

make_wheels.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import os
22
import hashlib
33
import urllib.request
4+
import urllib.error
5+
from typing import Dict, List, Any
46
import libarchive
57
from email.message import EmailMessage
68
from wheel.wheelfile import WheelFile
@@ -48,16 +50,16 @@
4850
}
4951

5052

51-
class ReproducibleWheelFile(WheelFile):
52-
def writestr(self, zinfo, *args, **kwargs):
53+
class ReproducibleWheelFile(WheelFile): # type: ignore[no-any-unimported]
54+
def writestr(self, zinfo: ZipInfo, *args: Any, **kwargs: Any) -> None:
5355
if not isinstance(zinfo, ZipInfo):
5456
raise ValueError("ZipInfo required")
5557
zinfo.date_time = (1980, 1, 1, 0, 0, 0)
5658
zinfo.create_system = 3
5759
super().writestr(zinfo, *args, **kwargs)
5860

5961

60-
def make_message(headers, payload=None):
62+
def make_message(headers: Dict[str, str | List[str]], payload: str | None =None) -> EmailMessage:
6163
msg = EmailMessage()
6264
for name, value in headers.items():
6365
if isinstance(value, list):
@@ -69,8 +71,9 @@ def make_message(headers, payload=None):
6971
msg.set_payload(payload)
7072
return msg
7173

74+
WheelContents = Dict[ZipInfo | str, bytes | EmailMessage]
7275

73-
def write_wheel_file(filename, contents):
76+
def write_wheel_file(filename: str, contents: WheelContents) -> str:
7477
with ReproducibleWheelFile(filename, 'w') as wheel:
7578
for member_info, member_source in contents.items():
7679
if not isinstance(member_info, ZipInfo):
@@ -82,15 +85,18 @@ def write_wheel_file(filename, contents):
8285
return filename
8386

8487

85-
def write_wheel(out_dir, *, name, version, tag, metadata, description, contents, entry_points):
88+
def write_wheel(out_dir: str, *, name: str, version: str, tag: str, metadata: Dict[str, str | List[str]], description: str, contents: WheelContents, entry_points: Dict[str, str]) -> str:
8689
name_snake = name.replace('-', '_')
8790
wheel_name = f'{name_snake}-{version}-{tag}.whl'
8891
dist_info = f'{name_snake}-{version}.dist-info'
8992
if entry_points:
90-
contents[f'{dist_info}/entry_points.txt'] = (cleandoc("""
93+
entry_points_entries = '\n'.join([f'{k} = {v}' for k, v in entry_points.items()] if entry_points else [])
94+
entry_points_file_contents = cleandoc("""
9195
[console_scripts]
9296
{entry_points}
93-
""").format(entry_points='\n'.join([f'{k} = {v}' for k, v in entry_points.items()] if entry_points else []))).encode('ascii'),
97+
""").format(entry_points=entry_points_entries)
98+
contents[f'{dist_info}/entry_points.txt'] = entry_points_file_contents.encode('ascii')
99+
94100
return write_wheel_file(os.path.join(out_dir, wheel_name), {
95101
**contents,
96102
f'{dist_info}/METADATA': make_message({
@@ -108,12 +114,12 @@ def write_wheel(out_dir, *, name, version, tag, metadata, description, contents,
108114
})
109115

110116

111-
def write_nodejs_wheel(out_dir, *, node_version, version, platform, archive):
112-
contents = {}
113-
entry_points = {}
114-
init_imports = []
117+
def write_nodejs_wheel(out_dir: str, *, node_version: str, version: str, platform: str, archive_contents: bytes) -> str:
118+
contents: WheelContents = {}
119+
entry_points: Dict[str, str] = {}
120+
init_imports: List[str] = []
115121

116-
with libarchive.memory_reader(archive) as archive:
122+
with libarchive.memory_reader(archive_contents) as archive:
117123
for entry in archive:
118124
entry_name = '/'.join(entry.name.split('/')[1:])
119125
if entry.isdir or not entry_name:
@@ -286,7 +292,7 @@ def main() -> None:
286292
)
287293

288294

289-
def make_nodejs_version(node_version, suffix=''):
295+
def make_nodejs_version(node_version: str, suffix: str='') -> None:
290296
wheel_version = f'{node_version}{suffix}'
291297
print('--')
292298
print('Making Node.js Wheels for version', node_version)
@@ -312,12 +318,12 @@ def make_nodejs_version(node_version, suffix=''):
312318
node_version=node_version,
313319
version=wheel_version,
314320
platform=python_platform,
315-
archive=node_archive)
321+
archive_contents=node_archive)
316322
with open(wheel_path, 'rb') as wheel:
317323
print(f' {wheel_path}')
318324
print(f' {hashlib.sha256(wheel.read()).hexdigest()}')
319325

320-
def main():
326+
def main() -> None:
321327
for node_version in BUILD_VERSIONS:
322328
make_nodejs_version(node_version, suffix=BUILD_SUFFIX)
323329

mypy.ini

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[mypy]
2+
3+
files = **/*.py
4+
5+
exclude = (?x)(
6+
venv
7+
)
8+
9+
check_untyped_defs = True
10+
disallow_untyped_defs = True
11+
disallow_incomplete_defs = True
12+
disallow_untyped_decorators = True
13+
disallow_any_unimported = True
14+
warn_return_any = True
15+
warn_unused_ignores = True
16+
show_error_codes = True
17+
enable_error_code = ignore-without-code
18+
follow_imports = normal
19+
20+
[mypy-libarchive]
21+
ignore_missing_imports = True
22+
23+
[mypy-wheel.*]
24+
ignore_missing_imports = True
25+
26+
[mypy-nodejs]
27+
ignore_missing_imports = True

nodejs-cmd/nodejs_cmd.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from nodejs import node, npm, npx
22

3-
def node_main():
3+
def node_main() -> None:
44
node.main()
55

6-
def npm_main():
6+
def npm_main() -> None:
77
npm.main()
88

9-
def npx_main():
9+
def npx_main() -> None:
1010
npx.main()

requirements.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
wheel
22
twine
33
libarchive-c
4-
pytest
4+
pytest
5+
typing-extensions
6+
mypy
7+
types-setuptools

tests/test_comand_line.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,63 @@
11
"Test nodejs command line"
22

33
import os, sys, subprocess
4+
import pathlib
5+
from pytest import CaptureFixture
46

57

68
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
79

810

9-
def test_runs():
11+
def test_runs() -> None:
1012
assert subprocess.call([sys.executable, "-m", "nodejs", "--version"]) == 0
1113

1214

13-
def test_version(capfd):
15+
def test_version(capfd: CaptureFixture) -> None:
1416
subprocess.call([sys.executable, "-m", "nodejs", "--version"])
1517
out, err = capfd.readouterr()
1618
assert out.startswith('v')
1719

1820

19-
def test_eval(capfd):
21+
def test_eval(capfd: CaptureFixture) -> None:
2022
subprocess.call([sys.executable, "-m", "nodejs", "--eval", "console.log('hello')"])
2123
out, err = capfd.readouterr()
2224
assert out.strip() == 'hello'
2325

2426

25-
def test_eval_error(capfd):
27+
def test_eval_error(capfd: CaptureFixture) -> None:
2628
subprocess.call([sys.executable, "-m", "nodejs", "--eval", "console.error('error')"])
2729
out, err = capfd.readouterr()
2830
assert err.strip() == 'error'
2931

3032

31-
def test_eval_error_exit():
33+
def test_eval_error_exit() -> None:
3234
ret = subprocess.call([sys.executable, "-m", "nodejs", "--eval", "process.exit(1)"])
3335
assert ret == 1
3436

3537

36-
def test_script(capfd):
38+
def test_script(capfd: CaptureFixture) -> None:
3739
subprocess.call([sys.executable, "-m", "nodejs", os.path.join(THIS_DIR, "test_node", "test_script.js")])
3840
out, err = capfd.readouterr()
3941
assert out.strip() == 'hello'
4042

4143

42-
def test_args(capfd):
44+
def test_args(capfd: CaptureFixture) -> None:
4345
subprocess.call([sys.executable, "-m", "nodejs", os.path.join(THIS_DIR, "test_node", "test_args.js"), "hello"])
4446
out, err = capfd.readouterr()
4547
assert out.strip() == 'hello'
4648

4749

48-
def test_npm_runs():
50+
def test_npm_runs() -> None:
4951
assert subprocess.call([sys.executable, "-m", "nodejs.npm", "--version"]) == 0
5052

5153

52-
def test_npm_version(capfd):
54+
def test_npm_version(capfd: CaptureFixture) -> None:
5355
subprocess.call([sys.executable, "-m", "nodejs.npm", "--version"])
5456
out, err = capfd.readouterr()
5557
assert isinstance(out, str)
5658

5759

58-
def test_install_package(tmp_path, capfd):
60+
def test_install_package(tmp_path: pathlib.Path, capfd: CaptureFixture) -> None:
5961
os.chdir(tmp_path)
6062
subprocess.call([sys.executable, "-m", "nodejs.npm", "init", "-y"])
6163
assert (tmp_path / 'package.json').exists()

tests/test_node.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,58 @@
11
"Test nodejs.node"
22

33
import os
4+
from pytest import CaptureFixture
45

56

67
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
78

89

9-
def test_package_installed():
10+
def test_package_installed() -> None:
1011
import nodejs
1112
assert nodejs.__version__ is not None
1213

1314

14-
def test_runs():
15+
def test_runs() -> None:
1516
from nodejs import node
1617
assert node.call(['--version']) is 0
1718

1819

19-
def test_version(capfd):
20+
def test_version(capfd: CaptureFixture) -> None:
2021
from nodejs import node, node_version
2122
node.call(['--version'])
2223
out, err = capfd.readouterr()
2324
assert out.startswith('v')
2425
assert out.strip() == f'v{node_version}'
2526

2627

27-
def test_eval(capfd):
28+
def test_eval(capfd: CaptureFixture) -> None:
2829
from nodejs import node
2930
node.call(['--eval', 'console.log("hello")'])
3031
out, err = capfd.readouterr()
3132
assert out.strip() == 'hello'
3233

3334

34-
def test_eval_error(capfd):
35+
def test_eval_error(capfd: CaptureFixture) -> None:
3536
from nodejs import node
3637
node.call(['--eval', 'console.error("error")'])
3738
out, err = capfd.readouterr()
3839
assert err.strip() == 'error'
3940

4041

41-
def test_eval_error_exit():
42+
def test_eval_error_exit() -> None:
4243
from nodejs import node
4344
ret = node.call(['--eval', 'process.exit(1)'])
4445
assert ret == 1
4546

4647

47-
def test_script(capfd):
48+
def test_script(capfd: CaptureFixture) -> None:
4849
from nodejs import node
4950
node.call([os.path.join(THIS_DIR, 'test_node', 'test_script.js')])
5051
out, err = capfd.readouterr()
5152
assert out.strip() == 'hello'
5253

5354

54-
def test_args(capfd):
55+
def test_args(capfd: CaptureFixture) -> None:
5556
from nodejs import node
5657
node.call([os.path.join(THIS_DIR, 'test_node', 'test_args.js'), 'hello'])
5758
out, err = capfd.readouterr()

tests/test_npm.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
"Test nodejs.npm"
22

33
import os
4+
import pathlib
5+
from pytest import CaptureFixture
46

57

6-
def test_runs():
8+
def test_runs() -> None:
79
from nodejs import npm
810
assert npm.call(['--version']) is 0
911

1012

11-
def test_version(capfd):
13+
def test_version(capfd: CaptureFixture) -> None:
1214
from nodejs import npm
1315
npm.call(['--version'])
1416
out, err = capfd.readouterr()
1517
assert isinstance(out, str)
1618

1719

18-
def test_install_package(tmp_path, capfd):
20+
def test_install_package(tmp_path: pathlib.Path, capfd: CaptureFixture) -> None:
1921
from nodejs import npm, node
20-
import json
22+
2123
os.chdir(tmp_path)
2224
npm.call(['init', '-y'])
2325
assert (tmp_path / 'package.json').exists()

0 commit comments

Comments
 (0)