Skip to content

Commit 1c4206c

Browse files
committed
Fix invalid module name with dash
1 parent fe133be commit 1c4206c

File tree

5 files changed

+61
-46
lines changed

5 files changed

+61
-46
lines changed

src/file_manager.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ pub fn save_file_with_content(file_path: &PathBuf, file_content: &str) -> Result
1414
}
1515

1616
pub fn save_empty_src_file(project_info: &ProjectInfo, file_name: &str) -> Result<()> {
17+
let module = project_info.source_dir.replace('-', "_");
1718
let file_path = project_info
1819
.base_dir()
19-
.join(format!("{}/{}", &project_info.source_dir, file_name));
20+
.join(format!("{}/{}", &module, file_name));
2021
File::create(file_path)?;
2122

2223
Ok(())

src/project_generator.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ use crate::python_files::generate_python_files;
1818
use crate::rust_files::{save_cargo_toml_file, save_lib_file};
1919

2020
fn create_directories(project_info: &ProjectInfo) -> Result<()> {
21+
let module = project_info.source_dir.replace('-', "_");
2122
let base = project_info.base_dir();
22-
let src = base.join(&project_info.source_dir);
23+
let src = base.join(&module);
2324
create_dir_all(src)?;
2425

2526
let github_dir = base.join(".github/workflows");
@@ -330,6 +331,7 @@ fn build_latest_dev_dependencies(
330331
}
331332

332333
fn create_pyproject_toml(project_info: &ProjectInfo) -> String {
334+
let module = project_info.source_dir.replace('-', "_");
333335
let pyupgrade_version = &project_info.min_python_version.replace(['.', '^'], "");
334336
let license_text = license_str(&project_info.license);
335337
let mut pyproject = match &project_info.project_manager {
@@ -347,7 +349,7 @@ license = "{{ license }}"
347349
readme = "README.md"
348350
349351
[tool.maturin]
350-
module-name = "{{ source_dir }}._{{ source_dir }}"
352+
module-name = "{{ module }}._{{ module }}"
351353
binding = "pyo3"
352354
features = ["pyo3/extension-module"]
353355
@@ -392,14 +394,14 @@ requires-python = ">={{ min_python_version }}"
392394
dynamic = ["version", "readme"]
393395
394396
[tool.setuptools.dynamic]
395-
version = {attr = "{{ source_dir }}.__version__"}
397+
version = {attr = "{{ module }}.__version__"}
396398
readme = {file = ["README.md"]}
397399
398400
[tool.setuptools.packages.find]
399-
include = ["{{ source_dir }}*"]
401+
include = ["{{ module }}*"]
400402
401403
[tool.setuptools.package-data]
402-
{{ source_dir }} = ["py.typed"]
404+
{{ module }} = ["py.typed"]
403405
404406
"#
405407
.to_string(),
@@ -416,7 +418,7 @@ disallow_untyped_defs = false
416418
417419
[tool.pytest.ini_options]
418420
minversion = "6.0"
419-
addopts = "--cov={{ source_dir }} --cov-report term-missing --no-cov-on-fail"
421+
addopts = "--cov={{ module }} --cov-report term-missing --no-cov-on-fail"
420422
421423
[tool.coverage.report]
422424
exclude_lines = ["if __name__ == .__main__.:", "pragma: no cover"]
@@ -450,7 +452,7 @@ fix = true
450452

451453
render!(
452454
&pyproject,
453-
project_name => project_info.source_dir.replace('_', "-"),
455+
project_name => module.replace('_', "-"),
454456
version => project_info.version,
455457
project_description => project_info.project_description,
456458
creator => project_info.creator,
@@ -459,7 +461,7 @@ fix = true
459461
min_python_version => project_info.min_python_version,
460462
dev_dependencies => build_latest_dev_dependencies(project_info.is_application, project_info.download_latest_packages, &project_info.project_manager, &project_info.min_python_version),
461463
max_line_length => project_info.max_line_length,
462-
source_dir => project_info.source_dir,
464+
module => module,
463465
is_application => project_info.is_application,
464466
pyupgrade_version => pyupgrade_version,
465467
)
@@ -488,7 +490,7 @@ fn save_dev_requirements(project_info: &ProjectInfo) -> Result<()> {
488490
Ok(())
489491
}
490492

491-
fn create_pyo3_justfile(source_dir: &str) -> String {
493+
fn create_pyo3_justfile(module: &str) -> String {
492494
format!(
493495
r#"@develop:
494496
maturin develop
@@ -531,13 +533,14 @@ fn create_pyo3_justfile(source_dir: &str) -> String {
531533
@test:
532534
pytest
533535
"#,
534-
source_dir
536+
module
535537
)
536538
}
537539

538540
fn save_pyo3_justfile(project_info: &ProjectInfo) -> Result<()> {
541+
let module = project_info.source_dir.replace('-', "_");
539542
let file_path = project_info.base_dir().join("justfile");
540-
let content = create_pyo3_justfile(&project_info.source_dir);
543+
let content = create_pyo3_justfile(&module);
541544

542545
save_file_with_content(&file_path, &content)?;
543546

src/project_info.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,10 @@ pub fn get_project_info(use_defaults: bool) -> Result<ProjectInfo> {
322322
bail!(format!("The {project_slug} directory already exists"));
323323
}
324324

325-
let source_dir_default = project_name.replace(' ', "_").to_lowercase();
325+
let source_dir_default = project_name
326+
.replace(' ', "_")
327+
.replace('-', "_")
328+
.to_lowercase();
326329
let source_dir = if use_defaults {
327330
source_dir_default
328331
} else {

src/python_files.rs

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use anyhow::{bail, Result};
55
use crate::file_manager::save_file_with_content;
66
use crate::project_info::{ProjectInfo, ProjectManager};
77

8-
fn create_dunder_main_file(source_dir: &str) -> String {
8+
fn create_dunder_main_file(module: &str) -> String {
99
format!(
10-
r#"from {source_dir}.main import main # pragma: no cover
10+
r#"from {module}.main import main # pragma: no cover
1111
1212
if __name__ == "__main__":
1313
raise SystemExit(main())
@@ -29,23 +29,24 @@ if __name__ == "__main__":
2929
}
3030

3131
fn save_main_files(project_info: &ProjectInfo) -> Result<()> {
32-
let src = project_info.base_dir().join(&project_info.source_dir);
32+
let module = project_info.source_dir.replace('-', "_");
33+
let src = project_info.base_dir().join(&module);
3334
let main = src.join("main.py");
3435
let main_content = create_main_file();
3536

3637
save_file_with_content(&main, &main_content)?;
3738

3839
let main_dunder = src.join("__main__.py");
39-
let main_dunder_content = create_dunder_main_file(&project_info.source_dir);
40+
let main_dunder_content = create_dunder_main_file(&module);
4041

4142
save_file_with_content(&main_dunder, &main_dunder_content)?;
4243

4344
Ok(())
4445
}
4546

46-
fn create_main_test_file(source_dir: &str) -> String {
47+
fn create_main_test_file(module: &str) -> String {
4748
format!(
48-
r#"from {source_dir}.main import main
49+
r#"from {module}.main import main
4950
5051
5152
def test_main():
@@ -55,17 +56,18 @@ def test_main():
5556
}
5657

5758
fn save_main_test_file(project_info: &ProjectInfo) -> Result<()> {
59+
let module = project_info.source_dir.replace('-', "_");
5860
let file_path = project_info.base_dir().join("tests/test_main.py");
59-
let content = create_main_test_file(&project_info.source_dir);
61+
let content = create_main_test_file(&module);
6062

6163
save_file_with_content(&file_path, &content)?;
6264

6365
Ok(())
6466
}
6567

66-
fn create_pyo3_test_file(source_dir: &str) -> String {
68+
fn create_pyo3_test_file(module: &str) -> String {
6769
format!(
68-
r#"from {source_dir} import sum_as_string
70+
r#"from {module} import sum_as_string
6971
7072
7173
def test_sum_as_string():
@@ -75,25 +77,26 @@ def test_sum_as_string():
7577
}
7678

7779
fn save_pyo3_test_file(project_info: &ProjectInfo) -> Result<()> {
80+
let module = project_info.source_dir.replace('-', "_");
7881
let file_path = project_info
7982
.base_dir()
80-
.join(format!("tests/test_{}.py", &project_info.source_dir));
81-
let content = create_pyo3_test_file(&project_info.source_dir);
83+
.join(format!("tests/test_{}.py", &module));
84+
let content = create_pyo3_test_file(&module);
8285

8386
save_file_with_content(&file_path, &content)?;
8487

8588
Ok(())
8689
}
8790

88-
fn create_project_init_file(source_dir: &str, project_manager: &ProjectManager) -> String {
91+
fn create_project_init_file(module: &str, project_manager: &ProjectManager) -> String {
8992
match project_manager {
9093
ProjectManager::Maturin => {
9194
let v_ascii: u8 = 118;
92-
if let Some(first_char) = source_dir.chars().next() {
95+
if let Some(first_char) = module.chars().next() {
9396
if (first_char as u8) < v_ascii {
9497
format!(
95-
r#"from {source_dir}._{source_dir} import sum_as_string
96-
from {source_dir}._version import VERSION
98+
r#"from {module}._{module} import sum_as_string
99+
from {module}._version import VERSION
97100
98101
__version__ = VERSION
99102
@@ -103,8 +106,8 @@ __all__ = ["sum_as_string"]
103106
)
104107
} else {
105108
format!(
106-
r#"from {source_dir}._version import VERSION
107-
from {source_dir}._{source_dir} import sum_as_string
109+
r#"from {module}._version import VERSION
110+
from {module}._{module} import sum_as_string
108111
109112
__version__ = VERSION
110113
@@ -115,8 +118,8 @@ __all__ = ["sum_as_string"]
115118
}
116119
} else {
117120
format!(
118-
r#"from {source_dir}._{source_dir} import sum_as_string
119-
r#"from {source_dir}._version import VERSION
121+
r#"from {module}._{module} import sum_as_string
122+
r#"from {module}._version import VERSION
120123
121124
__version__ = VERSION
122125
@@ -128,7 +131,7 @@ __all__ = ["sum_as_string"]
128131
}
129132
_ => {
130133
format!(
131-
r#"from {source_dir}._version import VERSION
134+
r#"from {module}._version import VERSION
132135
133136
__version__ = VERSION
134137
"#
@@ -145,10 +148,11 @@ fn save_test_init_file(project_info: &ProjectInfo) -> Result<()> {
145148
}
146149

147150
fn save_project_init_file(project_info: &ProjectInfo) -> Result<()> {
151+
let module = project_info.source_dir.replace('-', "_");
148152
let file_path = project_info
149153
.base_dir()
150-
.join(format!("{}/__init__.py", &project_info.source_dir));
151-
let content = create_project_init_file(&project_info.source_dir, &project_info.project_manager);
154+
.join(format!("{}/__init__.py", &module));
155+
let content = create_project_init_file(&module, &project_info.project_manager);
152156

153157
save_file_with_content(&file_path, &content)?;
154158

@@ -164,10 +168,10 @@ def sum_as_string(a: int, b: int) -> str: ...
164168
}
165169

166170
pub fn save_pyi_file(project_info: &ProjectInfo) -> Result<()> {
167-
let file_path = project_info.base_dir().join(format!(
168-
"{}/_{}.pyi",
169-
&project_info.source_dir, &project_info.source_dir
170-
));
171+
let module = project_info.source_dir.replace('-', "_");
172+
let file_path = project_info
173+
.base_dir()
174+
.join(format!("{}/_{}.pyi", &module, &module));
171175
let content = create_pyi_file();
172176

173177
save_file_with_content(&file_path, &content)?;
@@ -180,17 +184,18 @@ fn create_version_file(version: &str) -> String {
180184
}
181185

182186
fn save_version_file(project_info: &ProjectInfo) -> Result<()> {
187+
let module = project_info.source_dir.replace('-', "_");
183188
let file_path = project_info
184189
.base_dir()
185-
.join(format!("{}/_version.py", &project_info.source_dir));
190+
.join(format!("{}/_version.py", &module));
186191
let content = create_version_file(&project_info.version);
187192

188193
save_file_with_content(&file_path, &content)?;
189194

190195
Ok(())
191196
}
192197

193-
fn create_version_test_file(source_dir: &str, project_manager: &ProjectManager) -> String {
198+
fn create_version_test_file(module: &str, project_manager: &ProjectManager) -> String {
194199
let version_test: &str = match project_manager {
195200
ProjectManager::Maturin => {
196201
r#"def test_versions_match():
@@ -212,7 +217,7 @@ fn create_version_test_file(source_dir: &str, project_manager: &ProjectManager)
212217
}
213218
ProjectManager::Setuptools => {
214219
return format!(
215-
r#"from {source_dir}._version import VERSION
220+
r#"from {module}._version import VERSION
216221
217222
def test_versions_match():
218223
assert VERSION == "0.1.0"
@@ -225,7 +230,7 @@ def test_versions_match():
225230
r#"import sys
226231
from pathlib import Path
227232
228-
from {source_dir}._version import VERSION
233+
from {module}._version import VERSION
229234
230235
if sys.version_info < (3, 11):
231236
import tomli as tomllib
@@ -239,8 +244,9 @@ else:
239244
}
240245

241246
fn save_version_test_file(project_info: &ProjectInfo) -> Result<()> {
247+
let module = project_info.source_dir.replace('-', "_");
242248
let file_path = project_info.base_dir().join("tests/test_version.py");
243-
let content = create_version_test_file(&project_info.source_dir, &project_info.project_manager);
249+
let content = create_version_test_file(&module, &project_info.project_manager);
244250
save_file_with_content(&file_path, &content)?;
245251

246252
Ok(())

src/rust_files.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ fn create_cargo_toml_file(
5858
) -> String {
5959
let versions = build_latest_dependencies(min_python_version, download_latest_packages);
6060
let license = license_str(license_type);
61+
let name = source_dir.replace('-', "_");
6162

6263
format!(
6364
r#"[package]
@@ -69,7 +70,7 @@ license = "{license}"
6970
readme = "README.md"
7071
7172
[lib]
72-
name = "_{source_dir}"
73+
name = "_{name}"
7374
crate-type = ["cdylib"]
7475
7576
[dependencies]
@@ -95,6 +96,7 @@ pub fn save_cargo_toml_file(project_info: &ProjectInfo) -> Result<()> {
9596
}
9697

9798
fn create_lib_file(source_dir: &str) -> String {
99+
let module = source_dir.replace('-', "_");
98100
format!(
99101
r#"use pyo3::prelude::*;
100102
@@ -104,7 +106,7 @@ fn sum_as_string(a: usize, b: usize) -> PyResult<String> {{
104106
}}
105107
106108
#[pymodule]
107-
fn _{source_dir}(_py: Python, m: &PyModule) -> PyResult<()> {{
109+
fn _{module}(_py: Python, m: &PyModule) -> PyResult<()> {{
108110
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
109111
Ok(())
110112
}}

0 commit comments

Comments
 (0)