Skip to content

Commit 6cc16a9

Browse files
Raise Import Warnings (#461)
* Raise Import Warnings * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * return stacklevel=2 * fix spacing * Add more tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix types * ignore * update error message * clean up --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent b97047f commit 6cc16a9

File tree

7 files changed

+126
-73
lines changed

7 files changed

+126
-73
lines changed

atomistics/calculators/__init__.py

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
optimize_volume_with_ase,
1010
)
1111
from atomistics.calculators.hessian import evaluate_with_hessian
12+
from atomistics.shared.import_warning import raise_warning
1213

13-
__all__ = [
14+
__all__: list[str] = [
1415
"calc_molecular_dynamics_langevin_with_ase",
1516
"calc_molecular_dynamics_npt_with_ase",
1617
"calc_molecular_dynamics_thermal_expansion_with_ase",
@@ -21,6 +22,35 @@
2122
"optimize_volume_with_ase",
2223
"evaluate_with_hessian",
2324
]
25+
lammps_functions: list[str] = [
26+
"calc_molecular_dynamics_thermal_expansion_with_lammpslib",
27+
"calc_molecular_dynamics_nph_with_lammpslib",
28+
"calc_molecular_dynamics_npt_with_lammpslib",
29+
"calc_molecular_dynamics_nvt_with_lammpslib",
30+
"calc_molecular_dynamics_langevin_with_lammpslib",
31+
"calc_static_with_lammpslib",
32+
"evaluate_with_lammpslib",
33+
"evaluate_with_lammpslib_library_interface",
34+
"get_potential_dataframe",
35+
"get_potential_by_name",
36+
"optimize_positions_and_volume_with_lammpslib",
37+
"optimize_positions_with_lammpslib",
38+
]
39+
lammps_phonon_functions: list[str] = ["calc_molecular_dynamics_phonons_with_lammpslib"]
40+
quantum_espresso_function: list[str] = [
41+
"calc_static_with_qe",
42+
"evaluate_with_qe",
43+
"optimize_positions_and_volume_with_qe",
44+
]
45+
sphinx_functions: list[str] = ["evaluate_with_sphinx"]
46+
vasp_functions: list[str] = [
47+
"evaluate_with_vasp",
48+
"calc_static_with_vasp",
49+
"optimize_positions_and_volume_with_vasp",
50+
"optimize_positions_with_vasp",
51+
"optimize_cell_with_vasp",
52+
"optimize_volume_with_vasp",
53+
]
2454

2555

2656
try:
@@ -29,14 +59,11 @@
2959
evaluate_with_qe,
3060
optimize_positions_and_volume_with_qe,
3161
)
62+
except ImportError as e:
63+
raise_warning(module_list=quantum_espresso_function, import_error=e)
64+
else:
65+
__all__ += quantum_espresso_function
3266

33-
__all__ += [
34-
"calc_static_with_qe",
35-
"evaluate_with_qe",
36-
"optimize_positions_and_volume_with_qe",
37-
]
38-
except ImportError:
39-
pass
4067

4168
try:
4269
from atomistics.calculators.lammps import (
@@ -53,43 +80,31 @@
5380
optimize_positions_and_volume_with_lammpslib,
5481
optimize_positions_with_lammpslib,
5582
)
83+
except ImportError as e:
84+
raise_warning(module_list=lammps_functions, import_error=e)
85+
else:
86+
__all__ += lammps_functions
5687

57-
__all__ += [
58-
"calc_molecular_dynamics_thermal_expansion_with_lammpslib",
59-
"calc_molecular_dynamics_nph_with_lammpslib",
60-
"calc_molecular_dynamics_npt_with_lammpslib",
61-
"calc_molecular_dynamics_nvt_with_lammpslib",
62-
"calc_molecular_dynamics_langevin_with_lammpslib",
63-
"calc_static_with_lammpslib",
64-
"evaluate_with_lammpslib",
65-
"evaluate_with_lammpslib_library_interface",
66-
"get_potential_dataframe",
67-
"get_potential_by_name",
68-
"optimize_positions_and_volume_with_lammpslib",
69-
"optimize_positions_with_lammpslib",
70-
]
71-
except ImportError:
72-
pass
7388

7489
try:
7590
from atomistics.calculators.lammps.phonon import (
7691
calc_molecular_dynamics_phonons_with_lammpslib,
7792
)
93+
except ImportError as e:
94+
raise_warning(module_list=lammps_phonon_functions, import_error=e)
95+
else:
96+
__all__ += lammps_phonon_functions
7897

79-
__all__ += ["calc_molecular_dynamics_phonons_with_lammpslib"]
80-
except ImportError:
81-
pass
8298

8399
try:
84100
from atomistics.calculators.sphinxdft import (
85101
evaluate_with_sphinx,
86102
)
103+
except ImportError as e:
104+
raise_warning(module_list=sphinx_functions, import_error=e)
105+
else:
106+
__all__ += sphinx_functions
87107

88-
__all__ += [
89-
"evaluate_with_sphinx",
90-
]
91-
except ImportError:
92-
pass
93108

94109
try:
95110
from atomistics.calculators.vasp import (
@@ -100,14 +115,7 @@
100115
optimize_positions_with_vasp,
101116
optimize_volume_with_vasp,
102117
)
103-
104-
__all__ += [
105-
"evaluate_with_vasp",
106-
"calc_static_with_vasp",
107-
"optimize_positions_and_volume_with_vasp",
108-
"optimize_positions_with_vasp",
109-
"optimize_cell_with_vasp",
110-
"optimize_volume_with_vasp",
111-
]
112-
except ImportError:
113-
pass
118+
except ImportError as e:
119+
raise_warning(module_list=vasp_functions, import_error=e)
120+
else:
121+
__all__ += vasp_functions

