|
1 | 1 | from typing import Dict, Any, List |
2 | 2 |
|
3 | | -from bot.strategies import Strategy |
4 | 3 | from bot.data import DataProvider |
5 | | -from bot import DependencyException, OperationalException |
6 | | -from bot.remote_loaders import StrategyRemoteLoader, DataProviderRemoteLoader |
| 4 | +from bot.constants import TimeUnit |
| 5 | +from bot import DependencyException |
| 6 | +from bot.remote_loaders import DataProviderRemoteLoader |
7 | 7 |
|
8 | 8 |
|
9 | 9 | def get_data_provider_configurations(config: Dict[str, Any]) -> List[Dict[str, Any]]: |
10 | | - data_provider_configurations = config.get('data_providers', {}) |
| 10 | + """ |
| 11 | + Function that validates and loads all the data provider definitions for the given configuration |
| 12 | + """ |
| 13 | + data_providers_configuration = config.get('data_providers', None) |
11 | 14 |
|
12 | | - entries = [] |
| 15 | + if data_providers_configuration is None: |
| 16 | + raise DependencyException("Data providers are not defined in the config. Please make sure that you " |
| 17 | + "define some data providers. If you have difficulties creating a data provider, " |
| 18 | + "please see the documentation for examples.") |
13 | 19 |
|
14 | | - if not data_provider_configurations: |
15 | | - raise DependencyException( |
16 | | - "Could not resolve data providers, please provide the data provider configurations in your config file. " |
17 | | - "You could also use de default data providers, that can be found in the data/data_provider/templates" |
18 | | - " directory. If you have difficulties creating your own data provider, please see the documentation" |
19 | | - ) |
20 | | - |
21 | | - for data_provider_entry in data_provider_configurations.keys(): |
22 | | - entry = { |
23 | | - 'key': data_provider_entry, |
24 | | - 'class_name': data_provider_configurations[data_provider_entry].get('class_name', None), |
25 | | - 'enabled': bool(data_provider_configurations[data_provider_entry].get('enabled', False)), |
26 | | - 'plugin': bool(data_provider_configurations[data_provider_entry].get('plugin', False)) |
27 | | - } |
28 | | - entries.append(entry) |
29 | | - |
30 | | - return entries |
31 | | - |
32 | | - |
33 | | -def get_strategy_configurations(config: Dict[str, Any]) -> List[Dict[str, Any]]: |
34 | | - strategy_configurations = config.get('strategies', {}) |
| 20 | + for data_provider_config in data_providers_configuration: |
35 | 21 |
|
36 | | - entries = [] |
37 | | - |
38 | | - if not strategy_configurations: |
39 | | - raise DependencyException( |
40 | | - "Could not resolve strategies, please provide the strategy configurations in your config file. " |
41 | | - "You could also use de default strategies, that can be found in the " |
42 | | - "strategies/strategy/templates directory. If you have difficulties creating " |
43 | | - "your own strategies, please see the documentation" |
| 22 | + assert data_provider_config.get('class_name', None) is not None, ( |
| 23 | + "Expected data provider to define a class_name. Please fix your data provider configuration." |
44 | 24 | ) |
45 | 25 |
|
46 | | - for strategy_entry in strategy_configurations.keys(): |
47 | | - entry = { |
48 | | - 'key': strategy_entry, |
49 | | - 'class_name': strategy_configurations[strategy_entry].get('class_name', None), |
50 | | - 'enabled': bool(strategy_configurations[strategy_entry].get('enabled', False)), |
51 | | - 'plugin': bool(strategy_configurations[strategy_entry].get('plugin', False)) |
52 | | - } |
53 | | - entries.append(entry) |
54 | | - |
55 | | - return entries |
56 | | - |
57 | | - |
58 | | -def get_data_provider_plugins(data_provider_configurations: List[Dict[str, Any]]) -> List[DataProvider]: |
59 | | - remote_loader = DataProviderRemoteLoader() |
60 | | - data_providers = [] |
61 | | - |
62 | | - for entry in data_provider_configurations: |
63 | | - |
64 | | - if not entry.get('enabled', False): |
65 | | - continue |
| 26 | + assert data_provider_config.get('schedule', None) is not None, ( |
| 27 | + "Expected data provider {} to define an schedule. Please fix your data provider " |
| 28 | + "configuration.".format(data_provider_config.get('class_name')) |
| 29 | + ) |
66 | 30 |
|
67 | | - if not entry.get('key', None): |
68 | | - raise DependencyException("Configured data provider must specify a identifier name") |
| 31 | + if not TimeUnit.ALWAYS.equals(data_provider_config.get('schedule')): |
69 | 32 |
|
70 | | - if not entry.get('class_name', None): |
71 | | - raise DependencyException( |
72 | | - "Configured data provider {} must specify a class name corresponding " |
73 | | - "to the data provider implementation".format(entry) |
| 33 | + assert data_provider_config.get('schedule').get('time_unit', None) is not None, ( |
| 34 | + "Expected data provider {} to define an schedule time_unit. Please fix your data provider " |
| 35 | + "configuration.".format(data_provider_config.get('class_name')) |
74 | 36 | ) |
75 | 37 |
|
76 | | - if not bool(entry.get('plugin', False)): |
77 | | - continue |
78 | | - |
79 | | - data_provider: DataProvider = remote_loader.load_data_provider(entry.get('class_name')) |
80 | | - data_providers.append(data_provider) |
81 | | - |
82 | | - return data_providers |
83 | | - |
84 | | - |
85 | | -def get_data_provider_templates(data_provider_configurations: List[Dict[str, Any]]) -> List[DataProvider]: |
86 | | - data_providers = [] |
87 | | - |
88 | | - for entry in data_provider_configurations: |
89 | | - |
90 | | - if not entry.get('key', None): |
91 | | - raise DependencyException("Configured data provider must specify a identifier name") |
92 | | - |
93 | | - if bool(entry.get('plugin', False)): |
94 | | - continue |
95 | | - |
96 | | - if entry.get("key") == "": |
97 | | - continue |
98 | | - |
99 | | - # data_provider: DataProvider = remote_loader.load_data_provider(entry.get('class_name')) |
100 | | - # data_providers.append(data_provider) |
101 | | - |
102 | | - return None |
103 | | - |
104 | | - |
105 | | -def get_strategy_plugins(strategy_configurations: List[Dict[str, Any]]) -> List[Strategy]: |
106 | | - remote_loader = StrategyRemoteLoader() |
107 | | - strategies = [] |
108 | | - |
109 | | - for entry in strategy_configurations: |
110 | | - |
111 | | - if not entry.get('enabled', False): |
112 | | - continue |
113 | | - |
114 | | - if not entry.get('key', None): |
115 | | - raise DependencyException("Configured strategy must specify a identifier name") |
116 | | - |
117 | | - if not entry.get('class_name', None): |
118 | | - raise DependencyException( |
119 | | - "Configured strategy {} must specify a class name corresponding " |
120 | | - "to the strategy implementation".format(entry) |
| 38 | + assert data_provider_config.get('schedule').get('interval', None) is not None, ( |
| 39 | + "Expected data provider {} to define an schedule interval. Please fix your data provider " |
| 40 | + "configuration.".format(data_provider_config.get('class_name')) |
121 | 41 | ) |
122 | 42 |
|
123 | | - if not bool(entry.get('plugin', False)): |
124 | | - continue |
125 | | - |
126 | | - strategy: Strategy = remote_loader.load_strategy(entry.get('class_name')) |
127 | | - strategies.append(strategy) |
128 | | - |
129 | | - return strategies |
130 | | - |
131 | | - |
132 | | -def get_strategy_templates(strategy_configurations: List[Dict[str, Any]]) -> List[Strategy]: |
133 | | - strategies = [] |
| 43 | + assert data_provider_config.get('plugin', None) is not None, ( |
| 44 | + "Expected provider for data provider {} to define plugin flag. Please fix your data provider " |
| 45 | + "configuration. If you make use of one of the templates set the flag to " |
| 46 | + "false.".format(data_provider_config.get('class_name')) |
| 47 | + ) |
134 | 48 |
|
135 | | - for entry in strategy_configurations: |
| 49 | + return data_providers_configuration |
136 | 50 |
|
137 | | - if not entry.get('key', None): |
138 | | - raise DependencyException("Configured data provider must specify a identifier name") |
139 | 51 |
|
140 | | - if bool(entry.get('plugin', False)): |
141 | | - continue |
| 52 | +def load_data_provider(data_provider_configuration: Dict[str, str]) -> DataProvider: |
142 | 53 |
|
143 | | - if entry.get("key") == "": |
144 | | - continue |
| 54 | + class_name = data_provider_configuration.get('class_name') |
| 55 | + plugin = bool(data_provider_configuration.get('plugin')) |
| 56 | + data_provider: DataProvider = None |
145 | 57 |
|
146 | | - # data_provider: DataProvider = remote_loader.load_data_provider(entry.get('class_name')) |
147 | | - # data_providers.append(data_provider) |
| 58 | + if plugin: |
| 59 | + remote_loader = DataProviderRemoteLoader() |
| 60 | + return remote_loader.load_data_provider(class_name) |
| 61 | + else: |
| 62 | + return None |
148 | 63 |
|
149 | | - return None |
150 | 64 |
|
151 | 65 |
|
152 | 66 |
|
0 commit comments