instant-python 0.3.0__py3-none-any.whl → 0.5.0__py3-none-any.whl

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.
Files changed (30) hide show
  1. instant_python/cli.py +19 -2
  2. instant_python/errors/__init__.py +0 -0
  3. instant_python/errors/application_error.py +11 -0
  4. instant_python/errors/command_execution_error.py +20 -0
  5. instant_python/errors/error_types.py +6 -0
  6. instant_python/errors/template_file_not_found_error.py +18 -0
  7. instant_python/errors/unknown_dependency_manager_error.py +18 -0
  8. instant_python/errors/unknown_node_typer_error.py +16 -0
  9. instant_python/errors/unknown_template_error.py +16 -0
  10. instant_python/installer/dependency_manager_factory.py +5 -1
  11. instant_python/installer/git_configurer.py +3 -0
  12. instant_python/installer/installer.py +9 -3
  13. instant_python/installer/managers.py +0 -1
  14. instant_python/installer/pdm_manager.py +7 -0
  15. instant_python/installer/uv_manager.py +4 -0
  16. instant_python/intant_python_typer.py +30 -0
  17. instant_python/project_generator/custom_template_manager.py +2 -3
  18. instant_python/project_generator/folder_tree.py +3 -8
  19. instant_python/project_generator/jinja_custom_filters.py +2 -1
  20. instant_python/project_generator/project_generator.py +12 -7
  21. instant_python/templates/boilerplate/README.md +5 -0
  22. instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2 +1 -0
  23. instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2 +1 -0
  24. instant_python/templates/project_structure/readme.yml.j2 +3 -0
  25. instant_python/templates/project_structure/standard_project/main_structure.yml.j2 +1 -0
  26. {instant_python-0.3.0.dist-info → instant_python-0.5.0.dist-info}/METADATA +1 -1
  27. {instant_python-0.3.0.dist-info → instant_python-0.5.0.dist-info}/RECORD +30 -19
  28. {instant_python-0.3.0.dist-info → instant_python-0.5.0.dist-info}/WHEEL +0 -0
  29. {instant_python-0.3.0.dist-info → instant_python-0.5.0.dist-info}/entry_points.txt +0 -0
  30. {instant_python-0.3.0.dist-info → instant_python-0.5.0.dist-info}/licenses/LICENSE +0 -0
instant_python/cli.py CHANGED
@@ -1,11 +1,28 @@
1
- import typer
1
+ from rich.console import Console
2
+ from rich.panel import Panel
2
3
 
3
4
  from instant_python import folder_cli, project_cli
5
+ from instant_python.errors.application_error import ApplicationError
6
+ from instant_python.intant_python_typer import InstantPythonTyper
7
+
8
+ app = InstantPythonTyper()
9
+ console = Console()
4
10
 
5
- app = typer.Typer()
6
11
  app.add_typer(folder_cli.app, name="folder", help="Generate only the folder structure for a new project")
7
12
  app.add_typer(project_cli.app, name="project", help="Generate a full project ready to be used")
8
13
 
9
14
 
15
+ @app.error_handler(ApplicationError)
16
+ def handle_application_error(exc: ApplicationError) -> None:
17
+ error_panel = Panel(exc.message, title="Error", border_style="red")
18
+ console.print(error_panel)
19
+
20
+
21
+ @app.error_handler(Exception)
22
+ def handle_unexpected_error(exc: Exception) -> None:
23
+ error_panel = Panel(f"An unexpected error occurred: {exc}", title="Error", border_style="red")
24
+ console.print(error_panel)
25
+
26
+
10
27
  if __name__ == "__main__":
11
28
  app()
