stackforge-cli 0.1.0__tar.gz → 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/PKG-INFO +2 -1
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/pyproject.toml +4 -1
- stackforge_cli-0.1.1/src/stackforge/scaffold.py +83 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge_cli.egg-info/PKG-INFO +2 -1
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge_cli.egg-info/SOURCES.txt +1 -0
- stackforge_cli-0.1.1/src/stackforge_cli.egg-info/requires.txt +1 -0
- stackforge_cli-0.1.0/src/stackforge/scaffold.py +0 -82
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/README.md +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/setup.cfg +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/__init__.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/__init__.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/api_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/config_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/csproj_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/docker_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/git_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/layers_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/program_generator.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/scaffolder.py +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge_cli.egg-info/dependency_links.txt +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge_cli.egg-info/entry_points.txt +0 -0
- {stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stackforge-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: A CLI scaffolder for .NET Clean Architecture projects
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: scaffolder,dotnet,clean-architecture,cli
|
|
@@ -10,6 +10,7 @@ Classifier: Operating System :: OS Independent
|
|
|
10
10
|
Classifier: Environment :: Console
|
|
11
11
|
Requires-Python: >=3.10
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: colorama>=0.4.6
|
|
13
14
|
|
|
14
15
|
# StackForge
|
|
15
16
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "stackforge-cli"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
8
8
|
description = "A CLI scaffolder for .NET Clean Architecture projects"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -16,6 +16,9 @@ classifiers = [
|
|
|
16
16
|
"Operating System :: OS Independent",
|
|
17
17
|
"Environment :: Console",
|
|
18
18
|
]
|
|
19
|
+
dependencies = [
|
|
20
|
+
"colorama>=0.4.6",
|
|
21
|
+
]
|
|
19
22
|
|
|
20
23
|
[project.scripts]
|
|
21
24
|
stackforge = "stackforge.scaffold:main"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from stackforge.engines.dotnet.scaffolder import scaffold_folders
|
|
3
|
+
from colorama import init, Fore, Style
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
init(autoreset=True)
|
|
7
|
+
|
|
8
|
+
def is_valid_project_name(name: str) -> bool:
|
|
9
|
+
return bool(re.match(r'^[A-Za-z][A-Za-z0-9]*$', name))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def select_framework() -> str:
|
|
13
|
+
print(f" {Fore.CYAN}Select a framework:{Style.RESET_ALL}\n")
|
|
14
|
+
print(f" {Fore.GREEN}1.{Style.RESET_ALL} .NET Clean Architecture (CQRS)")
|
|
15
|
+
print(f" {Fore.YELLOW}2.{Style.RESET_ALL} Django [coming soon]")
|
|
16
|
+
print(f" {Fore.YELLOW}3.{Style.RESET_ALL} FastAPI [coming soon]")
|
|
17
|
+
print(f" {Fore.YELLOW}4.{Style.RESET_ALL} Flask [coming soon]")
|
|
18
|
+
print(f" {Fore.RED}5.{Style.RESET_ALL} exit")
|
|
19
|
+
|
|
20
|
+
choice = input(f"\n {Fore.CYAN}Choice [n]:{Style.RESET_ALL} ").strip() or "1"
|
|
21
|
+
return choice
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main():
|
|
25
|
+
print(Fore.CYAN + r"""
|
|
26
|
+
_____ _ _ ______
|
|
27
|
+
/ ____| | | | | ____|
|
|
28
|
+
| (___ | |_ __ _ ___| | _| |__ ___ _ __ __ _ ___
|
|
29
|
+
\___ \| __/ _` |/ __| |/ / __/ _ \| '__/ _` |/ _ \
|
|
30
|
+
____) | || (_| | (__| <| | | (_) | | | (_| | __/
|
|
31
|
+
|_____/ \__\__,_|\___|_|\_\_| \___/|_| \__, |\___|
|
|
32
|
+
__/ |
|
|
33
|
+
|___/
|
|
34
|
+
""" + Style.RESET_ALL + f" {Fore.WHITE}.NET Clean Architecture Scaffolder{Style.RESET_ALL}\n")
|
|
35
|
+
|
|
36
|
+
while True:
|
|
37
|
+
framework = select_framework()
|
|
38
|
+
|
|
39
|
+
if framework == "5":
|
|
40
|
+
print(f"\n {Fore.YELLOW}Exiting...{Style.RESET_ALL}")
|
|
41
|
+
break
|
|
42
|
+
|
|
43
|
+
if framework != "1":
|
|
44
|
+
print(f"\n {Fore.YELLOW}[!] This framework is under development. Stay tuned!{Style.RESET_ALL}\n")
|
|
45
|
+
continue
|
|
46
|
+
|
|
47
|
+
project_name = input(f"\n {Fore.CYAN}Enter project name (PascalCase, no spaces):{Style.RESET_ALL} ").strip()
|
|
48
|
+
|
|
49
|
+
if not project_name:
|
|
50
|
+
print(f" {Fore.RED}[!] Project name cannot be empty.{Style.RESET_ALL}\n")
|
|
51
|
+
continue
|
|
52
|
+
|
|
53
|
+
if not is_valid_project_name(project_name):
|
|
54
|
+
print(f" {Fore.RED}[!] Project name must start with a letter and contain only letters and numbers.")
|
|
55
|
+
print(f" Example: RaiderXpress, MyApi, StackForge{Style.RESET_ALL}\n")
|
|
56
|
+
continue
|
|
57
|
+
|
|
58
|
+
base_path = Path.home() / "stackforge" / project_name
|
|
59
|
+
|
|
60
|
+
if base_path.exists():
|
|
61
|
+
print(f"\n {Fore.RED}[!] Project '{project_name}' already exists in the stackforge workspace.")
|
|
62
|
+
print(f" Path: {base_path}{Style.RESET_ALL}")
|
|
63
|
+
print(" Choose a different project name or delete the existing one.\n")
|
|
64
|
+
continue
|
|
65
|
+
|
|
66
|
+
base_path.mkdir(parents=True, exist_ok=True)
|
|
67
|
+
scaffold_folders(base_path, project_name)
|
|
68
|
+
|
|
69
|
+
print(f"""
|
|
70
|
+
{Fore.GREEN}✔ Project '{project_name}' created successfully!
|
|
71
|
+
✔ Location: {base_path}{Style.RESET_ALL}
|
|
72
|
+
|
|
73
|
+
{Fore.CYAN}Next steps:{Style.RESET_ALL}
|
|
74
|
+
1. Open the project in Visual Studio or VS Code
|
|
75
|
+
2. Run: docker-compose up --build
|
|
76
|
+
3. Visit: http://localhost:5000/swagger
|
|
77
|
+
|
|
78
|
+
Press Ctrl+C to exit or continue to scaffold another project.
|
|
79
|
+
""")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
main()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stackforge-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: A CLI scaffolder for .NET Clean Architecture projects
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: scaffolder,dotnet,clean-architecture,cli
|
|
@@ -10,6 +10,7 @@ Classifier: Operating System :: OS Independent
|
|
|
10
10
|
Classifier: Environment :: Console
|
|
11
11
|
Requires-Python: >=3.10
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: colorama>=0.4.6
|
|
13
14
|
|
|
14
15
|
# StackForge
|
|
15
16
|
|
|
@@ -15,4 +15,5 @@ src/stackforge_cli.egg-info/PKG-INFO
|
|
|
15
15
|
src/stackforge_cli.egg-info/SOURCES.txt
|
|
16
16
|
src/stackforge_cli.egg-info/dependency_links.txt
|
|
17
17
|
src/stackforge_cli.egg-info/entry_points.txt
|
|
18
|
+
src/stackforge_cli.egg-info/requires.txt
|
|
18
19
|
src/stackforge_cli.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
colorama>=0.4.6
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from stackforge.engines.dotnet.scaffolder import scaffold_folders
|
|
3
|
-
import re
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def is_valid_project_name(name: str) -> bool:
|
|
7
|
-
return bool(re.match(r'^[A-Za-z][A-Za-z0-9]*$', name))
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def select_framework() -> str:
|
|
11
|
-
print(" Select a framework:\n")
|
|
12
|
-
print(" 1. .NET Clean Architecture (CQRS)")
|
|
13
|
-
print(" 2. Django [coming soon]")
|
|
14
|
-
print(" 3. FastAPI [coming soon]")
|
|
15
|
-
print(" 4. Flask [coming soon]")
|
|
16
|
-
print(" 5. exit")
|
|
17
|
-
|
|
18
|
-
choice = input("\n Choice [n]: ").strip() or "1"
|
|
19
|
-
return choice
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def main():
|
|
23
|
-
print(r"""
|
|
24
|
-
_____ _ _ ______
|
|
25
|
-
/ ____| | | | | ____|
|
|
26
|
-
| (___ | |_ __ _ ___| | _| |__ ___ _ __ __ _ ___
|
|
27
|
-
\___ \| __/ _` |/ __| |/ / __/ _ \| '__/ _` |/ _ \
|
|
28
|
-
____) | || (_| | (__| <| | | (_) | | | (_| | __/
|
|
29
|
-
|_____/ \__\__,_|\___|_|\_\_| \___/|_| \__, |\___|
|
|
30
|
-
__/ |
|
|
31
|
-
|___/
|
|
32
|
-
.NET Clean Architecture Scaffolder
|
|
33
|
-
""")
|
|
34
|
-
|
|
35
|
-
while True:
|
|
36
|
-
framework = select_framework()
|
|
37
|
-
|
|
38
|
-
if framework == "5":
|
|
39
|
-
print("\n Exiting...")
|
|
40
|
-
break
|
|
41
|
-
|
|
42
|
-
if framework != "1":
|
|
43
|
-
print("\n [!] This framework is under development. Stay tuned!\n")
|
|
44
|
-
continue
|
|
45
|
-
|
|
46
|
-
project_name = input("\n Enter project name (PascalCase, no spaces): ").strip()
|
|
47
|
-
|
|
48
|
-
if not project_name:
|
|
49
|
-
print(" [!] Project name cannot be empty.\n")
|
|
50
|
-
continue
|
|
51
|
-
|
|
52
|
-
if not is_valid_project_name(project_name):
|
|
53
|
-
print(" [!] Project name must start with a letter and contain only letters and numbers.")
|
|
54
|
-
print(" Example: RaiderXpress, MyApi, StackForge\n")
|
|
55
|
-
continue
|
|
56
|
-
|
|
57
|
-
base_path = Path.home() / "stackforge" / project_name
|
|
58
|
-
|
|
59
|
-
if base_path.exists():
|
|
60
|
-
print(f"\n [!] Project '{project_name}' already exists in the stackforge workspace.")
|
|
61
|
-
print(f" Path: {base_path}")
|
|
62
|
-
print(" Choose a different project name or delete the existing one.\n")
|
|
63
|
-
continue
|
|
64
|
-
|
|
65
|
-
base_path.mkdir(parents=True, exist_ok=True)
|
|
66
|
-
scaffold_folders(base_path, project_name)
|
|
67
|
-
|
|
68
|
-
print(f"""
|
|
69
|
-
✔ Project '{project_name}' created successfully!
|
|
70
|
-
✔ Location: {base_path}
|
|
71
|
-
|
|
72
|
-
Next steps:
|
|
73
|
-
1. Open the project in Visual Studio or VS Code
|
|
74
|
-
2. Run: docker-compose up --build
|
|
75
|
-
3. Visit: http://localhost:5000/swagger
|
|
76
|
-
|
|
77
|
-
Press Ctrl+C to exit or continue to scaffold another project.
|
|
78
|
-
""")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if __name__ == "__main__":
|
|
82
|
-
main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/api_generator.py
RENAMED
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/config_generator.py
RENAMED
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/csproj_generator.py
RENAMED
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/docker_generator.py
RENAMED
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/git_generator.py
RENAMED
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/layers_generator.py
RENAMED
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge/engines/dotnet/program_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{stackforge_cli-0.1.0 → stackforge_cli-0.1.1}/src/stackforge_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|