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.
- instant_python/installer/managers.py +2 -2
- instant_python/installer/pdm_manager.py +10 -3
- instant_python/installer/uv_manager.py +11 -0
- instant_python/project_generator/custom_template_manager.py +0 -2
- instant_python/project_generator/default_template_manager.py +0 -3
- instant_python/project_generator/file.py +1 -1
- instant_python/project_generator/node.py +2 -2
- instant_python/question_prompter/question/conditional_question.py +9 -3
- instant_python/question_prompter/question/question.py +4 -1
- instant_python/question_prompter/step/template_step.py +21 -13
- instant_python/question_prompter/template_types.py +2 -2
- instant_python/question_prompter/user_requirements.py +1 -0
- instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +3 -3
- instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +19 -0
- instant_python/templates/boilerplate/event_bus/event_bus.py +1 -1
- instant_python/templates/boilerplate/event_bus/exchange_type.py +7 -0
- instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +1 -1
- instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +17 -0
- instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +13 -6
- instant_python/templates/boilerplate/value_object/int_value_object.py +1 -1
- instant_python/templates/boilerplate/value_object/string_value_object.py +1 -1
- instant_python/templates/boilerplate/value_object/uuid.py +1 -1
- instant_python/templates/boilerplate/value_object/value_object.py +29 -2
- instant_python/templates/project_structure/clean_architecture/source.yml.j2 +2 -2
- instant_python/templates/project_structure/domain_driven_design/source.yml.j2 +5 -3
- instant_python/templates/project_structure/domain_driven_design/test.yml.j2 +2 -0
- instant_python/templates/project_structure/event_bus_domain.yml.j2 +3 -0
- instant_python/templates/project_structure/standard_project/source.yml.j2 +2 -2
- {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/METADATA +2 -2
- {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/RECORD +33 -33
- instant_python/installer/operating_systems.py +0 -7
- {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/WHEEL +0 -0
- {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/entry_points.txt +0 -0
- {instant_python-0.0.1.dist-info → instant_python-0.2.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -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(
|
|
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,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
|
-
|
|
20
|
-
|
|
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,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
|
|
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
|
-
|
|
45
|
-
key="
|
|
46
|
-
message="
|
|
47
|
-
default=
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
]
|
|
@@ -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.
|
|
9
|
-
|
|
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
|
|
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 %}
|
|
@@ -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
|
|
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
|
-
|
|
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 }}.
|
|
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
|
-
|
|
15
|
-
|
|
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 }}.
|
|
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 }}.
|
|
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 }}.
|
|
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:
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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
|
-
{
|
|
55
|
+
{% if specify_bounded_context %}
|
|
56
|
+
{{ macros.include_and_indent("project_structure/domain_driven_design/bounded_context.yml.j2", 4) }}
|
|
57
|
+
{% endig %}
|
|
@@ -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"
|
|
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"
|
|
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
|
|
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.
|
|
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=
|
|
11
|
-
instant_python/installer/
|
|
12
|
-
instant_python/installer/
|
|
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=
|
|
16
|
-
instant_python/project_generator/default_template_manager.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
27
|
-
instant_python/question_prompter/user_requirements.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
58
|
-
instant_python/templates/boilerplate/event_bus/event_bus.py,sha256=
|
|
59
|
-
instant_python/templates/boilerplate/event_bus/exchange_type.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
112
|
-
instant_python/templates/boilerplate/value_object/string_value_object.py,sha256=
|
|
113
|
-
instant_python/templates/boilerplate/value_object/uuid.py,sha256=
|
|
114
|
-
instant_python/templates/boilerplate/value_object/value_object.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
141
|
-
instant_python/templates/project_structure/domain_driven_design/test.yml.j2,sha256=
|
|
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=
|
|
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.
|
|
146
|
-
instant_python-0.0.
|
|
147
|
-
instant_python-0.0.
|
|
148
|
-
instant_python-0.0.
|
|
149
|
-
instant_python-0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|