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.
Files changed (118) hide show
  1. dars/__init__.py +0 -0
  2. dars/all.py +69 -0
  3. dars/cli/__init__.py +0 -0
  4. dars/cli/doctor/__init__.py +1 -0
  5. dars/cli/doctor/detect.py +154 -0
  6. dars/cli/doctor/doctor.py +176 -0
  7. dars/cli/doctor/installers.py +100 -0
  8. dars/cli/doctor/persist.py +62 -0
  9. dars/cli/doctor/preflight.py +33 -0
  10. dars/cli/doctor/ui.py +54 -0
  11. dars/cli/hot_reload.py +33 -0
  12. dars/cli/main.py +1107 -0
  13. dars/cli/preview.py +448 -0
  14. dars/cli/translations.py +531 -0
  15. dars/components/__init__.py +0 -0
  16. dars/components/advanced/__init__.py +8 -0
  17. dars/components/advanced/accordion.py +26 -0
  18. dars/components/advanced/card.py +33 -0
  19. dars/components/advanced/modal.py +45 -0
  20. dars/components/advanced/navbar.py +44 -0
  21. dars/components/advanced/table.py +25 -0
  22. dars/components/advanced/tabs.py +31 -0
  23. dars/components/basic/__init__.py +34 -0
  24. dars/components/basic/button.py +55 -0
  25. dars/components/basic/checkbox.py +35 -0
  26. dars/components/basic/container.py +29 -0
  27. dars/components/basic/datepicker.py +139 -0
  28. dars/components/basic/image.py +36 -0
  29. dars/components/basic/input.py +57 -0
  30. dars/components/basic/link.py +31 -0
  31. dars/components/basic/markdown.py +86 -0
  32. dars/components/basic/page.py +20 -0
  33. dars/components/basic/progressbar.py +18 -0
  34. dars/components/basic/radiobutton.py +35 -0
  35. dars/components/basic/select.py +82 -0
  36. dars/components/basic/slider.py +63 -0
  37. dars/components/basic/spinner.py +12 -0
  38. dars/components/basic/text.py +23 -0
  39. dars/components/basic/textarea.py +46 -0
  40. dars/components/basic/tooltip.py +19 -0
  41. dars/components/layout/__init__.py +0 -0
  42. dars/components/layout/anchor.py +13 -0
  43. dars/components/layout/flex.py +26 -0
  44. dars/components/layout/grid.py +45 -0
  45. dars/config.py +134 -0
  46. dars/core/__init__.py +0 -0
  47. dars/core/app.py +957 -0
  48. dars/core/component.py +284 -0
  49. dars/core/events.py +102 -0
  50. dars/core/js_bridge.py +99 -0
  51. dars/core/properties.py +127 -0
  52. dars/core/state.py +309 -0
  53. dars/dars_tests/apps_test/health_check.py +56 -0
  54. dars/dars_tests/run_tests.py +275 -0
  55. dars/dars_tests/tests/test_advanced_components.py +69 -0
  56. dars/dars_tests/tests/test_basic_components.py +88 -0
  57. dars/dars_tests/tests/test_core_and_cli.py +17 -0
  58. dars/dars_tests/tests/test_layout_components.py +58 -0
  59. dars/dars_tests/tests/test_version_check.py +21 -0
  60. dars/docs/__init__.py +0 -0
  61. dars/docs/app.md +290 -0
  62. dars/docs/cli.md +80 -0
  63. dars/docs/components.md +1679 -0
  64. dars/docs/custom_components.md +30 -0
  65. dars/docs/events.md +45 -0
  66. dars/docs/exporters.md +162 -0
  67. dars/docs/getting_started.md +79 -0
  68. dars/docs/index.md +18 -0
  69. dars/docs/scripts.md +593 -0
  70. dars/docs/state_management.md +57 -0
  71. dars/exporters/__init__.py +0 -0
  72. dars/exporters/base.py +96 -0
  73. dars/exporters/web/OLD/html_css_js_OLD4.py +1538 -0
  74. dars/exporters/web/OLD/html_css_js_old.py +1406 -0
  75. dars/exporters/web/OLD/html_css_js_old2.py +1406 -0
  76. dars/exporters/web/__init__.py +0 -0
  77. dars/exporters/web/html_css_js.py +2675 -0
  78. dars/exporters/web/vdom.py +251 -0
  79. dars/js_lib.py +206 -0
  80. dars/scripts/__init__.py +0 -0
  81. dars/scripts/dscript.py +26 -0
  82. dars/scripts/script.py +39 -0
  83. dars/security.py +195 -0
  84. dars/templates/__init__.py +0 -0
  85. dars/templates/__pycache__/__init__.cpython-311.pyc +0 -0
  86. dars/templates/examples/README.md +4 -0
  87. dars/templates/examples/__pycache__/dynamic_event_demo.cpython-311.pyc +0 -0
  88. dars/templates/examples/advanced/Modal_Demo/advanced_modal_demo.py +275 -0
  89. dars/templates/examples/advanced/SimpleDashboard/dashboard.py +437 -0
  90. dars/templates/examples/advanced/SimpleModermWeb/modern_web_app.py +452 -0
  91. dars/templates/examples/advanced/VariousComponents/all_components_demo.py +87 -0
  92. dars/templates/examples/advanced/__init__.py +0 -0
  93. dars/templates/examples/advanced/dState/state_mods_demo.py +68 -0
  94. dars/templates/examples/basic/Forms/form_components.py +516 -0
  95. dars/templates/examples/basic/Forms/simple_form.py +379 -0
  96. dars/templates/examples/basic/HelloWorld/hello_world.py +56 -0
  97. dars/templates/examples/basic/Layouts/flex_layout_responsive.py +13 -0
  98. dars/templates/examples/basic/Layouts/grid_layout_responsive.py +12 -0
  99. dars/templates/examples/basic/Layouts/layout_multipage_demo.py +23 -0
  100. dars/templates/examples/basic/Multipage/multipage_example.py +67 -0
  101. dars/templates/examples/basic/PWA/icon-192x192.png +0 -0
  102. dars/templates/examples/basic/PWA/icon-512x512.png +0 -0
  103. dars/templates/examples/basic/PWA/pwa_custom_icons.py +33 -0
  104. dars/templates/examples/basic/__init__.py +0 -0
  105. dars/templates/examples/demo/__pycache__/complete_app.cpython-311.pyc +0 -0
  106. dars/templates/examples/demo/complete_app.py +21 -0
  107. dars/templates/examples/markdown/MarkdownTemplate/README.md +159 -0
  108. dars/templates/examples/markdown/MarkdownTemplate/markdown_template.py +21 -0
  109. dars/templates/examples/markdown/MarkdownTemplate/other_docs.md +1 -0
  110. dars/templates/examples/markdown/__init__.py +0 -0
  111. dars/templates/html/__init__.py +0 -0
  112. dars/version.py +2 -0
  113. dars_framework-1.2.3.dist-info/METADATA +15 -0
  114. dars_framework-1.2.3.dist-info/RECORD +118 -0
  115. dars_framework-1.2.3.dist-info/WHEEL +5 -0
  116. dars_framework-1.2.3.dist-info/entry_points.txt +2 -0
  117. dars_framework-1.2.3.dist-info/licenses/LICENSE +21 -0
  118. 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
+