File without changes
@@ -0,0 +1,11 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class ApplicationError(Exception, ABC):
5
+ @property
6
+ @abstractmethod
7
+ def type(self) -> str: ...
8
+
9
+ @property
10
+ @abstractmethod
11
+ def message(self) -> str: ...
@@ -0,0 +1,20 @@
1
+ from instant_python.errors.application_error import ApplicationError
2
+ from instant_python.errors.error_types import ErrorTypes
3
+
4
+
5
+ class CommandExecutionError(ApplicationError):
6
+ def __init__(self, exit_code: int, stderr_output=None):
7
+ self._message = (
8
+ f"Unexpected error when executing a command, exit code {exit_code}"
9
+ )
10
+ if stderr_output:
11
+ self._message += f": {stderr_output.decode('utf-8').strip()}"
12
+ super().__init__(self._message)
13
+
14
+ @property
15
+ def type(self) -> str:
16
+ return ErrorTypes.INSTALLER.value
17
+
18
+ @property
19
+ def message(self) -> str:
20
+ return self._message
@@ -0,0 +1,6 @@
1
+ from enum import Enum
2
+
3
+
4
+ class ErrorTypes(str, Enum):
5
+ INSTALLER = "installer_error"
6
+ GENERATOR = "project_generator_error"
@@ -0,0 +1,18 @@
1
+ from pathlib import Path
2
+
3
+ from instant_python.errors.application_error import ApplicationError
4
+ from instant_python.errors.error_types import ErrorTypes
5
+
6
+
7
+ class TemplateFileNotFoundError(ApplicationError):
8
+ def __init__(self, template_path: str | Path) -> None:
9
+ self._message = f"Could not find YAML file at: {template_path}"
10
+ super().__init__(self._message)
11
+
12
+ @property
13
+ def type(self) -> str:
14
+ return ErrorTypes.GENERATOR.value
15
+
16
+ @property
17
+ def message(self) -> str:
18
+ return self._message
@@ -0,0 +1,18 @@
1
+ from instant_python.errors.application_error import ApplicationError
2
+ from instant_python.errors.error_types import ErrorTypes
3
+
4
+
5
+ class UnknownDependencyManagerError(ApplicationError):
6
+ def __init__(self, manager: str) -> None:
7
+ self._message = (
8
+ f"Unknown dependency manager: {manager}. Please use 'pdm' or 'uv'."
9
+ )
10
+ super().__init__(self._message)
11
+
12
+ @property
13
+ def type(self) -> str:
14
+ return ErrorTypes.INSTALLER.value
15
+
16
+ @property
17
+ def message(self) -> str:
18
+ return self._message
@@ -0,0 +1,16 @@
1
+ from instant_python.errors.application_error import ApplicationError
2
+ from instant_python.errors.error_types import ErrorTypes
3
+
4
+
5
+ class UnknownNodeTypeError(ApplicationError):
6
+ def __init__(self, node_type: str) -> None:
7
+ self._message = f"Unknown node type: {node_type}"
8
+ super().__init__(self._message)
9
+
10
+ @property
11
+ def type(self) -> str:
12
+ return ErrorTypes.GENERATOR.value
13
+
14
+ @property
15
+ def message(self) -> str:
16
+ return self._message
@@ -0,0 +1,16 @@
1
+ from instant_python.errors.application_error import ApplicationError
2
+ from instant_python.errors.error_types import ErrorTypes
3
+
4
+
5
+ class UnknownTemplateError(ApplicationError):
6
+ def __init__(self, template_name: str) -> None:
7
+ self._message = f"Unknown template type: {template_name}"
8
+ super().__init__(self._message)
9
+
10
+ @property
11
+ def type(self) -> str:
12
+ return ErrorTypes.GENERATOR.value
13
+
14
+ @property
15
+ def message(self) -> str:
16
+ return self._message
@@ -1,3 +1,4 @@
1
+ from instant_python.errors.unknown_dependency_manager_error import UnknownDependencyManagerError
1
2
  from instant_python.installer.dependency_manager import DependencyManager
2
3
  from instant_python.installer.managers import Managers
3
4
  from instant_python.installer.pdm_manager import PdmManager
@@ -11,4 +12,7 @@ class DependencyManagerFactory:
11
12
  Managers.UV: UvManager,
12
13
  Managers.PDM: PdmManager,
13
14
  }
14
- return managers[Managers(user_manager)](project_path)
15
+ try:
16
+ return managers[Managers(user_manager)](project_path)
17
+ except KeyError:
18
+ raise UnknownDependencyManagerError(user_manager)
@@ -21,6 +21,7 @@ class GitConfigurer:
21
21
  check=True,
22
22
  cwd=self._project_directory,
23
23
  stdout=subprocess.DEVNULL,
24
+ stderr=subprocess.PIPE,
24
25
  )
