dars-framework 1.2.3__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.
- dars/__init__.py +0 -0
- dars/all.py +69 -0
- dars/cli/__init__.py +0 -0
- dars/cli/doctor/__init__.py +1 -0
- dars/cli/doctor/detect.py +154 -0
- dars/cli/doctor/doctor.py +176 -0
- dars/cli/doctor/installers.py +100 -0
- dars/cli/doctor/persist.py +62 -0
- dars/cli/doctor/preflight.py +33 -0
- dars/cli/doctor/ui.py +54 -0
- dars/cli/hot_reload.py +33 -0
- dars/cli/main.py +1107 -0
- dars/cli/preview.py +448 -0
- dars/cli/translations.py +531 -0
- dars/components/__init__.py +0 -0
- dars/components/advanced/__init__.py +8 -0
- dars/components/advanced/accordion.py +26 -0
- dars/components/advanced/card.py +33 -0
- dars/components/advanced/modal.py +45 -0
- dars/components/advanced/navbar.py +44 -0
- dars/components/advanced/table.py +25 -0
- dars/components/advanced/tabs.py +31 -0
- dars/components/basic/__init__.py +34 -0
- dars/components/basic/button.py +55 -0
- dars/components/basic/checkbox.py +35 -0
- dars/components/basic/container.py +29 -0
- dars/components/basic/datepicker.py +139 -0
- dars/components/basic/image.py +36 -0
- dars/components/basic/input.py +57 -0
- dars/components/basic/link.py +31 -0
- dars/components/basic/markdown.py +86 -0
- dars/components/basic/page.py +20 -0
- dars/components/basic/progressbar.py +18 -0
- dars/components/basic/radiobutton.py +35 -0
- dars/components/basic/select.py +82 -0
- dars/components/basic/slider.py +63 -0
- dars/components/basic/spinner.py +12 -0
- dars/components/basic/text.py +23 -0
- dars/components/basic/textarea.py +46 -0
- dars/components/basic/tooltip.py +19 -0
- dars/components/layout/__init__.py +0 -0
- dars/components/layout/anchor.py +13 -0
- dars/components/layout/flex.py +26 -0
- dars/components/layout/grid.py +45 -0
- dars/config.py +134 -0
- dars/core/__init__.py +0 -0
- dars/core/app.py +957 -0
- dars/core/component.py +284 -0
- dars/core/events.py +102 -0
- dars/core/js_bridge.py +99 -0
- dars/core/properties.py +127 -0
- dars/core/state.py +309 -0
- dars/dars_tests/apps_test/health_check.py +56 -0
- dars/dars_tests/run_tests.py +275 -0
- dars/dars_tests/tests/test_advanced_components.py +69 -0
- dars/dars_tests/tests/test_basic_components.py +88 -0
- dars/dars_tests/tests/test_core_and_cli.py +17 -0
- dars/dars_tests/tests/test_layout_components.py +58 -0
- dars/dars_tests/tests/test_version_check.py +21 -0
- dars/docs/__init__.py +0 -0
- dars/docs/app.md +290 -0
- dars/docs/cli.md +80 -0
- dars/docs/components.md +1679 -0
- dars/docs/custom_components.md +30 -0
- dars/docs/events.md +45 -0
- dars/docs/exporters.md +162 -0
- dars/docs/getting_started.md +79 -0
- dars/docs/index.md +18 -0
- dars/docs/scripts.md +593 -0
- dars/docs/state_management.md +57 -0
- dars/exporters/__init__.py +0 -0
- dars/exporters/base.py +96 -0
- dars/exporters/web/OLD/html_css_js_OLD4.py +1538 -0
- dars/exporters/web/OLD/html_css_js_old.py +1406 -0
- dars/exporters/web/OLD/html_css_js_old2.py +1406 -0
- dars/exporters/web/__init__.py +0 -0
- dars/exporters/web/html_css_js.py +2675 -0
- dars/exporters/web/vdom.py +251 -0
- dars/js_lib.py +206 -0
- dars/scripts/__init__.py +0 -0
- dars/scripts/dscript.py +26 -0
- dars/scripts/script.py +39 -0
- dars/security.py +195 -0
- dars/templates/__init__.py +0 -0
- dars/templates/__pycache__/__init__.cpython-311.pyc +0 -0
- dars/templates/examples/README.md +4 -0
- dars/templates/examples/__pycache__/dynamic_event_demo.cpython-311.pyc +0 -0
- dars/templates/examples/advanced/Modal_Demo/advanced_modal_demo.py +275 -0
- dars/templates/examples/advanced/SimpleDashboard/dashboard.py +437 -0
- dars/templates/examples/advanced/SimpleModermWeb/modern_web_app.py +452 -0
- dars/templates/examples/advanced/VariousComponents/all_components_demo.py +87 -0
- dars/templates/examples/advanced/__init__.py +0 -0
- dars/templates/examples/advanced/dState/state_mods_demo.py +68 -0
- dars/templates/examples/basic/Forms/form_components.py +516 -0
- dars/templates/examples/basic/Forms/simple_form.py +379 -0
- dars/templates/examples/basic/HelloWorld/hello_world.py +56 -0
- dars/templates/examples/basic/Layouts/flex_layout_responsive.py +13 -0
- dars/templates/examples/basic/Layouts/grid_layout_responsive.py +12 -0
- dars/templates/examples/basic/Layouts/layout_multipage_demo.py +23 -0
- dars/templates/examples/basic/Multipage/multipage_example.py +67 -0
- dars/templates/examples/basic/PWA/icon-192x192.png +0 -0
- dars/templates/examples/basic/PWA/icon-512x512.png +0 -0
- dars/templates/examples/basic/PWA/pwa_custom_icons.py +33 -0
- dars/templates/examples/basic/__init__.py +0 -0
- dars/templates/examples/demo/__pycache__/complete_app.cpython-311.pyc +0 -0
- dars/templates/examples/demo/complete_app.py +21 -0
- dars/templates/examples/markdown/MarkdownTemplate/README.md +159 -0
- dars/templates/examples/markdown/MarkdownTemplate/markdown_template.py +21 -0
- dars/templates/examples/markdown/MarkdownTemplate/other_docs.md +1 -0
- dars/templates/examples/markdown/__init__.py +0 -0
- dars/templates/html/__init__.py +0 -0
- dars/version.py +2 -0
- dars_framework-1.2.3.dist-info/METADATA +15 -0
- dars_framework-1.2.3.dist-info/RECORD +118 -0
- dars_framework-1.2.3.dist-info/WHEEL +5 -0
- dars_framework-1.2.3.dist-info/entry_points.txt +2 -0
- dars_framework-1.2.3.dist-info/licenses/LICENSE +21 -0
- dars_framework-1.2.3.dist-info/top_level.txt +1 -0
dars/exporters/base.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Dict, Any
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
class Exporter(ABC):
|
|
6
|
+
"""Clase base para todos los exportadores"""
|
|
7
|
+
|
|
8
|
+
def __init__(self):
|
|
9
|
+
self.templates_path = os.path.join(os.path.dirname(__file__), "..", "templates")
|
|
10
|
+
|
|
11
|
+
@abstractmethod
|
|
12
|
+
def export(self, app: 'App', output_path: str) -> bool:
|
|
13
|
+
"""Exporta la aplicación al formato específico"""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def render_component(self, component: 'Component') -> str:
|
|
18
|
+
"""Renderiza un componente individual"""
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
def load_template(self, template_name: str) -> str:
|
|
22
|
+
"""Carga una plantilla desde el directorio de templates"""
|
|
23
|
+
template_path = os.path.join(self.templates_path, self.get_platform(), template_name)
|
|
24
|
+
try:
|
|
25
|
+
with open(template_path, 'r', encoding='utf-8') as f:
|
|
26
|
+
return f.read()
|
|
27
|
+
except FileNotFoundError:
|
|
28
|
+
raise FileNotFoundError(f"Plantilla no encontrada: {template_path}")
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def get_platform(self) -> str:
|
|
32
|
+
"""Retorna el nombre de la plataforma (html, react, etc.)"""
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
def create_output_directory(self, output_path: str):
|
|
36
|
+
"""Crea el directorio de salida si no existe"""
|
|
37
|
+
os.makedirs(output_path, exist_ok=True)
|
|
38
|
+
|
|
39
|
+
def write_file(self, file_path: str, content: str):
|
|
40
|
+
"""Escribe contenido a un archivo"""
|
|
41
|
+
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
|
42
|
+
with open(file_path, 'w', encoding='utf-8') as f:
|
|
43
|
+
f.write(content)
|
|
44
|
+
|
|
45
|
+
def copy_file(self, source_path: str, dest_path: str):
|
|
46
|
+
"""Copia un archivo de origen a destino"""
|
|
47
|
+
import shutil
|
|
48
|
+
os.makedirs(os.path.dirname(dest_path), exist_ok=True)
|
|
49
|
+
shutil.copy2(source_path, dest_path)
|
|
50
|
+
|
|
51
|
+
def render_styles(self, styles: Dict[str, Any]) -> str:
|
|
52
|
+
"""Convierte un diccionario de estilos a CSS"""
|
|
53
|
+
if not styles:
|
|
54
|
+
return ""
|
|
55
|
+
|
|
56
|
+
css_rules = []
|
|
57
|
+
for property_name, value in styles.items():
|
|
58
|
+
# Convertir snake_case a kebab-case
|
|
59
|
+
css_property = property_name.replace('_', '-')
|
|
60
|
+
css_rules.append(f"{css_property}: {value}")
|
|
61
|
+
|
|
62
|
+
return "; ".join(css_rules)
|
|
63
|
+
|
|
64
|
+
def generate_unique_id(self, component: 'Component', prefix: str = "component") -> str:
|
|
65
|
+
"""Genera un ID único para un componente si no tiene uno definido."""
|
|
66
|
+
if getattr(component, "id", None):
|
|
67
|
+
return component.id
|
|
68
|
+
|
|
69
|
+
# Si ya existe un mapping de este objeto en la sesión, usarlo
|
|
70
|
+
if not hasattr(self, "_component_ids"):
|
|
71
|
+
self._component_ids = {}
|
|
72
|
+
|
|
73
|
+
obj_key = id(component) # memoria (solo para lookup durante export actual)
|
|
74
|
+
|
|
75
|
+
if obj_key in self._component_ids:
|
|
76
|
+
return self._component_ids[obj_key]
|
|
77
|
+
|
|
78
|
+
# Nuevo id secuencial
|
|
79
|
+
if not hasattr(self, "_id_counter"):
|
|
80
|
+
self._id_counter = 0
|
|
81
|
+
self._id_counter += 1
|
|
82
|
+
|
|
83
|
+
unique = f"{prefix}_{self._id_counter}"
|
|
84
|
+
self._component_ids[obj_key] = unique
|
|
85
|
+
|
|
86
|
+
# Asignar también al componente
|
|
87
|
+
try:
|
|
88
|
+
component.id = unique
|
|
89
|
+
except Exception:
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
return unique
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|