instant-python 0.0.1__py3-none-any.whl → 0.2.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 (34) hide show
  1. instant_python/installer/managers.py +2 -2
  2. instant_python/installer/pdm_manager.py +10 -3
  3. instant_python/installer/uv_manager.py +11 -0
  4. instant_python/project_generator/custom_template_manager.py +0 -2
  5. instant_python/project_generator/default_template_manager.py +0 -3
  6. instant_python/project_generator/file.py +1 -1
  7. instant_python/project_generator/node.py +2 -2
  8. instant_python/question_prompter/question/conditional_question.py +9 -3
  9. instant_python/question_prompter/question/question.py +4 -1
  10. instant_python/question_prompter/step/template_step.py +21 -13
  11. instant_python/question_prompter/template_types.py +2 -2
  12. instant_python/question_prompter/user_requirements.py +1 -0
  13. instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +3 -3
  14. instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +19 -0
  15. instant_python/templates/boilerplate/event_bus/event_bus.py +1 -1
  16. instant_python/templates/boilerplate/event_bus/exchange_type.py +7 -0
  17. instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +1 -1
  18. instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +17 -0
  19. instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +13 -6
  20. instant_python/templates/boilerplate/value_object/int_value_object.py +1 -1
  21. instant_python/templates/boilerplate/value_object/string_value_object.py +1 -1
  22. instant_python/templates/boilerplate/value_object/uuid.py +1 -1
  23. instant_python/templates/boilerplate/value_object/value_object.py +29 -2
  24. instant_python/templates/project_structure/clean_architecture/source.yml.j2 +2 -2
  25. instant_python/templates/project_structure/domain_driven_design/source.yml.j2 +5 -3
  26. instant_python/templates/project_structure/domain_driven_design/test.yml.j2 +2 -0
  27. instant_python/templates/project_structure/event_bus_domain.yml.j2 +3 -0
  28. instant_python/templates/project_structure/standard_project/source.yml.j2 +2 -2
  29. {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/METADATA +2 -2
  30. {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/RECORD +33 -33
  31. instant_python/installer/operating_systems.py +0 -7
  32. {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/WHEEL +0 -0
  33. {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/entry_points.txt +0 -0
  34. {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,7 @@
1
- from enum import StrEnum
1
+ from enum import Enum
2
2
 
3
3
 
4
- class Managers(StrEnum):
4
+ class Managers(str, Enum):
5
5
  PYENV = "pyenv"
6
6
  UV = "uv"
7
7
  PDM = "pdm"
@@ -31,6 +31,7 @@ class PdmManager(DependencyManager):
31
31
  print(f">>> Python {version} installed successfully")
32
32
 
33
33
  def install_dependencies(self, dependencies: list[str]) -> None:
34
+ self._create_virtual_environment()
34
35
  for dependency_name in dependencies:
35
36
  self._install_dependency(dependency_name)
36
37
 
@@ -67,6 +68,12 @@ class PdmManager(DependencyManager):
67
68
  group_flag += f"--group {group_name}"
68
69
  return f"{dev_flag} {group_flag}"
69
70
 
70
-
71
-
72
-
71
+ def _create_virtual_environment(self) -> None:
72
+ command = f"{self._pdm} install"
73
+ subprocess.run(
74
+ command,
75
+ shell=True,
76
+ check=True,
77
+ cwd=self._project_directory,
78
+ stdout=subprocess.DEVNULL,
79
+ )
@@ -33,6 +33,7 @@ class UvManager(DependencyManager):
33
33
  print(f">>> Python {version} installed successfully")
34
34
 
35
35
  def install_dependencies(self, dependencies: list[str]) -> None:
36
+ self._create_virtual_environment()
36
37
  for dependency_name in dependencies:
37
38
  self._install_dependency(dependency_name)
38
39
 
@@ -71,3 +72,13 @@ class UvManager(DependencyManager):
71
72
  ).ask()["group_name"]
72
73
  flag = f"--group {group_name}"
73
74
  return flag
75
+
76
+ def _create_virtual_environment(self) -> None:
77
+ command = f"{self._uv} sync"
78
+ subprocess.run(
79
+ command,
80
+ shell=True,
81
+ check=True,
82
+ cwd=self._project_directory,
83
+ stdout=subprocess.DEVNULL,
84
+ )
@@ -1,5 +1,4 @@
1
1
  from pathlib import Path
2
- from typing import override
3
2
 
4
3
  import yaml
5
4
 
@@ -10,7 +9,6 @@ class CustomTemplateManager(TemplateManager):
10
9
  def __init__(self, template_path: str) -> None:
11
10
  self._template_path = Path(template_path).expanduser().resolve()
12
11
 
13
- @override
14
12
  def get_project(self, template_name: str) -> dict[str, str]:
15
13
  if not self._template_path.is_file():
16
14
  raise FileNotFoundError(
@@ -1,5 +1,3 @@
1
- from typing import override
2
-
3
1
  import yaml
4
2
  from jinja2 import Environment, Template, PackageLoader
5
3
 
@@ -20,7 +18,6 @@ class DefaultTemplateManager(TemplateManager):
20
18
  self._env.filters["is_in"] = is_in
21
19
  self._env.filters["compute_base_path"] = compute_base_path
22
20
 
23
- @override
24
21
  def get_project(self, template_name: str) -> dict:
25
22
  template = self._get_template(
26
23
  f"{template_name}/{self._requirements.template}/main_structure.yml.j2"
@@ -7,7 +7,7 @@ from instant_python.project_generator.node import Node
7
7
  class File(Node):
8
8
 
9
9
  def __init__(self, name: str, extension: str) -> None:
10
- self._file_name = f"{name.split("/")[-1]}{extension}"
10
+ self._file_name = f"{name.split('/')[-1]}{extension}"
11
11
  self._template_path = f"boilerplate/{name}{extension}"
12
12
  self._template_manager = DefaultTemplateManager()
13
13
 
@@ -1,9 +1,9 @@
1
1
  from abc import ABC, abstractmethod
2
- from enum import StrEnum
2
+ from enum import Enum
3
3
  from pathlib import Path
4
4
 
5
5
 
6
- class NodeType(StrEnum):
6
+ class NodeType(str, Enum):
7
7
  DIRECTORY = "directory"
8
8
  FILE = "file"
9
9
 
@@ -1,9 +1,11 @@
1
+ from typing import Union
2
+
1
3
  from instant_python.question_prompter.question.question import Question
2
4
 
3
5
 
4
6
  class ConditionalQuestion:
5
7
  def __init__(
6
- self, base_question: Question, subquestions: list[Question], condition: str | bool
8
+ self, base_question: Question, subquestions: Union[list[Question], "ConditionalQuestion"], condition: str | bool
7
9
  ) -> None:
8
10
  self._base_question = base_question
9
11
  self._subquestions = subquestions
@@ -16,8 +18,12 @@ class ConditionalQuestion:
16
18
  return base_answer
17
19
 
18
20
  answers = base_answer
19
- for question in self._subquestions:
20
- answers.update(question.ask())
21
+
22
+ if isinstance(self._subquestions, ConditionalQuestion):
23
+ answers.update(self._subquestions.ask())
24
+ else:
25
+ for question in self._subquestions:
26
+ answers.update(question.ask())
21
27
  return answers
22
28
 
23
29
  def _base_answer_does_not_satisfies_condition(self, base_answer: dict[str, str]) -> bool:
@@ -1,7 +1,10 @@
1
1
  from abc import ABC, abstractmethod
2
2
 
3
+ from typing import TypeVar, Generic
3
4
 
4
- class Question[T](ABC):
5
+ T = TypeVar("T")
6
+
7
+ class Question(Generic[T], ABC):
5
8
  def __init__(self, key: str, message: str) -> None:
6
9
  self._key = key
7
10
  self._message = message
@@ -1,3 +1,4 @@
1
+ from instant_python.question_prompter.question.boolean_question import BooleanQuestion
1
2
  from instant_python.question_prompter.question.choice_question import ChoiceQuestion
2
3
  from instant_python.question_prompter.question.conditional_question import (
3
4
  ConditionalQuestion,
@@ -17,12 +18,11 @@ class TemplateStep(Step):
17
18
  self._questions = [
18
19
  MultipleChoiceQuestion(
19
20
  key="built_in_features",
20
- message="Select the built-in features you want to include (fastapi_application option requires logger)",
21
+ message="Select the built-in features you want to include",
21
22
  options=[
22
23
  "value_objects",
23
24
  "github_actions",
24
25
  "makefile",
25
- "synchronous_sqlalchemy",
26
26
  "logger",
27
27
  "event_bus",
28
28
  "async_sqlalchemy",
@@ -40,18 +40,26 @@ class TemplateStep(Step):
40
40
  "standard_project",
41
41
  ],
42
42
  ),
43
- subquestions=[
44
- FreeTextQuestion(
45
- key="bounded_context",
46
- message="Enter the bounded context name",
47
- default="backoffice",
43
+ subquestions=ConditionalQuestion(
44
+ base_question=BooleanQuestion(
45
+ key="specify_bounded_context",
46
+ message="Do you want to specify your first bounded context?",
47
+ default=True,
48
48
  ),
49
- FreeTextQuestion(
50
- key="aggregate_name",
51
- message="Enter the aggregate name",
52
- default="user",
53
- ),
54
- ],
49
+ subquestions=[
50
+ FreeTextQuestion(
51
+ key="bounded_context",
52
+ message="Enter the bounded context name",
53
+ default="backoffice",
54
+ ),
55
+ FreeTextQuestion(
56
+ key="aggregate_name",
57
+ message="Enter the aggregate name",
58
+ default="user",
59
+ ),
60
+ ],
61
+ condition=True,
62
+ ),
55
63
  condition=TemplateTypes.DDD,
56
64
  ),
57
65
  ]
@@ -1,7 +1,7 @@
1
- from enum import StrEnum
1
+ from enum import Enum
2
2
 
3
3
 
4
- class TemplateTypes(StrEnum):
4
+ class TemplateTypes(str, Enum):
5
5
  DDD = "domain_driven_design"
6
6
  CLEAN = "clean_architecture"
7
7
  STANDARD = "standard_project"
@@ -20,6 +20,7 @@ class UserRequirements:
20
20
  git_email: str = field(default_factory=str)
21
21
  git_user_name: str = field(default_factory=str)
22
22
  dependencies: list[str] = field(default_factory=list)
23
+ specify_bounded_context: bool = field(default=False)
23
24
  bounded_context: str = field(default_factory=str)
24
25
  aggregate_name: str = field(default_factory=str)
25
26
  built_in_features: list[str] = field(default_factory=list)
@@ -5,8 +5,8 @@ from {{ source_name }}.{{ template_domain_import }}.event.domain_event import Do
5
5
  from {{ source_name }}.{{ template_domain_import }}.event.domain_event_subscriber import (
6
6
  DomainEventSubscriber,
7
7
  )
8
- from {{ source_name }}.{{ template_domain_import }}.exceptions.domain_event_type_not_found import (
9
- DomainEventTypeNotFound,
8
+ from {{ source_name }}.{{ template_domain_import }}.exceptions.domain_event_type_not_found_error import (
9
+ DomainEventTypeNotFoundError,
10
10
  )
11
11
 
12
12
 
@@ -23,6 +23,6 @@ class DomainEventJsonDeserializer:
23
23
  event_class = self._events_mapping.get(content["data"]["type"])
24
24
 
25
25
  if not event_class:
26
- raise DomainEventTypeNotFound(content["data"]["type"])
26
+ raise DomainEventTypeNotFoundError(content["data"]["type"])
27
27
 
28
28
  return event_class(**content["data"]["attributes"])
@@ -1,4 +1,5 @@
1
1
  {% set template_domain_import = "shared.domain"|compute_base_path(template) %}
2
+ {% if pythono_version in ["3.12", "3.13"] %}
2
3
  from abc import ABC, abstractmethod
3
4
 
4
5
  from {{ source_name }}.{{ template_domain_import }}.event.domain_event import DomainEvent
@@ -13,3 +14,21 @@ class DomainEventSubscriber[EventType: DomainEvent](ABC):
13
14
  @abstractmethod
14
15
  def on(self, event: EventType) -> None:
15
16
  raise NotImplementedError
17
+ {% else %}
18
+ from abc import ABC, abstractmethod
19
+ from typing import Generic, TypeVar
20
+
21
+ from {{ source_name }}.{{ template_domain_import }}.event.domain_event import DomainEvent
22
+
23
+ EventType = TypeVar("EventType", bound=DomainEvent)
24
+
25
+ class DomainEventSubscriber(Generic[EventType], ABC):
26
+ @staticmethod
27
+ @abstractmethod
28
+ def subscribed_to() -> list[type[EventType]]:
29
+ raise NotImplementedError
30
+
31
+ @abstractmethod
32
+ def on(self, event: EventType) -> None:
33
+ raise NotImplementedError
34
+ {% endif %}
@@ -6,5 +6,5 @@ from {{ source_name }}.{{ template_domain_import }}.event.domain_event import Do
6
6
 
7
7
  class EventBus(ABC):
8
8
  @abstractmethod
9
- def publish(self, events: list[DomainEvent]) -> None:
9
+ async def publish(self, events: list[DomainEvent]) -> None:
10
10
  raise NotImplementedError
@@ -1,7 +1,14 @@
1
+ {% if python_version in ["3.13", "3.12", "3.11"] %}
1
2
  from enum import StrEnum
2
3
 
3
4
 
4
5
  class ExchangeType(StrEnum):
6
+ {% else %}
7
+ from enum import Enum
8
+
9
+
10
+ class ExchangeType(str, Enum):
11
+ {% endif %}
5
12
  TOPIC = "topic"
6
13
  DIRECT = "direct"
7
14
  FANOUT = "fanout"
@@ -2,7 +2,7 @@
2
2
  from {{ source_name }}.{{ template_domain_import }}.exceptions.domain_error import DomainError
3
3
 
4
4
 
5
- class DomainEventTypeNotFound(DomainError):
5
+ class DomainEventTypeNotFoundError(DomainError):
6
6
  def __init__(self, name: str) -> None:
7
7
  self._message = f"Event type {name} not found among subscriber."
8
8
  self._type = "domain_event_type_not_found"
@@ -0,0 +1,17 @@
1
+ {% set template_domain_import = "shared.domain"|compute_base_path(template) %}
2
+ from {{ source_name }}.{{ template_domain_import }}.exceptions.domain_error import DomainError
3
+
4
+
5
+ class RabbitMqConnectionNotEstablishedError(DomainError):
6
+ def __init__(self) -> None:
7
+ self._message = "RabbitMQ connection not established."
8
+ self._type = "rabbit_mq_connection"
9
+ super().__init__(self._message)
10
+
11
+ @property
12
+ def type(self) -> str:
13
+ return self._type
14
+
15
+ @property
16
+ def message(self) -> str:
17
+ return self._message
@@ -1,18 +1,25 @@
1
1
  {% set template_domain_import = "shared.domain"|compute_base_path(template) %}
2
2
  {% set template_infra_import = "shared.infra"|compute_base_path(template) %}
3
- from typing import Type, TypeVar
3
+ {% if python_version in ["3.13", "3.12", "3.11"] %}
4
+ from typing import TypeVar
5
+ {% else %}
6
+ from typing import TypeVar, Generic
7
+ {% endif %}
4
8
 
5
- from {{ source_name }}.{{ template_domain_import }}.value_objects.uuid import Uuid
9
+ from {{ source_name }}.{{ template_domain_import }}.value_object.uuid import Uuid
6
10
  from {{ source_name }}.{{ template_infra_import }}.persistence.sqlalchemy.base import Base
7
11
  from {{ source_name }}.{{ template_infra_import }}.persistence.sqlalchemy.session_maker import (
8
12
  SessionMaker,
9
13
  )
10
14
 
11
15
  Entity = TypeVar("Entity")
12
-
13
-
14
- class SqlAlchemyRepository[Model: Base]:
15
- _model_class: Type[Model]
16
+ {% if python_version in ["3.13", "3.12", "3.11"] %}
17
+ class SqlAlchemyRepository[Model: Base]:
18
+ {% else %}
19
+ Model = TypeVar("Model", bound=Base)
20
+ class SqlAlchemyRepository(Generic[Model]):
21
+ {% endif %}
22
+ _model_class: type[Model]
16
23
  _session_maker: SessionMaker
17
24
 
18
25
  def __init__(self, session_maker: SessionMaker, model_class: Type[Model]) -> None:
@@ -2,7 +2,7 @@
2
2
  from {{ source_name }}.{{ template_domain_import }}.exceptions.invalid_negative_value_error import (
3
3
  InvalidNegativeValueError,
4
4
  )
5
- from {{ source_name }}.{{ template_domain_import }}.value_objects.value_object import ValueObject
5
+ from {{ source_name }}.{{ template_domain_import }}.value_object.value_object import ValueObject
6
6
 
7
7
 
8
8
  class IntValueObject(ValueObject[int]):
@@ -5,7 +5,7 @@ from {{ source_name }}.{{ template_domain_import }}.exceptions.incorrect_value_t
5
5
  from {{ source_name }}.{{ template_domain_import }}.exceptions.required_value_error import (
6
6
  RequiredValueError,
7
7
  )
8
- from {{ source_name }}.{{ template_domain_import }}.value_objects.value_object import ValueObject
8
+ from {{ source_name }}.{{ template_domain_import }}.value_object.value_object import ValueObject
9
9
 
10
10
 
11
11
  class StringValueObject(ValueObject[str]):
@@ -4,7 +4,7 @@ from uuid import UUID
4
4
  from {{ source_name }}.{{ template_domain_import }}.exceptions.required_value_error import (
5
5
  RequiredValueError,
6
6
  )
7
- from {{ source_name }}.{{ template_domain_import }}.value_objects.value_object import ValueObject
7
+ from {{ source_name }}.{{ template_domain_import }}.value_object.value_object import ValueObject
8
8
 
9
9
 
10
10
  class Uuid(ValueObject[str]):
@@ -1,7 +1,7 @@
1
+ {% if python_version in ["3.13", "3.12", "3.11"] %}
1
2
  from abc import ABC, abstractmethod
2
3
  from typing import override
3
4
 
4
-
5
5
  class ValueObject[T](ABC):
6
6
  _value: T
7
7
 
@@ -17,5 +17,32 @@ class ValueObject[T](ABC):
17
17
  return self._value
18
18
 
19
19
  @override
20
- def __eq__(self, other: "ValueObject[T]") -> bool:
20
+ def __eq__(self, other: object) -> bool:
21
+ if not isinstance(other, ValueObject):
22
+ return False
23
+ return self.value == other.value
24
+ {% else %}
25
+ from abc import ABC, abstractmethod
26
+ from typing import TypeVar, Generic
27
+
28
+ T = TypeVar("T")
29
+
30
+ class ValueObject(Generic[T], ABC):
31
+ _value: T
32
+
33
+ def __init__(self, value: T) -> None:
34
+ self._validate(value)
35
+ self._value = value
36
+
37
+ @abstractmethod
38
+ def _validate(self, value: T) -> None: ...
39
+
40
+ @property
41
+ def value(self) -> T:
42
+ return self._value
43
+
44
+ def __eq__(self, other: object) -> bool:
45
+ if not isinstance(other, ValueObject):
46
+ return False
21
47
  return self.value == other.value
48
+ {% endif %}
@@ -36,13 +36,13 @@
36
36
  {% if "event_bus" in built_in_features %}
37
37
  {{ macros.include_and_indent("project_structure/event_bus_infra.yml.j2", 8) }}
38
38
  {% endif %}
39
- {% if "logger" in built_in_features %}
39
+ {% if ["logger", "fastapi_application"] | is_in(built_in_features) %}
40
40
  {{ macros.include_and_indent("project_structure/logger.yml.j2", 8) }}
41
41
  {% endif %}
42
42
  {% if "async_sqlalchemy" in built_in_features %}
43
43
  {{ macros.include_and_indent("project_structure/async_sqlalchemy.yml.j2", 8) }}
44
44
  {% endif %}
45
- {% if "async_alembic" in built_in_features %}
45
+ {% if ["async_alembic", "fastapi_application"] | is_in(built_in_features) %}
46
46
  {{ macros.include_and_indent("project_structure/alembic_migrator.yml.j2", 8) }}
47
47
  {% endif %}
48
48
  {% if "fastapi_application" in built_in_features %}
@@ -38,13 +38,13 @@
38
38
  {% if "event_bus" in built_in_features %}
39
39
  {{ macros.include_and_indent("project_structure/event_bus_infra.yml.j2", 12) }}
40
40
  {% endif %}
41
- {% if "logger" in built_in_features %}
41
+ {% if ["logger", "fastapi_application"] | is_in(built_in_features) %}
42
42
  {{ macros.include_and_indent("project_structure/logger.yml.j2", 12) }}
43
43
  {% endif %}
44
44
  {% if "async_sqlalchemy" in built_in_features %}
45
45
  {{ macros.include_and_indent("project_structure/async_sqlalchemy.yml.j2", 12) }}
46
46
  {% endif %}
47
- {% if "async_alembic" in built_in_features %}
47
+ {% if ["async_alembic", "fastapi_application"] | is_in(built_in_features) %}
48
48
  {{ macros.include_and_indent("project_structure/alembic_migrator.yml.j2", 12) }}
49
49
  {% endif %}
50
50
  {% if "fastapi_application" in built_in_features %}
@@ -52,4 +52,6 @@
52
52
  {% endif %}
53
53
  {% endif %}
54
54
  {% endif %}
55
- {{ macros.include_and_indent("project_structure/domain_driven_design/bounded_context.yml.j2", 4) }}
55
+ {% if specify_bounded_context %}
56
+ {{ macros.include_and_indent("project_structure/domain_driven_design/bounded_context.yml.j2", 4) }}
57
+ {% endig %}
@@ -23,4 +23,6 @@
23
23
  type: file
24
24
  extension: .py
25
25
  {% endif %}
26
+ {% if specify_bounded_context %}
26
27
  {{ macros.include_and_indent("project_structure/domain_driven_design/bounded_context.yml.j2", 4) }}
28
+ {% endig %}
@@ -22,5 +22,8 @@
22
22
  python: True
23
23
  children:
24
24
  - name: exceptions/domain_event_type_not_found_error
25
+ type: file
26
+ extension: .py
27
+ - name: exceptions/rabbit_mq_connection_not_established_error
25
28
  type: file
26
29
  extension: .py
@@ -14,13 +14,13 @@
14
14
  {% if "synchronous_sqlalchemy" in built_in_features %}
15
15
  {{ macros.include_and_indent("project_structure/synchronous_sqlalchemy.yml.j2", 4) }}
16
16
  {% endif %}
17
- {% if "logger" in built_in_features %}
17
+ {% if ["logger", "fastapi_application"] | is_in(built_in_features) %}
18
18
  {{ macros.include_and_indent("project_structure/logger.yml.j2", 4) }}
19
19
  {% endif %}
20
20
  {% if "async_sqlalchemy" in built_in_features %}
21
21
  {{ macros.include_and_indent("project_structure/async_sqlalchemy.yml.j2", 4) }}
22
22
  {% endif %}
23
- {% if "async_alembic" in built_in_features %}
23
+ {% if ["async_alembic", "fastapi_application"] | is_in(built_in_features) %}
24
24
  {{ macros.include_and_indent("project_structure/alembic_migrator.yml.j2", 4) }}
25
25
  {% endif %}
26
26
  {% if "fastapi_application" in built_in_features %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instant-python
3
- Version: 0.0.1
3
+ Version: 0.2.0
4
4
  Summary: Python automatic project generator
5
5
  Author-email: dimanu-py <diegomtz126@gmail.com>
6
6
  License: Apache License
@@ -205,7 +205,7 @@ License: Apache License
205
205
  See the License for the specific language governing permissions and
206
206
  limitations under the License.
207
207
  License-File: LICENSE
208
- Requires-Python: >=3.12
208
+ Requires-Python: >=3.9
209
209
  Requires-Dist: jinja2>=3.1.5
210
210
  Requires-Dist: pyyaml>=6.0.2
211
211
  Requires-Dist: questionary>=2.1.0
@@ -7,39 +7,38 @@ instant_python/installer/dependency_manager.py,sha256=0pVTtNPGUKFvLeFjiVlegIDU7S
7
7
  instant_python/installer/dependency_manager_factory.py,sha256=uAwpTK9ilCkaZ50d4hePWNndpK0fOHqEClRQmViJjnY,541
8
8
  instant_python/installer/git_configurer.py,sha256=di6kGnQ4TF5GSoXh2yXM7a1jg8QoFzD_YWq5HKWzYD8,1524
9
9
  instant_python/installer/installer.py,sha256=YV0PZ2wLC4bjpalvIqk7PEpLrFr_P7GSVJ_U8rnf7Ds,565
10
- instant_python/installer/managers.py,sha256=WMEy_LvQr_BXd08aGYGzx4RA2t-HfJSecmZ4CtZJBFg,102
11
- instant_python/installer/operating_systems.py,sha256=_MptmdE6StZJGHYvDZvsHv--tABqwSluuhpllc1yvpQ,124
12
- instant_python/installer/pdm_manager.py,sha256=sKYtri6IVaFPAsjMj-Su-5J4O7q_jr3qqj7geCfFvF4,2441
13
- instant_python/installer/uv_manager.py,sha256=OIpZZ10ZUSr7jue-b9xOChiU1swu-blnTOWUmiWL5Pg,2563
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
14
13
  instant_python/project_generator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- instant_python/project_generator/custom_template_manager.py,sha256=jfgZNhOGoykfZ5aEnHag39h4ep1QdWZ6YD3YSyzyOdQ,670
16
- instant_python/project_generator/default_template_manager.py,sha256=Jwjj1eyMVuxGArdDsU-BsRwc0W7mHwsOtviP0SPJRL0,1845
14
+ instant_python/project_generator/custom_template_manager.py,sha256=ApOBNU9hdOiQeaJhbr_RMdjm3B-vVLaXyvgj6XtbkZY,628
15
+ instant_python/project_generator/default_template_manager.py,sha256=UdhB7pTZLbShSOAEHWl-l35dLfV0XU4fF69HMBfMw3U,1802
17
16
  instant_python/project_generator/directory.py,sha256=nJoxOd2RQUJoNkML3Dh7JqhR_xp0czasBXRE2WvW-kQ,747
18
- instant_python/project_generator/file.py,sha256=JLS7e4XAOfLy2wmGqknFcThkt2kWrAKAAjniwxabocM,749
17
+ instant_python/project_generator/file.py,sha256=UVB8oNd2_00wd7t_3aDxQchwq8bDvCM_NfcfCS6ocmo,749
19
18
  instant_python/project_generator/folder_tree.py,sha256=ULAY3M2d33s9O0JbWoaO1SP8n5lRG-XbdC8NBYf-Z2U,1509
20
19
  instant_python/project_generator/jinja_custom_filters.py,sha256=uXHmcTvhcVYJeG5EhTFfacIFs7Pu9F5YOPo2144LYpM,638
21
- instant_python/project_generator/node.py,sha256=GEuk40a0AvrU2wfgwoX-bI7KZG-0xL-WB9w5tzrjkS0,279
20
+ instant_python/project_generator/node.py,sha256=dgPFwTKCiGEV6K6Y4nE0zlz0cgJ-yJafszoY-xKdbts,278
22
21
  instant_python/project_generator/project_generator.py,sha256=49MoeVe2eNegB5hLFjD7xtRIXpUhi5ioKq9VrBtm30o,984
23
22
  instant_python/project_generator/template_manager.py,sha256=LhN56T04QlRZv0DXUIl9yx3y1OFq_S9Zq8efxgNHSVI,175
24
23
  instant_python/question_prompter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
24
  instant_python/question_prompter/question_wizard.py,sha256=sRxECDBgHhDSWch8zan1Pd_XuLVdoGcaSB5SWXfSBso,476
26
- instant_python/question_prompter/template_types.py,sha256=Sgb7da0RHUxhpMLA_6_pK-p2Nb1aF4-3l_GlAayMdUM,148
27
- instant_python/question_prompter/user_requirements.py,sha256=Qm0TRyJbJXvE7QruPIi5eNmC7ol0k9_cPhYk5DfnkoU,1162
25
+ instant_python/question_prompter/template_types.py,sha256=HzqlryyB5KRBnCmqnDy-4Z-Kn3aTBC3wlrDWwDLdbXs,147
26
+ instant_python/question_prompter/user_requirements.py,sha256=l9q5P_xn4Ii3TtctVG1J8B6J5nNuSynrivPVu6s02QQ,1219
28
27
  instant_python/question_prompter/question/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
28
  instant_python/question_prompter/question/boolean_question.py,sha256=SUWotn15hPP8njqCJ3J1FYBtQ4cQ79e5laB3YObZjo8,430
30
29
  instant_python/question_prompter/question/choice_question.py,sha256=HeiyhihVngEcJmRW784RS1rAG8RaBua52Watb6bpVio,592
31
- instant_python/question_prompter/question/conditional_question.py,sha256=QfsB75V8lL6Zl6ROaiqxuyDKCJg_l5b04yLwo7PE3Bo,876
30
+ instant_python/question_prompter/question/conditional_question.py,sha256=_xwrOzCkKAiTM12cakfcv_4FPK4_6pE60Hrozevh5zs,1080
32
31
  instant_python/question_prompter/question/dependencies_question.py,sha256=kI1UiFWh-WOkmN1FtoLg7IKT14FDSc4_HKhRMNCFrYs,1566
33
32
  instant_python/question_prompter/question/free_text_question.py,sha256=LnY7kttSJGGvcja0g-2CapxFXR3ulHCAfUTQ6MP34xg,462
34
33
  instant_python/question_prompter/question/multiple_choice_question.py,sha256=smMCE0PDbxrUFiIjOWi3ylFWg0_7VZ7D8m1m3_qImE4,457
35
- instant_python/question_prompter/question/question.py,sha256=UUAK2dgYq3gEZHTfkOeOSmU9EgUj55WvPU25_cewg9E,334
34
+ instant_python/question_prompter/question/question.py,sha256=9YLK3AdIGnumOZO-C237lCr5MmQhixOtMoUjx3FvBiY,397
36
35
  instant_python/question_prompter/step/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
36
  instant_python/question_prompter/step/dependencies_step.py,sha256=9TNj0OJwh2TL6bMFxuRfxRoG-AUq91bV9IVGP5zrgy0,613
38
37
  instant_python/question_prompter/step/general_custom_template_project_step.py,sha256=4pZzAhvXBTgdW_XE4JNYvdXPMtEoUX9KRpKPbGq8heU,1347
39
38
  instant_python/question_prompter/step/general_project_step.py,sha256=e1NCVA7jDGfgaoxOINjSPhYkxTEvWuqQpeN_ClDAwRU,1879
40
39
  instant_python/question_prompter/step/git_step.py,sha256=_Lrz43uLrxCWXjHX8szKovlVBXYXfRRmWbh8Nst_1SU,1051
41
40
  instant_python/question_prompter/step/steps.py,sha256=KKjIj-5AmtRjZ58vv4Z8IRFa1gwbFpe0pYGWgj2ABI4,384
42
- instant_python/question_prompter/step/template_step.py,sha256=1novG9OeOs3jBbG_DPn5WQ08xpVx_roj3DW7Rb82C-Q,2329
41
+ instant_python/question_prompter/step/template_step.py,sha256=Pjo1xUYl1Rt5KTCx4zS_ocSGkeHCglZv8XKcl7yJRxU,2731
43
42
  instant_python/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
43
  instant_python/templates/boilerplate/.gitignore,sha256=uViK8iDiHZGpnnvM3TpgrDwXlBk16wjMIndS8XDtWYE,3035
45
44
  instant_python/templates/boilerplate/.pre-commit-config.yml,sha256=bOJLrQ_0LqFxHDZeJKbs2FDKE2lxnHzWtYM1CgLSDjM,823
@@ -52,11 +51,11 @@ instant_python/templates/boilerplate/random_generator.py,sha256=WHyhk9xfRsziGH1P
52
51
  instant_python/templates/boilerplate/event_bus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
52
  instant_python/templates/boilerplate/event_bus/aggregate_root.py,sha256=JgmBSYMXfh6P3twKW_HznYq8_kNHupmgPoRHSmlSA2Q,571
54
53
  instant_python/templates/boilerplate/event_bus/domain_event.py,sha256=aD4UGS4HWQwQvyfdKLpWN1emDfHUS6NQbYlGXRHVDas,312
55
- instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py,sha256=XBHPw93j-D-xk0l35bCil_z9fWn7BlaDHubpMqXjzX8,1036
54
+ instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py,sha256=gls8ZNGlFzFfd9ze8a9lbPgYARPJkUjsTHqGB5QRpZk,1052
56
55
  instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py,sha256=BP7sJ05uec-ZVhuOpBrpTFkgMAt0M134jBCSTRlzYbQ,493
57
- instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py,sha256=SUPz8wfs5ZGDi3zPLPzOY7cAv-QlpvOUaJhQX0o47qg,487
58
- instant_python/templates/boilerplate/event_bus/event_bus.py,sha256=QH9T3q7j01QqZ9AE0dTmyFKToUKorE-MczJ0SdIZKJE,341
59
- instant_python/templates/boilerplate/event_bus/exchange_type.py,sha256=b4OKbJgd_i0tY2YxqD8pC8nUOY9LXzuFJGdCZGXOe88,120
56
+ instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py,sha256=MZUHF_DlxgvpP3HotpjUefiN6CN9V5-cTB7tvsfjowc,1047
57
+ instant_python/templates/boilerplate/event_bus/event_bus.py,sha256=_mojP9FAzbFRDYvjdS5XXOYOTKgUKTYywZX-fv8nao4,347
58
+ instant_python/templates/boilerplate/event_bus/exchange_type.py,sha256=9R79QpuSpY3jvGHw0lZptpN4Rc9mT8ySEl-rxOEblFc,250
60
59
  instant_python/templates/boilerplate/event_bus/mock_event_bus.py,sha256=0DRRsAs66oWF6hsiCyIMBJbeXptCODJr0MoAeoulang,635
61
60
  instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py,sha256=F3TpTileJfm87s-5wd8J7BCWab5z27WOd0orVL60k5M,2085
62
61
  instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py,sha256=agFzKBTNjKPDMkePZ8fSwg3nZunAhAGa5OoqqWB9GRc,3003
@@ -66,10 +65,11 @@ instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py,sha2
66
65
  instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py,sha256=0oOoAU0m9Jwo6CmBlGpEiFXU7lvIILI0OfkB9W7RNG4,131
67
66
  instant_python/templates/boilerplate/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
67
  instant_python/templates/boilerplate/exceptions/domain_error.py,sha256=XkgOt_5SpZ-0R73KYJ61TenXT8b0wCvoC4ZEge9ierI,283
69
- instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py,sha256=e6ZW_YCz0PaWdvZQE0Skr91jPYk9vjBwITQe9WFpgfQ,524
68
+ instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py,sha256=iV3-7B-7V1xCnezrHlEObGXrzfui5s_4jvNABv75uMQ,529
70
69
  instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py,sha256=to3-XOiMqvG1F7Mh_9KKsGzFx88pvAVow-NW9KNvffg,615
71
70
  instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py,sha256=lkWizihdUsctYeev_M0iCw3_L7VkhKsUSyAwa-91Sgs,481
72
71
  instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py,sha256=Dp8l4K_77XgJ0DL1r0sLnYSPmai-Mw7CQAxJfmfSq80,553
72
+ instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py,sha256=9ariPxfnIbkDEiCm3zCil7otDZ9-NgQIVMnk680S4TM,509
73
73
  instant_python/templates/boilerplate/exceptions/required_value_error.py,sha256=l9RPCq0b8FSs1qa49hms9v-oj_pnx3V2SiTIi89TC9M,526
74
74
  instant_python/templates/boilerplate/fastapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  instant_python/templates/boilerplate/fastapi/application.py,sha256=Fk6TcWY-XUa033HOsvgFR_sgaNPodVNJs2b3tSBopLg,1075
@@ -95,7 +95,7 @@ instant_python/templates/boilerplate/persistence/async/script.py.mako,sha256=Btn
95
95
  instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py,sha256=tXGKrs5fWIQG6An5I7KUO-7OCfr5ltNrHUIAd4R-kdU,1201
96
96
  instant_python/templates/boilerplate/persistence/synchronous/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
97
  instant_python/templates/boilerplate/persistence/synchronous/session_maker.py,sha256=5SiWm3i13MlG9tiHp-sJmwYzZ9dcyXDfPGeVZTiKlTw,622
98
- instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py,sha256=pT6rboTypG1QTq4O9bb5tEISZJR_NwA21uXdIeXrN4M,1271
98
+ instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py,sha256=pyt7o-5eWlW9waXloQx6RaqZ-gAgZcUKwZq7UH6TZUo,1530
99
99
  instant_python/templates/boilerplate/scripts/add_dependency.sh,sha256=dCugtjr8SJyJOo10Cw3amuvn-D1DdRwhleVJ_F2XbRY,731
100
100
  instant_python/templates/boilerplate/scripts/create_aggregate.py,sha256=dgMCAtJEJjfvuvTMegjXgVGI86jupZN_z7q1fOoopNU,1061
101
101
  instant_python/templates/boilerplate/scripts/insert_template.py,sha256=nkzSXIIj-KdQ30B_4tjut0LKeZNPUyy419A7YU6hVCw,4276
@@ -108,14 +108,14 @@ instant_python/templates/boilerplate/scripts/pre-push,sha256=2UpPIkPTnwO8UusCAij
108
108
  instant_python/templates/boilerplate/scripts/remove_dependency.sh,sha256=1NRVBCCCQZeAX7YYKzQ0AEpq_OlGt-S_6selTePVUJw,707
109
109
  instant_python/templates/boilerplate/scripts/unit.sh,sha256=XTlSZOYixobNqcdgtNVbhiLA9esodg8kMljEKCcZFNo,1107
110
110
  instant_python/templates/boilerplate/value_object/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- instant_python/templates/boilerplate/value_object/int_value_object.py,sha256=NIiCZXTWOpNSuoaYwxck1hG86RW1OrZfVZ1oaMtVAjw,450
112
- instant_python/templates/boilerplate/value_object/string_value_object.py,sha256=BvSNVkqw6udfq_eDWbsbn1osFxrl86o3CznzjfUE3-E,737
113
- instant_python/templates/boilerplate/value_object/uuid.py,sha256=YVdeKnafMAvzR89WjV5rXjat6ji-j24ksCr0YkDys5s,556
114
- instant_python/templates/boilerplate/value_object/value_object.py,sha256=AnEipWbge20rGbNfQzz6ftZ9nWCqlqz8eIHx6nf-fQQ,407
111
+ instant_python/templates/boilerplate/value_object/int_value_object.py,sha256=BpIEEfevEmJ8HSV8MVFqpJV0KLwi827P7gEg-QpW36o,449
112
+ instant_python/templates/boilerplate/value_object/string_value_object.py,sha256=eGrqGH88kZMZ2Kfo4jbsHro9Lr9amPPCgX_XvU6ClEE,736
113
+ instant_python/templates/boilerplate/value_object/uuid.py,sha256=nCAqo43IgdvCUNBJeXxty_B15wZkpfn0RX4d4BH2XRI,555
114
+ instant_python/templates/boilerplate/value_object/value_object.py,sha256=7EUE9fiTpdSgQ3FrgL7KiGZUGBKczJ3HquDqocEmVog,1007
115
115
  instant_python/templates/project_structure/alembic_migrator.yml.j2,sha256=dYkBJj1O2_bTjw6einWkijjPV-xRUpdUkGa0ZHgTP5E,66
116
116
  instant_python/templates/project_structure/async_alembic.yml.j2,sha256=YQMMZxueHFQPF9v0AQ1yjFOyvXHhsyI8gHd2AilG8dw,467
117
117
  instant_python/templates/project_structure/async_sqlalchemy.yml.j2,sha256=zpVnHtNOSWQqVP5lejRciHakCEMIppjv1EKqMA3bDY4,423
118
- instant_python/templates/project_structure/event_bus_domain.yml.j2,sha256=uVO8rEhmdZRSE0Ng0JoR3cCYCtDuiCiW5i4Y9g_L1ic,581
118
+ instant_python/templates/project_structure/event_bus_domain.yml.j2,sha256=0rXXuhyBWZUm_RIHq0yFonkbpdvXGB5QEkLoQkDX9bs,685
119
119
  instant_python/templates/project_structure/event_bus_infra.yml.j2,sha256=AQ8A525lZvusW5NiQew4eCzASAR2e65Bc5EUz3ENZeA,875
120
120
  instant_python/templates/project_structure/fastapi_app.yml.j2,sha256=k92dTeV2RpTDbhy_jxg6q0yXKhQHV9T-Nu1Fl7X6oNQ,193
121
121
  instant_python/templates/project_structure/fastapi_infra.yml.j2,sha256=fPreVwwnWUPTFhw2iWBO9TUYP5RZaAspIT6EMMV7je8,199
@@ -133,17 +133,17 @@ instant_python/templates/project_structure/python_version.yml.j2,sha256=eo400SNF
133
133
  instant_python/templates/project_structure/synchronous_sqlalchemy.yml.j2,sha256=bjfiKDNxi558fPzwF6RaZq1uoCMkKWJLB2L53acmFuY,431
134
134
  instant_python/templates/project_structure/value_objects.yml.j2,sha256=cPC-DHo8aaRwY8iVcFjxhto1HLVk9Kbybr_1r3BIr4Y,855
135
135
  instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2,sha256=gnN6jkyRhuNxC04X7EGa0TBYwJGUwX2Jv3OE3YLPKSc,1237
136
- instant_python/templates/project_structure/clean_architecture/source.yml.j2,sha256=eYzuQOf5sspDo0UnD0yk0aC9_C4g6MTo5za0BGUuyVE,2138
136
+ instant_python/templates/project_structure/clean_architecture/source.yml.j2,sha256=_iJjzVatJboCgJwzDRjPqyl6LXiVCZW2jE_xLr2_-HQ,2200
137
137
  instant_python/templates/project_structure/clean_architecture/test.yml.j2,sha256=-s_V1mPa_muydoUo2sZW70fUB4Z3O_YfwXl-A5V3ZH4,547
138
138
  instant_python/templates/project_structure/domain_driven_design/bounded_context.yml.j2,sha256=P1hOzOlWm-8ZEGQP-fV-5xk2CfTC0j2BizSStKCvETw,453
139
139
  instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2,sha256=lmKOIJv6GT0KjVZ9yiz7pCLBPY-Z9inwr5T4xxbFuus,1241
140
- instant_python/templates/project_structure/domain_driven_design/source.yml.j2,sha256=CpfzsXm9FLzsJZCSB_IEf25NXl9aQFF3zNuFKA_6mns,2523
141
- instant_python/templates/project_structure/domain_driven_design/test.yml.j2,sha256=vOoIpjgL7OpTg_-NbuJ8eTNDjRw351fOHDezGU0C7NE,747
140
+ instant_python/templates/project_structure/domain_driven_design/source.yml.j2,sha256=OsZQp67BLLVLwknf_I75adCq1WnD9ndMjifmwqhZk2w,2638
141
+ instant_python/templates/project_structure/domain_driven_design/test.yml.j2,sha256=m9Z6EhY0Hwc2QjicT3ONSKvmj5ZcyyT-11IHKwxMvDw,799
142
142
  instant_python/templates/project_structure/standard_project/main_structure.yml.j2,sha256=SG0R4_DPIkb8CCyPfFw7xoId7fmRq_lm9DTaL6MJK18,1234
143
- instant_python/templates/project_structure/standard_project/source.yml.j2,sha256=BJYCqEKtKq1TPRE98nrM5Di1psPLlRZg67qvD5m2kvk,1524
143
+ instant_python/templates/project_structure/standard_project/source.yml.j2,sha256=tqD9AsAAzPhulWmRrUW7k3F0eguhAKvNc_p5faQCfRg,1586
144
144
  instant_python/templates/project_structure/standard_project/test.yml.j2,sha256=OvSSn9tQcK3ctTXaOIr_bL6QdgUNrcs518LmnStqxaE,348
145
- instant_python-0.0.1.dist-info/METADATA,sha256=ZUR5hON9VMZ0hzJqtBKmWphmK5qd51quY8zRm6EtgK0,15883
146
- instant_python-0.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
147
- instant_python-0.0.1.dist-info/entry_points.txt,sha256=EdBTj3b3N9Pa4oNzPLPivE_AnMcQIFsmRC3RsSkoLLA,47
148
- instant_python-0.0.1.dist-info/licenses/LICENSE,sha256=kf7wA-1IsqXkzXjlsG95sdQJtsqUON_lNXombfPlklo,11353
149
- instant_python-0.0.1.dist-info/RECORD,,
145
+ instant_python-0.2.0.dist-info/METADATA,sha256=Y5buM47xtTPnPxJQ1lIUEI7uVxhMYt4Av2HxyOhNnXM,15882
146
+ instant_python-0.2.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
147
+ instant_python-0.2.0.dist-info/entry_points.txt,sha256=EdBTj3b3N9Pa4oNzPLPivE_AnMcQIFsmRC3RsSkoLLA,47
148
+ instant_python-0.2.0.dist-info/licenses/LICENSE,sha256=kf7wA-1IsqXkzXjlsG95sdQJtsqUON_lNXombfPlklo,11353
149
+ instant_python-0.2.0.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- from enum import StrEnum
2
-
3
-
4
- class OperatingSystems(StrEnum):
5
- WINDOWS = "windows"
6
- MACOS = "macos"
7
- LINUX = "linux"