Skip to content

Commit fe64178

Browse files
authored
Merge pull request #404 from sanders41/tomli
Only include tomli if min version is < 3.12
2 parents 0804e69 + ab701d5 commit fe64178

7 files changed

+114
-23
lines changed

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ mod project_generator;
88
mod project_info;
99
mod python_files;
1010
mod rust_files;
11+
mod utils;
1112

1213
use std::fs::remove_dir_all;
1314
use std::process::exit;

src/package_version.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ impl LatestVersion for PythonPackageVersion {
100100
fn get_latest_version(&mut self) -> Result<()> {
101101
let name = self.package.to_string();
102102
let url = format!("https://pypi.org/pypi/{}/json", name);
103-
println!("{url}");
104103
let client = reqwest::blocking::Client::new();
105104
let response = client
106105
.get(url)

src/project_generator.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use crate::package_version::{
1717
use crate::project_info::{ProjectInfo, ProjectManager};
1818
use crate::python_files::generate_python_files;
1919
use crate::rust_files::{save_cargo_toml_file, save_lib_file};
20+
use crate::utils::is_python_312_or_greater;
2021

2122
fn create_directories(project_info: &ProjectInfo) -> Result<()> {
2223
let module = project_info.source_dir.replace([' ', '-'], "_");
@@ -268,7 +269,8 @@ fn save_pre_commit_file(project_info: &ProjectInfo) -> Result<()> {
268269
fn build_latest_dev_dependencies(
269270
download_latest_packages: bool,
270271
project_manager: &ProjectManager,
271-
) -> String {
272+
min_python_version: &str,
273+
) -> Result<String> {
272274
let mut version_string = String::new();
273275
let mut packages = vec![
274276
PythonPackageVersion::new(PythonPackage::MyPy),
@@ -278,11 +280,17 @@ fn build_latest_dev_dependencies(
278280
PythonPackageVersion::new(PythonPackage::Ruff),
279281
];
280282

281-
match project_manager {
282-
ProjectManager::Maturin => packages.push(PythonPackageVersion::new(PythonPackage::Maturin)),
283-
ProjectManager::Poetry => packages.push(PythonPackageVersion::new(PythonPackage::Tomli)),
284-
ProjectManager::Setuptools => (),
285-
};
283+
if !is_python_312_or_greater(min_python_version)? {
284+
match project_manager {
285+
ProjectManager::Maturin => {
286+
packages.push(PythonPackageVersion::new(PythonPackage::Maturin))
287+
}
288+
ProjectManager::Poetry => {
289+
packages.push(PythonPackageVersion::new(PythonPackage::Tomli))
290+
}
291+
ProjectManager::Setuptools => (),
292+
};
293+
}
286294

287295
if download_latest_packages {
288296
packages.par_iter_mut().for_each(|package| {
@@ -313,14 +321,14 @@ fn build_latest_dev_dependencies(
313321
}
314322

315323
if let ProjectManager::Poetry = project_manager {
316-
version_string.trim().to_string()
324+
Ok(version_string.trim().to_string())
317325
} else {
318326
version_string.push_str("-e .\n");
319-
version_string
327+
Ok(version_string)
320328
}
321329
}
322330

323-
fn create_pyproject_toml(project_info: &ProjectInfo) -> String {
331+
fn create_pyproject_toml(project_info: &ProjectInfo) -> Result<String> {
324332
let module = project_info.source_dir.replace([' ', '-'], "_");
325333
let pyupgrade_version = &project_info.min_python_version.replace(['.', '^'], "");
326334
let license_text = license_str(&project_info.license);
@@ -442,7 +450,7 @@ ignore=[
442450
"#,
443451
);
444452

445-
render!(
453+
Ok(render!(
446454
&pyproject,
447455
project_name => module.replace('_', "-"),
448456
version => project_info.version,
@@ -451,17 +459,17 @@ ignore=[
451459
creator_email => project_info.creator_email,
452460
license => license_text,
453461
min_python_version => project_info.min_python_version,
454-
dev_dependencies => build_latest_dev_dependencies(project_info.download_latest_packages, &project_info.project_manager),
462+
dev_dependencies => build_latest_dev_dependencies(project_info.download_latest_packages, &project_info.project_manager, &project_info.min_python_version)?,
455463
max_line_length => project_info.max_line_length,
456464
module => module,
457465
is_application => project_info.is_application,
458466
pyupgrade_version => pyupgrade_version,
459-
)
467+
))
460468
}
461469

462470
fn save_pyproject_toml_file(project_info: &ProjectInfo) -> Result<()> {
463471
let file_path = project_info.base_dir().join("pyproject.toml");
464-
let content = create_pyproject_toml(project_info);
472+
let content = create_pyproject_toml(project_info)?;
465473

466474
save_file_with_content(&file_path, &content)?;
467475

@@ -473,7 +481,8 @@ fn save_dev_requirements(project_info: &ProjectInfo) -> Result<()> {
473481
let content = build_latest_dev_dependencies(
474482
project_info.download_latest_packages,
475483
&project_info.project_manager,
476-
);
484+
&project_info.min_python_version,
485+
)?;
477486

478487
save_file_with_content(&file_path, &content)?;
479488

src/python_files.rs

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use anyhow::{bail, Result};
44

55
use crate::file_manager::save_file_with_content;
66
use crate::project_info::{ProjectInfo, ProjectManager};
7+
use crate::utils::is_python_312_or_greater;
78

89
fn create_dunder_main_file(module: &str) -> String {
910
format!(
@@ -200,7 +201,11 @@ fn save_version_file(project_info: &ProjectInfo) -> Result<()> {
200201
Ok(())
201202
}
202203

203-
fn create_version_test_file(module: &str, project_manager: &ProjectManager) -> String {
204+
fn create_version_test_file(
205+
module: &str,
206+
project_manager: &ProjectManager,
207+
min_python_version: &str,
208+
) -> Result<String> {
204209
let version_test: &str = match project_manager {
205210
ProjectManager::Maturin => {
206211
r#"def test_versions_match():
@@ -221,18 +226,30 @@ fn create_version_test_file(module: &str, project_manager: &ProjectManager) -> S
221226
assert VERSION == pyproject_version"#
222227
}
223228
ProjectManager::Setuptools => {
224-
return format!(
229+
return Ok(format!(
225230
r#"from {module}._version import VERSION
226231
227232
def test_versions_match():
228233
assert VERSION == "0.1.0"
229234
"#
230-
)
235+
))
231236
}
232237
};
233238

234-
format!(
235-
r#"import sys
239+
if is_python_312_or_greater(min_python_version)? {
240+
Ok(format!(
241+
r#"import tomllib
242+
from pathlib import Path
243+
244+
from {module}._version import VERSION
245+
246+
247+
{version_test}
248+
"#
249+
))
250+
} else {
251+
Ok(format!(
252+
r#"import sys
236253
from pathlib import Path
237254
238255
from {module}._version import VERSION
@@ -245,13 +262,18 @@ else:
245262
246263
{version_test}
247264
"#
248-
)
265+
))
266+
}
249267
}
250268

251269
fn save_version_test_file(project_info: &ProjectInfo) -> Result<()> {
252270
let module = project_info.source_dir.replace([' ', '-'], "_");
253271
let file_path = project_info.base_dir().join("tests/test_version.py");
254-
let content = create_version_test_file(&module, &project_info.project_manager);
272+
let content = create_version_test_file(
273+
&module,
274+
&project_info.project_manager,
275+
&project_info.min_python_version,
276+
)?;
255277
save_file_with_content(&file_path, &content)?;
256278

257279
Ok(())
@@ -483,9 +505,26 @@ mod tests {
483505
}
484506

485507
#[test]
486-
fn test_save_version_test_file_poetry() {
508+
fn test_save_version_test_file_poetry_tomli() {
509+
let mut project_info = project_info_dummy();
510+
project_info.project_manager = ProjectManager::Poetry;
511+
let base = project_info.base_dir();
512+
create_dir_all(base.join("tests")).unwrap();
513+
let expected_file = base.join("tests/test_version.py");
514+
save_version_test_file(&project_info).unwrap();
515+
516+
assert!(expected_file.is_file());
517+
518+
let content = std::fs::read_to_string(expected_file).unwrap();
519+
520+
assert_yaml_snapshot!(content);
521+
}
522+
523+
#[test]
524+
fn test_save_version_test_file_poetry_no_tomli() {
487525
let mut project_info = project_info_dummy();
488526
project_info.project_manager = ProjectManager::Poetry;
527+
project_info.min_python_version = "3.12".to_string();
489528
let base = project_info.base_dir();
490529
create_dir_all(base.join("tests")).unwrap();
491530
let expected_file = base.join("tests/test_version.py");
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/python_files.rs
3+
expression: content
4+
---
5+
"import tomllib\nfrom pathlib import Path\n\nfrom my_project._version import VERSION\n\n\ndef test_versions_match():\n pyproject = Path().absolute() / \"pyproject.toml\"\n with open(pyproject, \"rb\") as f:\n data = tomllib.load(f)\n pyproject_version = data[\"tool\"][\"poetry\"][\"version\"]\n\n assert VERSION == pyproject_version\n"

src/utils.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use anyhow::Result;
2+
3+
pub fn is_python_312_or_greater(version: &str) -> Result<bool> {
4+
let mut split_version = version.split('.');
5+
if let Some(v) = split_version.nth(1) {
6+
let min = v.parse::<i32>()?;
7+
if min >= 12 {
8+
Ok(true)
9+
} else {
10+
Ok(false)
11+
}
12+
} else {
13+
Ok(false)
14+
}
15+
}
16+
17+
#[cfg(test)]
18+
mod tests {
19+
use super::*;
20+
21+
#[test]
22+
fn test_python_312() {
23+
let result = is_python_312_or_greater("3.12").unwrap();
24+
assert!(result);
25+
}
26+
27+
#[test]
28+
fn test_python_313() {
29+
let result = is_python_312_or_greater("3.13").unwrap();
30+
assert!(result);
31+
}
32+
33+
#[test]
34+
fn test_python_311() {
35+
let result = is_python_312_or_greater("3.11").unwrap();
36+
assert!(!result);
37+
}
38+
}

0 commit comments

Comments
 (0)