Skip to content

Commit 020a503

Browse files
committed
fix
1 parent a0c995b commit 020a503

4 files changed

Lines changed: 45 additions & 0 deletions

File tree

msra_codegen/config.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ line_length = 200
119119
select = ["E", "F", "I", "UP", "B", "SIM"]
120120
ignore = ["RUF001", "RUF002", "RUF003"]
121121

122+
[mypy]
123+
ignore_missing_imports = true
124+
122125
[[validation.checks]]
123126
name = "ruff"
124127
argv = ["{python_executable}", "-m", "ruff", "check"]

msra_codegen/package_metadata.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def render_pyproject(project: dict[str, Any], package_name: str) -> str:
3636
"dependencies_block": render_toml_string_list("dependencies", runtime_dependencies),
3737
"package_name": package_name,
3838
"autotest_start_class": f"{package_name}.{client_class_name}",
39+
"mypy_block": render_mypy_block(),
3940
"ruff_block": render_ruff_block(),
4041
},
4142
)
@@ -91,6 +92,44 @@ def render_ruff_block() -> str:
9192
)
9293

9394

95+
def render_mypy_block() -> str:
96+
mypy_config = config_section("mypy")
97+
if not isinstance(mypy_config, dict):
98+
raise RuntimeError("mypy must be a table.")
99+
100+
items: list[str] = []
101+
for key, value in mypy_config.items():
102+
if isinstance(value, bool):
103+
rendered_value = "true" if value else "false"
104+
elif isinstance(value, (int, float)) and not isinstance(value, bool):
105+
rendered_value = str(value)
106+
elif isinstance(value, str):
107+
rendered_value = json.dumps(value)
108+
elif isinstance(value, list):
109+
rendered_items: list[str] = []
110+
for item in value:
111+
if isinstance(item, bool):
112+
rendered_items.append("true" if item else "false")
113+
elif isinstance(item, (int, float)) and not isinstance(item, bool):
114+
rendered_items.append(str(item))
115+
elif isinstance(item, str):
116+
rendered_items.append(json.dumps(item))
117+
else:
118+
raise RuntimeError(f"mypy.{key} contains an unsupported value type.")
119+
rendered_value = "["
120+
if rendered_items:
121+
rendered_value += ", ".join(rendered_items)
122+
rendered_value += "]"
123+
else:
124+
raise RuntimeError(f"mypy.{key} contains an unsupported value type.")
125+
items.append(f"{key} = {rendered_value}")
126+
127+
if not items:
128+
raise RuntimeError("mypy must not be empty.")
129+
130+
return "\n".join(["[tool.mypy]", *items])
131+
132+
94133
@lru_cache(maxsize=1)
95134
def latest_supported_python_minor() -> int:
96135
families = load_python_release_families()

msra_codegen/templates/pyproject.toml.tpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ license = "{{ license }}"
1313
{{ keywords_block }}
1414
{{ classifiers_block }}
1515
{{ dependencies_block }}
16+
{{ mypy_block }}
1617
{{ ruff_block }}
1718

1819
[tool.setuptools]

tests/codegen.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,8 @@ test("python codegen generates both bundled msra documents without failing", ()
716716
assert.match(pyprojectText, /\[tool\.ruff\.lint\]/);
717717
assert.match(pyprojectText, /select = \[/);
718718
assert.match(pyprojectText, /ignore = \[/);
719+
assert.match(pyprojectText, /\[tool\.mypy\]/);
720+
assert.match(pyprojectText, /ignore_missing_imports = true/);
719721
assert.match(pyprojectText, /Programming Language :: Python :: 3/);
720722
assert.match(pyprojectText, /Programming Language :: Python :: 3\.10/);
721723
assert.match(pyprojectText, /Programming Language :: Python :: 3\.13/);

0 commit comments

Comments
 (0)