atomistics/calculators/lammps/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,9 @@
1414
get_potential_by_name,
1515
get_potential_dataframe,
1616
)
17+
from atomistics.shared.import_warning import raise_warning
1718

18-
try:
19-
from atomistics.calculators.lammps.phonon import (
20-
calc_molecular_dynamics_phonons_with_lammpslib,
21-
)
22-
23-
__all__ = [
24-
"calc_molecular_dynamics_phonons_with_lammpslib",
25-
]
26-
except ImportError:
27-
__all__ = []
28-
29-
30-
__all__ += [
19+
__all__: list[str] = [
3120
"calc_molecular_dynamics_thermal_expansion_with_lammpslib",
3221
"calc_molecular_dynamics_nph_with_lammpslib",
3322
"calc_molecular_dynamics_npt_with_lammpslib",
@@ -41,3 +30,14 @@
4130
"get_potential_dataframe",
4231
"get_potential_by_name",
4332
]
33+
lammps_phonon_functions: list[str] = ["calc_molecular_dynamics_phonons_with_lammpslib"]
34+
35+
36+
try:
37+
from atomistics.calculators.lammps.phonon import (
38+
calc_molecular_dynamics_phonons_with_lammpslib,
39+
)
40+
except ImportError as e:
41+
raise_warning(module_list=lammps_phonon_functions, import_error=e)
42+
else:
43+
__all__ += lammps_phonon_functions

atomistics/referencedata/__init__.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
from atomistics.referencedata.wikipedia import (
22
get_elastic_properties as get_elastic_properties_from_wikipedia,
33
)
4+
from atomistics.shared.import_warning import raise_warning
5+
6+
__all__: list[str] = ["get_elastic_properties_from_wikipedia"]
7+
data_functions: list[str] = [
8+
"get_chemical_information_from_mendeleev",
9+
"get_chemical_information_from_wolframalpha",
10+
]
11+
412

513
try:
614
from atomistics.referencedata.mendeleev import (
@@ -9,13 +17,7 @@
917
from atomistics.referencedata.wolframalpha import (
1018
get_chemical_information as get_chemical_information_from_wolframalpha,
1119
)
12-
except ImportError:
13-
__all__ = []
20+
except ImportError as e:
21+
raise_warning(module_list=data_functions, import_error=e)
1422
else:
15-
__all__ = [
16-
"get_chemical_information_from_mendeleev",
17-
"get_chemical_information_from_wolframalpha",
18-
]
19-
20-
21-
__all__ += ["get_elastic_properties_from_wikipedia"]
23+
__all__ += data_functions

atomistics/shared/import_warning.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import warnings
2+
3+
4+
def raise_warning(module_list, import_error):
5+
if len(module_list) == 1:
6+
warnings.warn(
7+
message=module_list[0]
8+
+ "() is not available as the import of the"
9+
+ import_error.msg[2:]
10+
+ " failed.",
11+
stacklevel=2,
12+
)
13+
else:
14+
error_msg = "(), ".join(module_list[:-1]) + "() and " + module_list[-1] + "()"
15+
warnings.warn(
16+
message=error_msg
17+
+ " are not available as the import of the"
18+
+ import_error.msg[2:]
19+
+ " failed.",
20+
stacklevel=2,
21+
)

atomistics/workflows/__init__.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from atomistics.shared.import_warning import raise_warning
12
from atomistics.workflows.elastic.workflow import ElasticMatrixWorkflow
23
from atomistics.workflows.evcurve.workflow import EnergyVolumeCurveWorkflow
34
from atomistics.workflows.langevin import LangevinWorkflow
@@ -11,7 +12,7 @@
1112
optimize_volume,
1213
)
1314

14-
__all__ = [
15+
__all__: list[str] = [
1516
"ElasticMatrixWorkflow",
1617
"EnergyVolumeCurveWorkflow",
1718
"LangevinWorkflow",
@@ -21,15 +22,16 @@
2122
"optimize_positions_and_volume",
2223
"optimize_volume",
2324
]
25+
phonopy_workflows: list[str] = [
26+
"PhonopyWorkflow",
27+
"QuasiHarmonicWorkflow",
28+
]
2429

2530

2631
try: # in case phonopy is not installed
2732
from atomistics.workflows.phonons.workflow import PhonopyWorkflow
2833
from atomistics.workflows.quasiharmonic import QuasiHarmonicWorkflow
29-
30-
__all__ += [
31-
"PhonopyWorkflow",
32-
"QuasiHarmonicWorkflow",
33-
]
34-
except ImportError:
35-
pass
34+
except ImportError as e:
35+
raise_warning(module_list=phonopy_workflows, import_error=e)
36+
else:
37+
__all__ += phonopy_workflows

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ ignore = [
116116
"B026",
117117
# ignore line-length violations
118118
"E501",
119+
# ignore unused imports in init files
120+
"F401",
121+
# ignore invalid format for __all__
122+
"PLE0605",
119123
# Too many arguments in function definition
120124
"PLR0913",
121125
# Magic value used in comparison

tests/test_import_warning.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from unittest import TestCase
2+
from atomistics.shared.import_warning import raise_warning
3+
4+
5+
class TestImportWarning(TestCase):
6+
def test_import_warning(self):
7+
with self.assertWarns(Warning):
8+
try:
9+
import this_package_does_not_exist
10+
except ImportError as e:
11+
raise_warning(module_list=["a"], import_error=e)
12+
with self.assertWarns(Warning):
13+
try:
14+
import this_package_does_not_exist
15+
except ImportError as e:
16+
raise_warning(module_list=["a", "b", "c"], import_error=e)

0 commit comments

Comments
 (0)