mtcli 3.7.0.dev2__tar.gz → 3.7.0.dev4__tar.gz

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 (72) hide show
  1. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/PKG-INFO +1 -1
  2. mtcli-3.7.0.dev4/mtcli/plugin_loader.py +98 -0
  3. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/pyproject.toml +1 -1
  4. mtcli-3.7.0.dev2/mtcli/plugin_loader.py +0 -147
  5. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/LICENSE +0 -0
  6. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/README.md +0 -0
  7. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/__init__.py +0 -0
  8. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/cli.py +0 -0
  9. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/commands/__init__.py +0 -0
  10. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/commands/bars.py +0 -0
  11. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/commands/conf.py +0 -0
  12. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/conecta.py +0 -0
  13. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/conf.py +0 -0
  14. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/config_registre.py +0 -0
  15. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/data/__init__.py +0 -0
  16. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/data/base.py +0 -0
  17. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/data/csv.py +0 -0
  18. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/data/mt5.py +0 -0
  19. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/database.py +0 -0
  20. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/domain/__init__.py +0 -0
  21. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/domain/timeframe.py +0 -0
  22. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/logger.py +0 -0
  23. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/marketdata/__init__.py +0 -0
  24. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/marketdata/tick_cache.py +0 -0
  25. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/marketdata/tick_repository.py +0 -0
  26. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/__init__.py +0 -0
  27. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/bar_model.py +0 -0
  28. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/bars_model.py +0 -0
  29. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/chart_model.py +0 -0
  30. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/conf_model.py +0 -0
  31. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/consecutive_bars_model.py +0 -0
  32. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/rates_model.py +0 -0
  33. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/signals_model.py +0 -0
  34. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/models/unconsecutive_bar_model.py +0 -0
  35. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/mt5_context.py +0 -0
  36. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugin.py +0 -0
  37. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugin_manager.py +0 -0
  38. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/__init__.py +0 -0
  39. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/exemplo.py-dist +0 -0
  40. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/__init__.py +0 -0
  41. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/cli.py +0 -0
  42. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/conf.py +0 -0
  43. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/models/__init__.py +0 -0
  44. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
  45. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
  46. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
  47. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
  48. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/__init__.py +0 -0
  49. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/cli.py +0 -0
  50. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/conf.py +0 -0
  51. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/models/__init__.py +0 -0
  52. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
  53. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
  54. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
  55. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/__init__.py +0 -0
  56. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/cli.py +0 -0
  57. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/conf.py +0 -0
  58. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
  59. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
  60. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
  61. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
  62. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/__init__.py +0 -0
  63. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/close_view.py +0 -0
  64. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/full_view.py +0 -0
  65. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/high_view.py +0 -0
  66. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/low_view.py +0 -0
  67. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/min_view.py +0 -0
  68. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/open_view.py +0 -0
  69. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/ranges_view.py +0 -0
  70. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/rates_view.py +0 -0
  71. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/vars_view.py +0 -0
  72. {mtcli-3.7.0.dev2 → mtcli-3.7.0.dev4}/mtcli/views/volumes_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtcli
3
- Version: 3.7.0.dev2
3
+ Version: 3.7.0.dev4
4
4
  Summary: Aplicativo CLI para exibir gráficos do MetaTrader 5 screen reader friendly
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -0,0 +1,98 @@
1
+ """
2
+ Sistema de carregamento de plugins do mtcli.
3
+
4
+ Este módulo carrega automaticamente:
5
+
6
+ 1. Plugins internos localizados em `mtcli.plugins`
7
+ 2. Plugins externos registrados via entry points `mtcli.plugins`
8
+
9
+ Plugins devem expor uma função:
10
+
11
+ register(cli)
12
+
13
+ onde `cli` é o grupo principal do Click.
14
+ """
15
+
16
+ import importlib
17
+ import pkgutil
18
+
19
+ import click
20
+
21
+ try:
22
+ from importlib.metadata import entry_points
23
+ except ImportError: # Python < 3.10
24
+ from importlib_metadata import entry_points
25
+
26
+ import mtcli.plugins
27
+
28
+
29
+ def load_internal_plugins(cli: click.Group) -> None:
30
+ """
31
+ Carrega plugins internos do pacote `mtcli.plugins`.
32
+
33
+ Cada módulo encontrado deve expor a função:
34
+
35
+ register(cli)
36
+
37
+ Args:
38
+ cli: grupo principal do Click.
39
+ """
40
+
41
+ for module_info in pkgutil.iter_modules(mtcli.plugins.__path__):
42
+
43
+ module_name = f"mtcli.plugins.{module_info.name}"
44
+
45
+ module = importlib.import_module(module_name)
46
+
47
+ if hasattr(module, "register"):
48
+ module.register(cli)
49
+
50
+
51
+ def load_external_plugins(cli: click.Group) -> None:
52
+ """
53
+ Carrega plugins externos instalados via entry points.
54
+
55
+ Os plugins devem declarar no pyproject.toml:
56
+
57
+ [project.entry-points."mtcli.plugins"]
58
+ nome = "pacote.plugin:register"
59
+
60
+ Args:
61
+ cli: grupo principal do Click.
62
+ """
63
+
64
+ eps = entry_points()
65
+
66
+ plugins = (
67
+ eps.select(group="mtcli.plugins")
68
+ if hasattr(eps, "select")
69
+ else eps.get("mtcli.plugins", [])
70
+ )
71
+
72
+ for ep in plugins:
73
+
74
+ plugin = ep.load()
75
+
76
+ if callable(plugin) and not isinstance(plugin, click.Command):
77
+ plugin(cli)
78
+
79
+ elif isinstance(plugin, click.Command):
80
+ cli.add_command(plugin)
81
+
82
+ else:
83
+ raise TypeError(
84
+ f"Plugin {ep.name} inválido: deve ser um comando Click ou função register."
85
+ )
86
+
87
+
88
+ def load_plugins(cli: click.Group) -> None:
89
+ """
90
+ Carrega todos os plugins (internos e externos).
91
+
92
+ Args:
93
+ cli: grupo principal do Click.
94
+ """
95
+
96
+ load_internal_plugins(cli)
97
+ load_external_plugins(cli)
98
+
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mtcli"
3
- version = "3.7.0.dev2"
3
+ version = "3.7.0.dev4"
4
4
  description = "Aplicativo CLI para exibir gráficos do MetaTrader 5 screen reader friendly"
