Skip to content

Commit 8e10dda

Browse files
Merge pull request #287 from neutrinoceros/perf/minimize_importtime
PERF: delay most costly import statements until they are needed
2 parents 8457cd5 + 6557598 commit 8e10dda

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

src/inifix/__init__.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
1+
from __future__ import annotations
2+
13
from .io import dump
24
from .io import dumps
35
from .io import load
46
from .io import loads
57
from .validation import validate_inifile_schema
68
from .format import format_string
79

8-
from importlib.metadata import version
10+
from typing import TYPE_CHECKING
11+
12+
if TYPE_CHECKING: # pragma: no cover
13+
from typing import Any
14+
15+
16+
def __getattr__(name: str) -> Any:
17+
if name == "__version__":
18+
from importlib.metadata import version
19+
20+
return version("inifix")
21+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
22+
923

10-
__version__ = version("inifix")
11-
del version
24+
del TYPE_CHECKING

src/inifix/format.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import argparse
21
import os
32
import re
43
import sys
54
import warnings
65
from collections.abc import Iterable
7-
from concurrent.futures import ThreadPoolExecutor
86
from difflib import unified_diff
97
from functools import partial
108
from io import StringIO
11-
from tempfile import TemporaryDirectory
129
from typing import IO, Literal
1310

1411
from inifix._cli import Message, TaskResults, get_cpu_count
@@ -141,7 +138,10 @@ def iniformat(s: str, /) -> str:
141138

142139

143140
def main(argv: list[str] | None = None) -> int:
144-
parser = argparse.ArgumentParser()
141+
from argparse import ArgumentParser
142+
from concurrent.futures import ThreadPoolExecutor
143+
144+
parser = ArgumentParser()
145145
parser.add_argument("files", nargs="+")
146146
parser.add_argument(
147147
"--diff",
@@ -232,6 +232,8 @@ def _format_single_file_cli(
232232
)
233233
return TaskResults(status, messages)
234234

235+
from tempfile import TemporaryDirectory
236+
235237
with TemporaryDirectory(dir=os.path.dirname(file)) as tmpdir:
236238
tmpfile = os.path.join(tmpdir, "ini")
237239
with open(tmpfile, "wb") as bfh:

tests/test_namespace.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from importlib.metadata import version
2+
3+
import pytest
4+
5+
import inifix
6+
7+
8+
def test_dunder_version():
9+
assert inifix.__version__ == version("inifix")
10+
11+
12+
def test_unknown_member():
13+
with pytest.raises(AttributeError):
14+
inifix.unknown_member # noqa: B018

0 commit comments

Comments
 (0)