25
26
  print(">>> Git repository initialized successfully")
26
27
 
@@ -32,6 +33,7 @@ class GitConfigurer:
32
33
  check=True,
33
34
  cwd=self._project_directory,
34
35
  stdout=subprocess.DEVNULL,
36
+ stderr=subprocess.PIPE,
35
37
  )
36
38
  print(">>> Git user and email configured successfully")
37
39
 
@@ -43,5 +45,6 @@ class GitConfigurer:
43
45
  check=True,
44
46
  cwd=self._project_directory,
45
47
  stdout=subprocess.DEVNULL,
48
+ stderr=subprocess.PIPE,
46
49
  )
47
50
  print(">>> Initial commit made successfully")
@@ -1,3 +1,6 @@
1
+ import subprocess
2
+
3
+ from instant_python.errors.command_execution_error import CommandExecutionError
1
4
  from instant_python.installer.dependency_manager import DependencyManager
2
5
 
3
6
 
@@ -13,6 +16,9 @@ class Installer:
13
16
  def perform_installation(
14
17
  self, python_version: str, dependencies: list[str]
15
18
  ) -> None:
16
- self._dependency_manager.install()
17
- self._dependency_manager.install_python(python_version)
18
- self._dependency_manager.install_dependencies(dependencies)
19
+ try:
20
+ self._dependency_manager.install()
21
+ self._dependency_manager.install_python(python_version)
22
+ self._dependency_manager.install_dependencies(dependencies)
23
+ except subprocess.CalledProcessError as error:
24
+ raise CommandExecutionError(exit_code=error.returncode, stderr_output=error.stderr)
@@ -2,6 +2,5 @@ from enum import Enum
2
2
 
3
3
 
4
4
  class Managers(str, Enum):
5
- PYENV = "pyenv"
6
5
  UV = "uv"
7
6
  PDM = "pdm"
@@ -16,6 +16,8 @@ class PdmManager(DependencyManager):
16
16
  "curl -sSL https://pdm-project.org/install-pdm.py | python3 -",
17
17
  shell=True,
18
18
  check=True,
19
+ stdout=subprocess.DEVNULL,
20
+ stderr=subprocess.PIPE,
19
21
  )
20
22
  print(">>> pdm installed successfully")
21
23
 
@@ -27,6 +29,8 @@ class PdmManager(DependencyManager):
27
29
  shell=True,
28
30
  check=True,
29
31
  cwd=self._project_directory,
32
+ stdout=subprocess.DEVNULL,
33
+ stderr=subprocess.PIPE,
30
34
  )
31
35
  print(f">>> Python {version} installed successfully")
32
36
 
@@ -55,6 +59,8 @@ class PdmManager(DependencyManager):
55
59
  shell=True,
56
60
  check=True,
57
61
  cwd=self._project_directory,
62
+ stdout=subprocess.DEVNULL,
63
+ stderr=subprocess.PIPE,
58
64
  )
59
65
 
60
66
  @staticmethod
@@ -76,4 +82,5 @@ class PdmManager(DependencyManager):
76
82
  check=True,
77
83
  cwd=self._project_directory,
78
84
  stdout=subprocess.DEVNULL,
85
+ stderr=subprocess.PIPE,
79
86
  )
@@ -17,6 +17,7 @@ class UvManager(DependencyManager):
17
17
  shell=True,
18
18
  check=True,
19
19
  stdout=subprocess.DEVNULL,
20
+ stderr=subprocess.PIPE,
20
21
  )
21
22
  print(">>> uv installed successfully")
22
23
 
@@ -29,6 +30,7 @@ class UvManager(DependencyManager):
29
30
  check=True,
30
31
  cwd=self._project_directory,
31
32
  stdout=subprocess.DEVNULL,
33
+ stderr=subprocess.PIPE,
32
34
  )
33
35
  print(f">>> Python {version} installed successfully")
34
36
 
@@ -58,6 +60,7 @@ class UvManager(DependencyManager):
58
60
  check=True,
59
61
  cwd=self._project_directory,
60
62
  stdout=subprocess.DEVNULL,
63
+ stderr=subprocess.PIPE,
61
64
  )
62
65
  print(f">>> {dependency_name} installed successfully")
63
66
 