5
5
  authors = [
6
6
  {name = "Valmir França da Silva",email = "vfranca3@gmail.com"}
@@ -1,147 +0,0 @@
1
- """
2
- Sistema de carregamento de plugins do mtcli.
3
-
4
- Responsável por descobrir e registrar plugins externos
5
- instalados via entry points.
6
-
7
- Plugins devem declarar entry points no grupo:
8
-
9
- mtcli.plugins
10
- """
11
-
12
- from __future__ import annotations
13
-
14
- import logging
15
- from typing import Iterable, List
16
-
17
- import click
18
-
19
- try:
20
- from importlib.metadata import EntryPoint, entry_points
21
- except ImportError: # pragma: no cover
22
- from importlib_metadata import EntryPoint, entry_points
23
-
24
-
25
- logger = logging.getLogger(__name__)
26
-
27
- PLUGIN_GROUP = "mtcli.plugins"
28
-
29
-
30
- def discover_plugins() -> Iterable[EntryPoint]:
31
- """
32
- Descobre plugins registrados via entry points.
33
-
34
- Returns
35
- -------
36
- Iterable[EntryPoint]
37
- Entry points encontrados no grupo ``mtcli.plugins``.
38
- """
39
-
40
- try:
41
-
42
- # Python moderno
43
- try:
44
- return entry_points(group=PLUGIN_GROUP)
45
- except TypeError:
46
- # Compatibilidade Python antigo
47
- eps = entry_points()
48
-
49
- if hasattr(eps, "select"):
50
- return eps.select(group=PLUGIN_GROUP)
51
-
52
- return eps.get(PLUGIN_GROUP, [])
53
-
54
- except Exception as exc: # pragma: no cover
55
- logger.error("Erro ao descobrir plugins: %s", exc)
56
- return []
57
-
58
-
59
- def register_plugin(cli: click.Group, ep: EntryPoint) -> None:
60
- """
61
- Carrega e registra um plugin individual.
62
-
63
- O plugin pode expor:
64
-
65
- - função ``register(cli)``
66
- - objeto ``click.Command``
67
-
68
- Parameters
69
- ----------
70
- cli : click.Group
71
- CLI principal.
72
- ep : EntryPoint
73
- Entry point do plugin.
74
- """
75
-
76
- plugin = ep.load()
77
-
78
- if callable(plugin) and not isinstance(plugin, click.Command):
79
-
80
- plugin(cli)
81
-
82
- logger.debug(
83
- "Plugin '%s' registrado via função register() (%s)",
84
- ep.name,
85
- ep.value,
86
- )
87
-
88
- elif isinstance(plugin, click.Command):
89
-
90
- cli.add_command(plugin)
91
-
92
- logger.debug(
93
- "Plugin '%s' registrado como comando Click (%s)",
94
- ep.name,
95
- ep.value,
96
- )
97
-
98
- else:
99
-
100
- raise TypeError(
101
- f"Plugin '{ep.name}' inválido: "
102
- "não é click.Command nem função register(cli)"
103
- )
104
-
105
-
106
- def load_plugins(cli: click.Group) -> List[str]:
107
- """
108
- Descobre e carrega todos os plugins instalados.
109
-
110
- Parameters
111
- ----------
112
- cli : click.Group
113
- CLI principal do mtcli.
114
-
115
- Returns
116
- -------
117
- list[str]
118
- Lista de plugins carregados com sucesso.
119
- """
120
-
121
- loaded: List[str] = []
122
- seen = set()
123
-
124
- for ep in discover_plugins():
125
-
126
- if ep.name in seen:
127
- logger.warning("Plugin duplicado ignorado: %s", ep.name)
128
- continue
129
-
130
- try:
131
-
132
- register_plugin(cli, ep)
133
-
134
- seen.add(ep.name)
135
- loaded.append(ep.name)
136
-
137
- except Exception as exc:
138
-
139
- logger.error(
140
- "Falha ao carregar plugin '%s': %s",
141
- ep.name,
142
- exc,
143
- )
144
-
145
- logger.info("Plugins carregados: %d", len(loaded))
146
-
147
- return loaded
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes