Skip to content

Commit ae83aaa

Browse files
authored
Merge pull request #140 from PythonNest/fix/project-local-cli-settings
Fix project-local CLI settings
2 parents 0425420 + e617521 commit ae83aaa

6 files changed

Lines changed: 56 additions & 9 deletions

File tree

‎nest/cli/src/generate/generate_service.py‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ def __init__(self):
1515
@staticmethod
1616
def get_metadata():
1717
config = {"db_type": None, "is_async": False, "is_cli": False}
18-
setting_path = Path(__file__).parent.parent.parent.parent / "settings.yaml"
19-
if setting_path.exists():
20-
with open(setting_path, "r") as file:
21-
file = yaml.load(file, Loader=yaml.FullLoader)
22-
config = file["config"]
18+
# Metadata belongs to the generated project, not the installed package.
19+
# Search upward so commands also work from a project's src/ directory.
20+
for directory in (Path.cwd(), *Path.cwd().parents):
21+
setting_path = directory / "settings.yaml"
22+
if setting_path.is_file():
23+
with setting_path.open("r") as file:
24+
settings = yaml.safe_load(file) or {}
25+
config.update(settings.get("config") or {})
26+
break
2327
db_type = config["db_type"]
2428
is_async = config["is_async"]
2529
is_cli = config["is_cli"] if "is_cli" in config else False

‎nest/cli/templates/blank_template.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ def generate_module(self, module_name: str, path: str = None):
118118
self.create_module(module_name, src_path)
119119

120120
def generate_project(self, project_name: str):
121-
self.create_template(self.nest_path / "settings.yaml", self.settings_file())
122121
root = self.base_path / project_name
123122
src_path = root / "src"
124123
self.create_folder(root)
124+
self.create_template(root / "settings.yaml", self.settings_file())
125125
self.create_template(root / "main.py", self.main_file())
126126
self.create_template(root / "README.md", self.readme_file())
127127
self.create_template(root / "requirements.txt", self.requirements_file())

‎nest/cli/templates/cli_templates.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ def generate_module(self, module_name: str, path: str = None):
131131
self.create_module(module_name, src_path)
132132

133133
def generate_project(self, project_name: str):
134-
self.create_template(self.nest_path / "settings.yaml", self.settings_file())
135134
root = self.base_path / project_name
136135
src_path = root / "src"
137136
self.create_folder(root)
137+
self.create_template(root / "settings.yaml", self.settings_file())
138138
self.create_template(root / "README.md", self.readme_file())
139139
self.create_template(root / "requirements.txt", self.requirements_file())
140140
self.create_folder(src_path)

‎nest/cli/templates/orm_template.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,13 @@ def generate_module(self, module_name: str, path: str = None):
182182
self.create_module(module_name, src_path)
183183

184184
def generate_project(self, project_name: str):
185-
self.create_template(self.nest_path / "settings.yaml", self.settings_file())
186185
# define paths: root, src, module
187186
root_path = self.base_path / project_name
188187
src_path = self.base_path / project_name / "src"
189188

190189
# create folders
191190
self.create_folder(root_path)
191+
self.create_template(root_path / "settings.yaml", self.settings_file())
192192
self.create_folder(src_path)
193193

194194
# create root level files

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ test = [
5555
test = [
5656
"pytest>=7.0.1,<8.0.0",
5757
"httpx>=0.27.0,<1.0.0",
58-
"sqlalchemy>=2.0.36,<3.0.0",
58+
"sqlalchemy[asyncio]>=2.0.36,<3.0.0",
5959
"motor>=3.2.0,<4.0.0",
6060
"beanie>=1.27.0,<2.0.0",
6161
"python-dotenv>=1.0.1,<2.0.0",
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from pathlib import Path
2+
3+
import pytest
4+
import yaml
5+
6+
from nest.cli.src.generate.generate_service import GenerateService
7+
8+
9+
@pytest.mark.parametrize(
10+
"db_type,is_async,is_cli,expected",
11+
[
12+
(None, False, False, (None, False, False)),
13+
("sqlite", True, False, ("sqlite", True, False)),
14+
(None, False, True, ("", False, True)),
15+
],
16+
)
17+
def test_generated_project_keeps_cli_settings_locally(
18+
tmp_path, monkeypatch, db_type, is_async, is_cli, expected
19+
):
20+
monkeypatch.chdir(tmp_path)
21+
service = GenerateService()
22+
package_settings = Path(__file__).parents[2] / "nest" / "settings.yaml"
23+
assert not package_settings.exists()
24+
25+
service.generate_app("sample", db_type, is_async, is_cli)
26+
27+
project = tmp_path / "sample"
28+
assert yaml.safe_load((project / "settings.yaml").read_text())["config"]
29+
assert not package_settings.exists()
30+
monkeypatch.chdir(project / "src")
31+
assert service.get_metadata() == expected
32+
33+
34+
def test_project_metadata_isolated_between_projects(tmp_path, monkeypatch):
35+
monkeypatch.chdir(tmp_path)
36+
service = GenerateService()
37+
service.generate_app("web", None, False, False)
38+
service.generate_app("database", "sqlite", True, False)
39+
40+
monkeypatch.chdir(tmp_path / "web")
41+
assert service.get_metadata() == (None, False, False)
42+
monkeypatch.chdir(tmp_path / "database" / "src")
43+
assert service.get_metadata() == ("sqlite", True, False)

0 commit comments

Comments
 (0)