@@ -81,4 +84,5 @@ class UvManager(DependencyManager):
81
84
  check=True,
82
85
  cwd=self._project_directory,
83
86
  stdout=subprocess.DEVNULL,
87
+ stderr=subprocess.PIPE,
84
88
  )
@@ -0,0 +1,30 @@
1
+ from collections.abc import Callable
2
+
3
+ import typer
4
+
5
+ ExceptionType = type[Exception]
6
+ ErrorHandlingCallback = Callable[[Exception], None]
7
+
8
+
9
+ class InstantPythonTyper(typer.Typer):
10
+ error_handlers: dict[ExceptionType, ErrorHandlingCallback] = {}
11
+
12
+ def error_handler(self, exc: ExceptionType):
13
+ """Registers a callback function to be called when 'exc' (the given exception) is raised."""
14
+
15
+ def decorator(func: ErrorHandlingCallback):
16
+ self.error_handlers[exc] = func
17
+ return func
18
+
19
+ return decorator
20
+
21
+ def __call__(self, *args, **kwargs):
22
+ """Overrides Typer.__call__ so that when we run the CLI,
23
+ we can catch any exception that's raised and see if there's
24
+ a matching error handler for it.
25
+ """
26
+ try:
27
+ super().__call__(*args, **kwargs)
28
+ except Exception as error:
29
+ callback = self.error_handlers.get(error.__class__.__base__)
30
+ callback(error)
@@ -2,6 +2,7 @@ from pathlib import Path
2
2
 
3
3
  import yaml
4
4
 
5
+ from instant_python.errors.template_file_not_found_error import TemplateFileNotFoundError
5
6
  from instant_python.project_generator.template_manager import TemplateManager
6
7
 
7
8
 
@@ -11,8 +12,6 @@ class CustomTemplateManager(TemplateManager):
11
12
 
12
13
  def get_project(self, template_name: str) -> dict[str, str]:
13
14
  if not self._template_path.is_file():
14
- raise FileNotFoundError(
15
- f"Could not find YAML file at: {self._template_path}"
16
- )
15
+ raise TemplateFileNotFoundError(self._template_path)
17
16
  with open(self._template_path, "r", encoding="utf-8") as f:
18
17
  return yaml.safe_load(f)
@@ -1,17 +1,12 @@
1
1
  from pathlib import Path
2
2
 
3
- from instant_python.project_generator.directory import Directory
3
+ from instant_python.errors.unknown_node_typer_error import UnknownNodeTypeError
4
4
  from instant_python.project_generator.boilerplate_file import BoilerplateFile
5
+ from instant_python.project_generator.directory import Directory
5
6
  from instant_python.project_generator.file import File
6
7
  from instant_python.project_generator.node import Node, NodeType
7
8
 
8
9
 
9
- class UnknownNodeType(ValueError):
10
- def __init__(self, node_type: str) -> None:
11
- self._message = f"Unknown node type: {node_type}"
12
- super().__init__(self._message)
13
-
14
-
15
10
  class FolderTree:
16
11
  def __init__(self, project_directory: str) -> None:
17
12
  self._project_directory = Path(project_directory)
@@ -41,4 +36,4 @@ class FolderTree:
41
36
  extension = node.get("extension", "")
42
37
  return File(name=name, extension=extension)
43
38
  else:
44
- raise UnknownNodeType(node_type)
39
+ raise UnknownNodeTypeError(node_type)
@@ -1,3 +1,4 @@
1
+ from instant_python.errors.unknown_template_error import UnknownTemplateError
1
2
  from instant_python.question_prompter.template_types import TemplateTypes
2
3
 
3
4
 
@@ -15,4 +16,4 @@ def compute_base_path(initial_path: str, template_type: str) -> str:
15
16
  elif template_type == TemplateTypes.STANDARD:
16
17
  return ".".join(path_components[2:])
17
18
  else:
18
- raise ValueError(f"Unknown template type: {template_type}")
19
+ raise UnknownTemplateError(template_type)
@@ -1,5 +1,6 @@
1
1
  import subprocess
2
2
 
3
+ from instant_python.errors.command_execution_error import CommandExecutionError
3
4
  from instant_python.project_generator.folder_tree import FolderTree
4
5
  from instant_python.project_generator.jinja_template_manager import TemplateManager
5
6
 
@@ -18,13 +19,17 @@ class ProjectGenerator:
18
19
  self._format_project_files()
19
20
 
20
21
  def _format_project_files(self) -> None:
21
- subprocess.run(
22
- "uvx ruff format",
23
- shell=True,
24
- check=True,
25
- cwd=self._folder_tree.project_directory,
26
- stdout=subprocess.DEVNULL,
27
- )
22
+ try:
23
+ subprocess.run(
24
+ "uvx ruff format",
25
+ shell=True,
26
+ check=True,
27
+ cwd=self._folder_tree.project_directory,
28
+ stdout=subprocess.DEVNULL,
29
+ stderr=subprocess.PIPE,
30
+ )
31
+ except subprocess.CalledProcessError as error:
32
+ raise CommandExecutionError(exit_code=error.returncode, stderr_output=error.stderr)
28
33
 
29
34
  @property
30
35
  def path(self) -> str:
@@ -0,0 +1,5 @@
1
+ # {{ project-slug }}
2
+
3
+ ## Description
4
+
5
+ {{ description }}
@@ -11,6 +11,7 @@ root:
11
11
  {{ macros.include_and_indent("project_structure/pyproject.yml.j2", 2) }}
12
12
  {% if git %}
13
13
  {{ macros.include_and_indent("project_structure/gitignore.yml.j2", 2) }}
14
+ {{ macros.include_and_indent("project_structure/readme.yml.j2", 2) }}
14
15
  {% endif %}
15
16
  {{ macros.include_and_indent("project_structure/python_version.yml.j2", 2) }}
16
17
  {% if "pytest" in dependencies %}
@@ -11,6 +11,7 @@ root:
11
11
  {{ macros.include_and_indent("project_structure/pyproject.yml.j2", 2) }}
12
12
  {% if git %}
13
13
  {{ macros.include_and_indent("project_structure/gitignore.yml.j2", 2) }}
14
+ {{ macros.include_and_indent("project_structure/readme.yml.j2", 2) }}
14
15
  {% endif %}
15
16
  {{ macros.include_and_indent("project_structure/python_version.yml.j2", 2) }}
16
17
  {% if "pytest" in dependencies %}
@@ -0,0 +1,3 @@
1
+ - name: README
2
+ type: boilerplate_file
3
+ extension: .md
@@ -11,6 +11,7 @@ root:
11
11
  {{ macros.include_and_indent("project_structure/pyproject.yml.j2", 2) }}
12
12
  {% if git %}
13
13
  {{ macros.include_and_indent("project_structure/gitignore.yml.j2", 2) }}
14
+ {{ macros.include_and_indent("project_structure/readme.yml.j2", 2) }}
14
15
  {% endif %}
15
16
  {{ macros.include_and_indent("project_structure/python_version.yml.j2", 2) }}
16
17
  {% if "pytest" in dependencies %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instant-python
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: Instant boilerplate generation for Python projects
5
5
  Project-URL: documentation, https://dimanu-py.github.io/instant-python/
6
6
  Project-URL: repository, https://github.com/dimanu-py/instant-python/
@@ -1,26 +1,35 @@
1
1
  instant_python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- instant_python/cli.py,sha256=94jwSQmOI_2jjaLyz9IcPFt6cIDUO6Kzd2JssKW-TFE,327
2
+ instant_python/cli.py,sha256=seXa5ejBGG8dtEGakXRQLwurDKoRIZzEGWTY3gMcTZ4,957
3
3
  instant_python/folder_cli.py,sha256=kEVCuhq08v8ahdUTa3sA1v5B96xoMO4U6cGEcXHrZLo,1748
4
+ instant_python/intant_python_typer.py,sha256=y5NUkpOXagH-9nEnb-APhwMZQyRPNAZITRCNDWJKQmE,966
4
5
  instant_python/project_cli.py,sha256=aDYZZwpkMFN-J7UEKgvZQ9lXlKtr5e3ttdNzEtGslbw,3446
6
+ instant_python/errors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ instant_python/errors/application_error.py,sha256=A2XOPci4b0gkpr0EEqSxpo6gWpPxGm2VjJksZRX3KOY,212
8
+ instant_python/errors/command_execution_error.py,sha256=ugsU4PQKZBdHB4zihWcCEMw0xnFkRw2JAlMjf2ZfLec,649
9
+ instant_python/errors/error_types.py,sha256=AOcBRwJkLjE9kCGbKGebwaNzLvTbb9Vsv-bXtBEqnb0,122
10
+ instant_python/errors/template_file_not_found_error.py,sha256=-tozNvJLxSekXe57GjyMUzwzEGjT1sSDskLBUxygmJk,534
11
+ instant_python/errors/unknown_dependency_manager_error.py,sha256=AAY8jASB4RBABwjP_8CTUHw183uL_cEzgtJic3LOvC8,543
12
+ instant_python/errors/unknown_node_typer_error.py,sha256=pG3wqrqUJXsSFVJzZRZZfx_ttgquVK8VfhNFdw0915U,478
13
+ instant_python/errors/unknown_template_error.py,sha256=EfBs5HvV394o1qAah5FoJ7kkskXYWeYi63gZX4LTfdo,490
5
14
  instant_python/installer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
15
  instant_python/installer/dependency_manager.py,sha256=0pVTtNPGUKFvLeFjiVlegIDU7SjC1urlTSSR7pvzIkU,384
7
- instant_python/installer/dependency_manager_factory.py,sha256=uAwpTK9ilCkaZ50d4hePWNndpK0fOHqEClRQmViJjnY,541
8
- instant_python/installer/git_configurer.py,sha256=di6kGnQ4TF5GSoXh2yXM7a1jg8QoFzD_YWq5HKWzYD8,1524
9
- instant_python/installer/installer.py,sha256=YV0PZ2wLC4bjpalvIqk7PEpLrFr_P7GSVJ_U8rnf7Ds,565
10
- instant_python/installer/managers.py,sha256=HNDazLb2iNgP1xdYvPFfMmVE9Ww_v9a0_CWTPo4XN1w,101
11
- instant_python/installer/pdm_manager.py,sha256=z49NAurrzgByMbB560xeAMH-5a4H1jkXi9AvtAQ8G4E,2756
12
- instant_python/installer/uv_manager.py,sha256=iyoETYfheaTEXWncvcZqnmrfV91sq9fJtH_-8sTmBqg,2878
16
+ instant_python/installer/dependency_manager_factory.py,sha256=_CA4j3V2HzOIeEMJUgN_fCfZo2X_H0uggfuQFCierKU,742
17
+ instant_python/installer/git_configurer.py,sha256=TFend94t9Kx96CwXLvyeKlhHDiVTpIwUuZqv1aWsoSQ,1632
18
+ instant_python/installer/installer.py,sha256=537Y58ZigLc1Kys83eerFWFPjoZ6YaarnJki3bTYWRg,840
19
+ instant_python/installer/managers.py,sha256=EmFtL-WucSSZEs1Un3YFqVymlSLTHMTCqHoQRHSl_Oo,81
20
+ instant_python/installer/pdm_manager.py,sha256=YN25zBYkTDo9opmzqK2qIJ5s44qxZGMvo06XK_Szd4U,3017
21
+ instant_python/installer/uv_manager.py,sha256=okNedYUksLYuhtgxS9OeTiHWXBDsa5ALOXChbCM_xTs,3022
13
22
  instant_python/project_generator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
23
  instant_python/project_generator/boilerplate_file.py,sha256=7APVzUdgieRopJwybTkkycXRRAkr95Q3GmX5M0IrO3c,754
15
- instant_python/project_generator/custom_template_manager.py,sha256=ApOBNU9hdOiQeaJhbr_RMdjm3B-vVLaXyvgj6XtbkZY,628
24
+ instant_python/project_generator/custom_template_manager.py,sha256=cRORZXhg2dx6yKARMG5qnyDgCjtQCV_jKnOdMxjNPIk,662
16
25
  instant_python/project_generator/directory.py,sha256=nJoxOd2RQUJoNkML3Dh7JqhR_xp0czasBXRE2WvW-kQ,747
17
26
  instant_python/project_generator/file.py,sha256=CV8utHrK3OBWr-HjVlSYvelcvfcCRVF0cHpd_qAm0-g,484
18
- instant_python/project_generator/folder_tree.py,sha256=ophcp4FuXz4QBVKvEvq6V0_bzwMHFdfnzNB2UPdSkj4,1752
19
- instant_python/project_generator/jinja_custom_filters.py,sha256=uXHmcTvhcVYJeG5EhTFfacIFs7Pu9F5YOPo2144LYpM,638
27
+ instant_python/project_generator/folder_tree.py,sha256=X0mY_g8RzAjAlR1InZD1vAOzf8YE-8Hhf7KYSbF0JJE,1654
28
+ instant_python/project_generator/jinja_custom_filters.py,sha256=3VUCfHmU0y_fT5CFiJQqTYeUAShptoSTdNArrcwxDdo,698
20
29
  instant_python/project_generator/jinja_environment.py,sha256=wEERsimWbG0XLxBNhkFN9Y2plX8SzTpOewyJRsBLSa4,595
21
30
  instant_python/project_generator/jinja_template_manager.py,sha256=rfQXnFmtK1zCxD8RJ22NL-cojCjcJSUhrOOjAT3sLb4,1472
22
31
  instant_python/project_generator/node.py,sha256=nmT09M8vPPbgDUTpykU_bPY_1w0IT9oVFoKPCfi64Yk,315
23
- instant_python/project_generator/project_generator.py,sha256=B6j9Pp6hz1qsn2th0Ou0hEjDTakUBXDklx4MvfXkwls,982
32
+ instant_python/project_generator/project_generator.py,sha256=MG_eVvj3Wy9inGYkNN2PIe4jObDYvbSJqrb61G9SLAY,1294
24
33
  instant_python/project_generator/template_manager.py,sha256=LhN56T04QlRZv0DXUIl9yx3y1OFq_S9Zq8efxgNHSVI,175
25
34
  instant_python/question_prompter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
35
  instant_python/question_prompter/question_wizard.py,sha256=32SoH2ADQklU3WkLorn3NtztyaHACcCIfU2zEsMQKFc,512
@@ -46,6 +55,7 @@ instant_python/templates/boilerplate/.gitignore,sha256=uViK8iDiHZGpnnvM3TpgrDwXl
46
55
  instant_python/templates/boilerplate/.pre-commit-config.yml,sha256=bOJLrQ_0LqFxHDZeJKbs2FDKE2lxnHzWtYM1CgLSDjM,823
47
56
  instant_python/templates/boilerplate/.python-version,sha256=YZMxU5G2EgDP3ZURqLP5qFjhq7-fqpQX7IUL9stt8_0,20
48
57
  instant_python/templates/boilerplate/LICENSE,sha256=rQvLuj_wsQA7R72dWoE9dgrJbeOlcFTzgJP6i4irhzM,47356
58
+ instant_python/templates/boilerplate/README.md,sha256=N_UvKMIcfQSK7dQOk3xgqfY95iedSCMQXo7_n9PEnoQ,56
49
59
  instant_python/templates/boilerplate/mypy.ini,sha256=RWGydwoR9HwmqIT3wzAqaQQ4qo_m2T3cwFIX6MmJ3YE,865
50
60
  instant_python/templates/boilerplate/pyproject.toml,sha256=zkfECqqNetKszcY9azjjFKuzpgpO5PATTQXB4cRoHMc,736
51
61
  instant_python/templates/boilerplate/pytest.ini,sha256=UKGay9Gune7ft1FAy1O4VyVmnuLunQW5YeZfcuOKTZg,249
@@ -132,20 +142,21 @@ instant_python/templates/project_structure/pre_commit.yml.j2,sha256=ZPHevC5MHwZT
132
142
  instant_python/templates/project_structure/pyproject.yml.j2,sha256=QC_Q5Y1MfMen0fbVfllCDpX70idbNIR4gpL1gIgeQs0,61
133
143
  instant_python/templates/project_structure/pytest.yml.j2,sha256=OePEtuRCiktOKWwMMGR5FVA4eU9BuspxOhIVDy0HToI,57
134
144
  instant_python/templates/project_structure/python_version.yml.j2,sha256=zlkshfPrAOpenxx2D4DxRMrDGlPa5Lth9aIwpWaciy0,48
145
+ instant_python/templates/project_structure/readme.yml.j2,sha256=Km1zSVKfGwx7GHn0CMMAKQieCO089wKb8QoPVUnoDUU,56
135
146
  instant_python/templates/project_structure/synchronous_sqlalchemy.yml.j2,sha256=mC7WBchO0bzHcGkTw0k4woDstUvoQaJKlrCW82A96o8,467
136
147
  instant_python/templates/project_structure/value_objects.yml.j2,sha256=X5AyyZoRllCYdvRUaXSYlcZk_EQg2OyfdCS8pejjFpc,963
137
- instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2,sha256=gnN6jkyRhuNxC04X7EGa0TBYwJGUwX2Jv3OE3YLPKSc,1237
148
+ instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2,sha256=MYNr83LppMnmynSWO8AOGEEBwnJlw1DXaSH1AVP_7GU,1309
138
149
  instant_python/templates/project_structure/clean_architecture/source.yml.j2,sha256=_iJjzVatJboCgJwzDRjPqyl6LXiVCZW2jE_xLr2_-HQ,2200
139
150
  instant_python/templates/project_structure/clean_architecture/test.yml.j2,sha256=xDC57oL6bCZUVIBjBDBL-aNBUfx0jL2bPZX2bfnwKFQ,571
140
151
  instant_python/templates/project_structure/domain_driven_design/bounded_context.yml.j2,sha256=P1hOzOlWm-8ZEGQP-fV-5xk2CfTC0j2BizSStKCvETw,453
141
- instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2,sha256=lmKOIJv6GT0KjVZ9yiz7pCLBPY-Z9inwr5T4xxbFuus,1241
152
+ instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2,sha256=fHZ5BdVbDkpxInGydzhYrTy24v-5jqeA6UhVEhTVYew,1313
142
153
  instant_python/templates/project_structure/domain_driven_design/source.yml.j2,sha256=NadiPEkIjMlKnGAVHCiPYH3DHxnuJLJ7DD5xoL1e-K0,2638
143
154
  instant_python/templates/project_structure/domain_driven_design/test.yml.j2,sha256=OPA0AF4IRPswk-eJ-m5ZDTFmIDu6gN2MvBErMYqI264,823
144
- instant_python/templates/project_structure/standard_project/main_structure.yml.j2,sha256=SG0R4_DPIkb8CCyPfFw7xoId7fmRq_lm9DTaL6MJK18,1234
155
+ instant_python/templates/project_structure/standard_project/main_structure.yml.j2,sha256=Tger29wWSQRqJ4NF8aIq5a3cb1sIm8CL5fyTAv-ZcbU,1306
145
156
  instant_python/templates/project_structure/standard_project/source.yml.j2,sha256=tqD9AsAAzPhulWmRrUW7k3F0eguhAKvNc_p5faQCfRg,1586
146
157
  instant_python/templates/project_structure/standard_project/test.yml.j2,sha256=wadDyJsuDlUecFPNu4RU2v34gOAlKFCQSL5z5U8rgdU,372
147
- instant_python-0.3.0.dist-info/METADATA,sha256=kGa8LWVU52_fOk8oaQLAuXtH85epzbrKC118UU24fOo,16211
148
- instant_python-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
149
- instant_python-0.3.0.dist-info/entry_points.txt,sha256=EdBTj3b3N9Pa4oNzPLPivE_AnMcQIFsmRC3RsSkoLLA,47
150
- instant_python-0.3.0.dist-info/licenses/LICENSE,sha256=kf7wA-1IsqXkzXjlsG95sdQJtsqUON_lNXombfPlklo,11353
151
- instant_python-0.3.0.dist-info/RECORD,,
158
+ instant_python-0.5.0.dist-info/METADATA,sha256=QUDokGny6-yiPPsMxqJ2Xhum8umkvI_2UdN_oDNMgX8,16211
159
+ instant_python-0.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
160
+ instant_python-0.5.0.dist-info/entry_points.txt,sha256=EdBTj3b3N9Pa4oNzPLPivE_AnMcQIFsmRC3RsSkoLLA,47
161
+ instant_python-0.5.0.dist-info/licenses/LICENSE,sha256=kf7wA-1IsqXkzXjlsG95sdQJtsqUON_lNXombfPlklo,11353
162
+ instant_python-0.5.0.dist-info/RECORD,,