squirrels 0.4.1__py3-none-any.whl → 0.5.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.

Potentially problematic release.


This version of squirrels might be problematic. Click here for more details.

Files changed (125) hide show
  1. dateutils/__init__.py +6 -0
  2. dateutils/_enums.py +25 -0
  3. squirrels/dateutils.py → dateutils/_implementation.py +58 -111
  4. dateutils/types.py +6 -0
  5. squirrels/__init__.py +13 -11
  6. squirrels/_api_routes/__init__.py +5 -0
  7. squirrels/_api_routes/auth.py +271 -0
  8. squirrels/_api_routes/base.py +165 -0
  9. squirrels/_api_routes/dashboards.py +150 -0
  10. squirrels/_api_routes/data_management.py +145 -0
  11. squirrels/_api_routes/datasets.py +257 -0
  12. squirrels/_api_routes/oauth2.py +298 -0
  13. squirrels/_api_routes/project.py +252 -0
  14. squirrels/_api_server.py +256 -450
  15. squirrels/_arguments/__init__.py +0 -0
  16. squirrels/_arguments/init_time_args.py +108 -0
  17. squirrels/_arguments/run_time_args.py +147 -0
  18. squirrels/_auth.py +960 -0
  19. squirrels/_command_line.py +126 -45
  20. squirrels/_compile_prompts.py +147 -0
  21. squirrels/_connection_set.py +48 -26
  22. squirrels/_constants.py +68 -38
  23. squirrels/_dashboards.py +160 -0
  24. squirrels/_data_sources.py +570 -0
  25. squirrels/_dataset_types.py +84 -0
  26. squirrels/_exceptions.py +29 -0
  27. squirrels/_initializer.py +177 -80
  28. squirrels/_logging.py +115 -0
  29. squirrels/_manifest.py +208 -79
  30. squirrels/_model_builder.py +69 -0
  31. squirrels/_model_configs.py +74 -0
  32. squirrels/_model_queries.py +52 -0
  33. squirrels/_models.py +926 -367
  34. squirrels/_package_data/base_project/.env +42 -0
  35. squirrels/_package_data/base_project/.env.example +42 -0
  36. squirrels/_package_data/base_project/assets/expenses.db +0 -0
  37. squirrels/_package_data/base_project/connections.yml +16 -0
  38. squirrels/_package_data/base_project/dashboards/dashboard_example.py +34 -0
  39. squirrels/_package_data/base_project/dashboards/dashboard_example.yml +22 -0
  40. squirrels/{package_data → _package_data}/base_project/docker/.dockerignore +5 -2
  41. squirrels/{package_data → _package_data}/base_project/docker/Dockerfile +3 -3
  42. squirrels/{package_data → _package_data}/base_project/docker/compose.yml +1 -1
  43. squirrels/_package_data/base_project/duckdb_init.sql +10 -0
  44. squirrels/{package_data/base_project/.gitignore → _package_data/base_project/gitignore} +3 -2
  45. squirrels/_package_data/base_project/macros/macros_example.sql +17 -0
  46. squirrels/_package_data/base_project/models/builds/build_example.py +26 -0
  47. squirrels/_package_data/base_project/models/builds/build_example.sql +16 -0
  48. squirrels/_package_data/base_project/models/builds/build_example.yml +57 -0
  49. squirrels/_package_data/base_project/models/dbviews/dbview_example.sql +12 -0
  50. squirrels/_package_data/base_project/models/dbviews/dbview_example.yml +26 -0
  51. squirrels/_package_data/base_project/models/federates/federate_example.py +37 -0
  52. squirrels/_package_data/base_project/models/federates/federate_example.sql +19 -0
  53. squirrels/_package_data/base_project/models/federates/federate_example.yml +65 -0
  54. squirrels/_package_data/base_project/models/sources.yml +38 -0
  55. squirrels/{package_data → _package_data}/base_project/parameters.yml +56 -40
  56. squirrels/_package_data/base_project/pyconfigs/connections.py +14 -0
  57. squirrels/{package_data → _package_data}/base_project/pyconfigs/context.py +21 -40
  58. squirrels/_package_data/base_project/pyconfigs/parameters.py +141 -0
  59. squirrels/_package_data/base_project/pyconfigs/user.py +44 -0
  60. squirrels/_package_data/base_project/seeds/seed_categories.yml +15 -0
  61. squirrels/_package_data/base_project/seeds/seed_subcategories.csv +15 -0
  62. squirrels/_package_data/base_project/seeds/seed_subcategories.yml +21 -0
  63. squirrels/_package_data/base_project/squirrels.yml.j2 +61 -0
  64. squirrels/_package_data/templates/dataset_results.html +112 -0
  65. squirrels/_package_data/templates/oauth_login.html +271 -0
  66. squirrels/_package_data/templates/squirrels_studio.html +20 -0
  67. squirrels/_package_loader.py +8 -4
  68. squirrels/_parameter_configs.py +104 -103
  69. squirrels/_parameter_options.py +348 -0
  70. squirrels/_parameter_sets.py +57 -47
  71. squirrels/_parameters.py +1664 -0
  72. squirrels/_project.py +721 -0
  73. squirrels/_py_module.py +7 -5
  74. squirrels/_schemas/__init__.py +0 -0
  75. squirrels/_schemas/auth_models.py +167 -0
  76. squirrels/_schemas/query_param_models.py +75 -0
  77. squirrels/{_api_response_models.py → _schemas/response_models.py} +126 -47
  78. squirrels/_seeds.py +35 -16
  79. squirrels/_sources.py +110 -0
  80. squirrels/_utils.py +248 -73
  81. squirrels/_version.py +1 -1
  82. squirrels/arguments.py +7 -0
  83. squirrels/auth.py +4 -0
  84. squirrels/connections.py +3 -0
  85. squirrels/dashboards.py +2 -81
  86. squirrels/data_sources.py +14 -631
  87. squirrels/parameter_options.py +13 -348
  88. squirrels/parameters.py +14 -1266
  89. squirrels/types.py +16 -0
  90. squirrels-0.5.0.dist-info/METADATA +113 -0
  91. squirrels-0.5.0.dist-info/RECORD +97 -0
  92. {squirrels-0.4.1.dist-info → squirrels-0.5.0.dist-info}/WHEEL +1 -1
  93. squirrels-0.5.0.dist-info/entry_points.txt +3 -0
  94. {squirrels-0.4.1.dist-info → squirrels-0.5.0.dist-info/licenses}/LICENSE +1 -1
  95. squirrels/_authenticator.py +0 -85
  96. squirrels/_dashboards_io.py +0 -61
  97. squirrels/_environcfg.py +0 -84
  98. squirrels/arguments/init_time_args.py +0 -40
  99. squirrels/arguments/run_time_args.py +0 -208
  100. squirrels/package_data/assets/favicon.ico +0 -0
  101. squirrels/package_data/assets/index.css +0 -1
  102. squirrels/package_data/assets/index.js +0 -58
  103. squirrels/package_data/base_project/assets/expenses.db +0 -0
  104. squirrels/package_data/base_project/connections.yml +0 -7
  105. squirrels/package_data/base_project/dashboards/dashboard_example.py +0 -32
  106. squirrels/package_data/base_project/dashboards.yml +0 -10
  107. squirrels/package_data/base_project/env.yml +0 -29
  108. squirrels/package_data/base_project/models/dbviews/dbview_example.py +0 -47
  109. squirrels/package_data/base_project/models/dbviews/dbview_example.sql +0 -22
  110. squirrels/package_data/base_project/models/federates/federate_example.py +0 -21
  111. squirrels/package_data/base_project/models/federates/federate_example.sql +0 -3
  112. squirrels/package_data/base_project/pyconfigs/auth.py +0 -45
  113. squirrels/package_data/base_project/pyconfigs/connections.py +0 -19
  114. squirrels/package_data/base_project/pyconfigs/parameters.py +0 -95
  115. squirrels/package_data/base_project/seeds/seed_subcategories.csv +0 -15
  116. squirrels/package_data/base_project/squirrels.yml.j2 +0 -94
  117. squirrels/package_data/templates/index.html +0 -18
  118. squirrels/project.py +0 -378
  119. squirrels/user_base.py +0 -55
  120. squirrels-0.4.1.dist-info/METADATA +0 -117
  121. squirrels-0.4.1.dist-info/RECORD +0 -60
  122. squirrels-0.4.1.dist-info/entry_points.txt +0 -4
  123. /squirrels/{package_data → _package_data}/base_project/assets/weather.db +0 -0
  124. /squirrels/{package_data → _package_data}/base_project/seeds/seed_categories.csv +0 -0
  125. /squirrels/{package_data → _package_data}/base_project/tmp/.gitignore +0 -0
squirrels/data_sources.py CHANGED
@@ -1,631 +1,14 @@
1
- from __future__ import annotations as _a
2
- import pandas as _pd, typing as _t, dataclasses as _d, abc as _abc
3
-
4
- from . import _parameter_configs as _pc, parameter_options as _po, _utils as _u
5
-
6
-
7
- @_d.dataclass
8
- class DataSource(metaclass=_abc.ABCMeta):
9
- """
10
- Abstract class for lookup tables coming from a database
11
- """
12
- _table_or_query: str
13
- _id_col: str | None
14
- _is_from_seeds: bool
15
- _user_group_col: str | None
16
- _parent_id_col: str | None
17
- _connection_name: str | None
18
-
19
- @_abc.abstractmethod
20
- def __init__(
21
- self, table_or_query: str, *, id_col: str | None = None, from_seeds: bool = False, user_group_col: str | None = None,
22
- parent_id_col: str | None = None, connection_name: str | None = None, **kwargs
23
- ) -> None:
24
- self._table_or_query = table_or_query
25
- self._id_col = id_col
26
- self._is_from_seeds = from_seeds
27
- self._user_group_col = user_group_col
28
- self._parent_id_col = parent_id_col
29
- self._connection_name = connection_name
30
-
31
- def _get_connection_name(self, default_conn_name: str) -> str:
32
- return self._connection_name if self._connection_name is not None else default_conn_name
33
-
34
- def _get_query(self) -> str:
35
- """
36
- Get the "table_or_query" attribute as a select query
37
-
38
- Returns:
39
- str: The converted select query
40
- """
41
- if self._table_or_query.strip().lower().startswith('select '):
42
- query = self._table_or_query
43
- else:
44
- query = f'SELECT * FROM {self._table_or_query}'
45
- return query
46
-
47
- @_abc.abstractmethod
48
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.ParameterConfig:
49
- """
50
- An abstract method for converting itself into a parameter
51
- """
52
- pass
53
-
54
- def _validate_parameter_type(self, ds_param: _pc.DataSourceParameterConfig, target_parameter_type: _t.Type[_pc.ParameterConfig]) -> None:
55
- if ds_param.parameter_type != target_parameter_type:
56
- parameter_type_name = ds_param.parameter_type.__name__
57
- datasource_type_name = self.__class__.__name__
58
- raise _u.ConfigurationError(f'Invalid widget type "{parameter_type_name}" for {datasource_type_name}')
59
-
60
- def _get_aggregated_df(self, df: _pd.DataFrame, columns_to_include: _t.Iterable[str]) -> _pd.DataFrame:
61
- agg_rules = {}
62
- for column in columns_to_include:
63
- if column is not None:
64
- agg_rules[column] = "first"
65
- if self._user_group_col is not None:
66
- agg_rules[self._user_group_col] = list
67
- if self._parent_id_col is not None:
68
- agg_rules[self._parent_id_col] = list
69
-
70
- groupby_dim = self._id_col if self._id_col is not None else df.index
71
- try:
72
- df_agg = df.groupby(groupby_dim).agg(agg_rules)
73
- except KeyError as e:
74
- raise _u.ConfigurationError(e)
75
-
76
- return df_agg
77
-
78
- def _get_key_from_record(self, key: str | None, record: dict[str, _t.Any], default: _t.Any) -> _t.Any:
79
- return record[key] if key is not None else default
80
-
81
- def _get_key_from_record_as_list(self, key: str | None, record: dict[str, _t.Any]) -> _t.Iterable[str]:
82
- value = self._get_key_from_record(key, record, list())
83
- return [str(x) for x in value]
84
-
85
-
86
- @_d.dataclass
87
- class _SelectionDataSource(DataSource):
88
- """
89
- Abstract class for selection parameter data sources
90
- """
91
- _options_col: str
92
- _order_by_col: str | None
93
- _is_default_col: str | None
94
- _custom_cols: dict[str, str]
95
-
96
- @_abc.abstractmethod
97
- def __init__(
98
- self, table_or_query: str, id_col: str, options_col: str, *, order_by_col: str | None = None,
99
- is_default_col: str | None = None, custom_cols: dict[str, str] = {}, from_seeds: bool = False,
100
- user_group_col: str | None = None, parent_id_col: str | None = None, connection_name: str | None = None,
101
- **kwargs
102
- ) -> None:
103
- super().__init__(
104
- table_or_query, id_col=id_col, from_seeds=from_seeds, user_group_col=user_group_col, parent_id_col=parent_id_col,
105
- connection_name=connection_name
106
- )
107
- self._options_col = options_col
108
- self._order_by_col = order_by_col
109
- self._is_default_col = is_default_col
110
- self._custom_cols = custom_cols
111
-
112
- def _get_all_options(self, df: _pd.DataFrame) -> _t.Sequence[_po.SelectParameterOption]:
113
- columns = [self._options_col, self._order_by_col, self._is_default_col, *self._custom_cols.values()]
114
- df_agg = self._get_aggregated_df(df, columns)
115
-
116
- if self._order_by_col is None:
117
- df_agg.sort_index(inplace=True)
118
- else:
119
- df_agg.sort_values(self._order_by_col, inplace=True)
120
-
121
- def get_is_default(record: dict[str, _t.Any]) -> bool:
122
- return int(record[self._is_default_col]) == 1 if self._is_default_col is not None else False
123
-
124
- def get_custom_fields(record: dict[str, _t.Any]) -> dict[str, _t.Any]:
125
- result = {}
126
- for key, val in self._custom_cols.items():
127
- result[key] = record[val]
128
- return result
129
-
130
- records = df_agg.to_dict("index")
131
- return tuple(
132
- _po.SelectParameterOption(str(id), str(record[self._options_col]),
133
- is_default=get_is_default(record), custom_fields=get_custom_fields(record),
134
- user_groups=self._get_key_from_record_as_list(self._user_group_col, record),
135
- parent_option_ids=self._get_key_from_record_as_list(self._parent_id_col, record))
136
- for id, record in records.items()
137
- )
138
-
139
-
140
- @_d.dataclass
141
- class SelectDataSource(_SelectionDataSource):
142
- """
143
- Lookup table for select parameter options
144
- """
145
-
146
- def __init__(
147
- self, table_or_query: str, id_col: str, options_col: str, *, order_by_col: str | None = None,
148
- is_default_col: str | None = None, custom_cols: dict[str, str] = {}, from_seeds: bool = False,
149
- user_group_col: str | None = None, parent_id_col: str | None = None, connection_name: str | None = None,
150
- **kwargs
151
- ) -> None:
152
- """
153
- Constructor for SelectDataSource
154
-
155
- Arguments:
156
- table_or_query: Either the name of the table to use, or a query to run
157
- id_col: The column name of the id
158
- options_col: The column name of the options
159
- order_by_col: The column name to order the options by. Orders by the id_col instead if this is None
160
- is_default_col: The column name that indicates which options are the default
161
- custom_cols: Dictionary of attribute to column name for custom fields for the SelectParameterOption
162
- from_seeds: Boolean for whether this datasource is created from seeds
163
- user_group_col: The column name of the user group that the user is in for this option to be valid
164
- parent_id_col: The column name of the parent option id that must be selected for this option to be valid
165
- connection_name: Name of the connection to use defined in connections.py
166
- """
167
- super().__init__(
168
- table_or_query, id_col, options_col, order_by_col=order_by_col, is_default_col=is_default_col, custom_cols=custom_cols,
169
- from_seeds=from_seeds, user_group_col=user_group_col, parent_id_col=parent_id_col, connection_name=connection_name
170
- )
171
-
172
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.SelectionParameterConfig:
173
- """
174
- Method to convert the associated DataSourceParameter into a SingleSelectParameterConfig or MultiSelectParameterConfig
175
-
176
- Arguments:
177
- ds_param: The parameter to convert
178
- df: The dataframe containing the parameter options data
179
-
180
- Returns:
181
- The converted parameter
182
- """
183
- all_options = self._get_all_options(df)
184
- if ds_param.parameter_type == _pc.SingleSelectParameterConfig:
185
- return _pc.SingleSelectParameterConfig(
186
- ds_param.name, ds_param.label, all_options, description=ds_param.description,
187
- user_attribute=ds_param.user_attribute, parent_name=ds_param.parent_name, **ds_param.extra_args
188
- )
189
- elif ds_param.parameter_type == _pc.MultiSelectParameterConfig:
190
- return _pc.MultiSelectParameterConfig(
191
- ds_param.name, ds_param.label, all_options, description=ds_param.description,
192
- user_attribute=ds_param.user_attribute, parent_name=ds_param.parent_name, **ds_param.extra_args
193
- )
194
- else:
195
- raise _u.ConfigurationError(f'Invalid widget type "{ds_param.parameter_type}" for SelectDataSource')
196
-
197
-
198
- @_d.dataclass
199
- class SingleSelectDataSource(_SelectionDataSource):
200
- """
201
- DEPRECATED. Use "SelectDataSource" instead.
202
- """
203
-
204
- def __init__(
205
- self, table_or_query: str, id_col: str, options_col: str, *, order_by_col: str | None = None,
206
- is_default_col: str | None = None, custom_cols: dict[str, str] = {}, user_group_col: str | None = None,
207
- parent_id_col: str | None = None, connection_name: str | None = None, **kwargs
208
- ) -> None:
209
- """
210
- DEPRECATED. Use "SelectDataSource" instead.
211
- """
212
- super().__init__(table_or_query, id_col, options_col, order_by_col=order_by_col, is_default_col=is_default_col,
213
- custom_cols=custom_cols, user_group_col=user_group_col, parent_id_col=parent_id_col,
214
- connection_name=connection_name)
215
-
216
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.SingleSelectParameterConfig:
217
- """
218
- Method to convert the associated DataSourceParameter into a SingleSelectParameterConfig
219
-
220
- Arguments:
221
- ds_param: The parameter to convert
222
- df: The dataframe containing the parameter options data
223
-
224
- Returns:
225
- The converted parameter
226
- """
227
- self._validate_parameter_type(ds_param, _pc.SingleSelectParameterConfig)
228
- all_options = self._get_all_options(df)
229
- return _pc.SingleSelectParameterConfig(ds_param.name, ds_param.label, all_options, description=ds_param.description,
230
- user_attribute=ds_param.user_attribute, parent_name=ds_param.parent_name)
231
-
232
- @_d.dataclass
233
- class MultiSelectDataSource(_SelectionDataSource):
234
- """
235
- DEPRECATED. Use "SelectDataSource" instead.
236
- """
237
- _show_select_all: bool
238
- _order_matters: bool
239
- _none_is_all: bool
240
-
241
- def __init__(
242
- self, table_or_query: str, id_col: str, options_col: str, *, order_by_col: str | None = None,
243
- is_default_col: str | None = None, custom_cols: dict[str, str] = {}, show_select_all: bool = True,
244
- order_matters: bool = False, none_is_all: bool = True, user_group_col: str | None = None,
245
- parent_id_col: str | None = None, connection_name: str | None = None, **kwargs
246
- ) -> None:
247
- """
248
- DEPRECATED. Use "SelectDataSource" instead.
249
- """
250
- super().__init__(table_or_query, id_col, options_col, order_by_col=order_by_col, is_default_col=is_default_col,
251
- custom_cols=custom_cols, user_group_col=user_group_col, parent_id_col=parent_id_col,
252
- connection_name=connection_name)
253
- self._show_select_all = show_select_all
254
- self._order_matters = order_matters
255
- self._none_is_all = none_is_all
256
-
257
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.MultiSelectParameterConfig:
258
- """
259
- Method to convert the associated DataSourceParameter into a MultiSelectParameterConfig
260
-
261
- Arguments:
262
- ds_param: The parameter to convert
263
- df: The dataframe containing the parameter options data
264
-
265
- Returns:
266
- The converted parameter
267
- """
268
- self._validate_parameter_type(ds_param, _pc.MultiSelectParameterConfig)
269
- all_options = self._get_all_options(df)
270
- return _pc.MultiSelectParameterConfig(
271
- ds_param.name, ds_param.label, all_options, show_select_all=self._show_select_all,
272
- order_matters=self._order_matters, none_is_all=self._none_is_all, description=ds_param.description,
273
- user_attribute=ds_param.user_attribute, parent_name=ds_param.parent_name
274
- )
275
-
276
-
277
- @_d.dataclass
278
- class DateDataSource(DataSource):
279
- """
280
- Lookup table for date parameter default options
281
- """
282
- _default_date_col: str
283
- _date_format: str
284
-
285
- def __init__(
286
- self, table_or_query: str, default_date_col: str, *, min_date_col: str | None = None,
287
- max_date_col: str | None = None, date_format: str = '%Y-%m-%d', id_col: str | None = None,
288
- from_seeds: bool = False, user_group_col: str | None = None, parent_id_col: str | None = None,
289
- connection_name: str | None = None, **kwargs
290
- ) -> None:
291
- """
292
- Constructor for DateDataSource
293
-
294
- Arguments:
295
- table_or_query: Either the name of the table to use, or a query to run
296
- default_date_col: The column name of the default date
297
- date_format: The format of the default date(s). Defaults to '%Y-%m-%d'
298
- id_col: The column name of the id
299
- from_seeds: Boolean for whether this datasource is created from seeds
300
- user_group_col: The column name of the user group that the user is in for this option to be valid
301
- parent_id_col: The column name of the parent option id that the default date belongs to
302
- connection_name: Name of the connection to use defined in connections.py
303
- """
304
- super().__init__(
305
- table_or_query, id_col=id_col, from_seeds=from_seeds, user_group_col=user_group_col, parent_id_col=parent_id_col,
306
- connection_name=connection_name
307
- )
308
- self._default_date_col = default_date_col
309
- self._min_date_col = min_date_col
310
- self._max_date_col = max_date_col
311
- self._date_format = date_format
312
-
313
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.DateParameterConfig:
314
- """
315
- Method to convert the associated DataSourceParameter into a DateParameterConfig
316
-
317
- Arguments:
318
- ds_param: The parameter to convert
319
- df: The dataframe containing the parameter options data
320
-
321
- Returns:
322
- The converted parameter
323
- """
324
- self._validate_parameter_type(ds_param, _pc.DateParameterConfig)
325
-
326
- columns = [self._default_date_col, self._min_date_col, self._max_date_col]
327
- df_agg = self._get_aggregated_df(df, columns)
328
-
329
- records = df_agg.to_dict("index")
330
- options = tuple(
331
- _po.DateParameterOption(
332
- str(record[self._default_date_col]), date_format=self._date_format,
333
- min_date = str(record[self._min_date_col]) if self._min_date_col else None,
334
- max_date = str(record[self._max_date_col]) if self._max_date_col else None,
335
- user_groups=self._get_key_from_record_as_list(self._user_group_col, record),
336
- parent_option_ids=self._get_key_from_record_as_list(self._parent_id_col, record)
337
- )
338
- for _, record in records.items()
339
- )
340
- return _pc.DateParameterConfig(
341
- ds_param.name, ds_param.label, options, description=ds_param.description, user_attribute=ds_param.user_attribute,
342
- parent_name=ds_param.parent_name, **ds_param.extra_args
343
- )
344
-
345
-
346
- @_d.dataclass
347
- class DateRangeDataSource(DataSource):
348
- """
349
- Lookup table for date parameter default options
350
- """
351
- _default_start_date_col: str
352
- _default_end_date_col: str
353
- _date_format: str
354
-
355
- def __init__(
356
- self, table_or_query: str, default_start_date_col: str, default_end_date_col: str, *, date_format: str = '%Y-%m-%d',
357
- min_date_col: str | None = None, max_date_col: str | None = None, id_col: str | None = None, from_seeds: bool = False,
358
- user_group_col: str | None = None, parent_id_col: str | None = None, connection_name: str | None = None, **kwargs
359
- ) -> None:
360
- """
361
- Constructor for DateRangeDataSource
362
-
363
- Arguments:
364
- table_or_query: Either the name of the table to use, or a query to run
365
- default_start_date_col: The column name of the default start date
366
- default_end_date_col: The column name of the default end date
367
- date_format: The format of the default date(s). Defaults to '%Y-%m-%d'
368
- id_col: The column name of the id
369
- from_seeds: Boolean for whether this datasource is created from seeds
370
- user_group_col: The column name of the user group that the user is in for this option to be valid
371
- parent_id_col: The column name of the parent option id that the default date belongs to
372
- connection_name: Name of the connection to use defined in connections.py
373
- """
374
- super().__init__(
375
- table_or_query, id_col=id_col, from_seeds=from_seeds, user_group_col=user_group_col, parent_id_col=parent_id_col,
376
- connection_name=connection_name
377
- )
378
- self._default_start_date_col = default_start_date_col
379
- self._default_end_date_col = default_end_date_col
380
- self._min_date_col = min_date_col
381
- self._max_date_col = max_date_col
382
- self._date_format = date_format
383
-
384
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.DateRangeParameterConfig:
385
- """
386
- Method to convert the associated DataSourceParameter into a DateRangeParameterConfig
387
-
388
- Arguments:
389
- ds_param: The parameter to convert
390
- df: The dataframe containing the parameter options data
391
-
392
- Returns:
393
- The converted parameter
394
- """
395
- self._validate_parameter_type(ds_param, _pc.DateRangeParameterConfig)
396
-
397
- columns = [self._default_start_date_col, self._default_end_date_col, self._min_date_col, self._max_date_col]
398
- df_agg = self._get_aggregated_df(df, columns)
399
-
400
- records = df_agg.to_dict("index")
401
- options = tuple(
402
- _po.DateRangeParameterOption(
403
- str(record[self._default_start_date_col]), str(record[self._default_end_date_col]),
404
- min_date=str(record[self._min_date_col]) if self._min_date_col else None,
405
- max_date=str(record[self._max_date_col]) if self._max_date_col else None,
406
- date_format=self._date_format,
407
- user_groups=self._get_key_from_record_as_list(self._user_group_col, record),
408
- parent_option_ids=self._get_key_from_record_as_list(self._parent_id_col, record)
409
- )
410
- for _, record in records.items()
411
- )
412
- return _pc.DateRangeParameterConfig(
413
- ds_param.name, ds_param.label, options, description=ds_param.description, user_attribute=ds_param.user_attribute,
414
- parent_name=ds_param.parent_name, **ds_param.extra_args
415
- )
416
-
417
-
418
- @_d.dataclass
419
- class _NumericDataSource(DataSource):
420
- """
421
- Abstract class for number or number range data sources
422
- """
423
- _min_value_col: str
424
- _max_value_col: str
425
- _increment_col: str | None
426
-
427
- @_abc.abstractmethod
428
- def __init__(
429
- self, table_or_query: str, min_value_col: str, max_value_col: str, *, increment_col: str | None = None,
430
- id_col: str | None = None, from_seeds: bool = False, user_group_col: str | None = None,
431
- parent_id_col: str | None = None, connection_name: str | None = None, **kwargs
432
- ) -> None:
433
- super().__init__(
434
- table_or_query, id_col=id_col, from_seeds=from_seeds, user_group_col=user_group_col, parent_id_col=parent_id_col,
435
- connection_name=connection_name
436
- )
437
- self._min_value_col = min_value_col
438
- self._max_value_col = max_value_col
439
- self._increment_col = increment_col
440
-
441
-
442
- @_d.dataclass
443
- class NumberDataSource(_NumericDataSource):
444
- """
445
- Lookup table for number parameter default options
446
- """
447
- _default_value_col: str | None
448
-
449
- def __init__(
450
- self, table_or_query: str, min_value_col: str, max_value_col: str, *, increment_col: str | None = None,
451
- default_value_col: str | None = None, id_col: str | None = None, from_seeds: bool = False,
452
- user_group_col: str | None = None, parent_id_col: str | None = None, connection_name: str | None = None, **kwargs
453
- ) -> None:
454
- """
455
- Constructor for NumberDataSource
456
-
457
- Arguments:
458
- table_or_query: Either the name of the table to use, or a query to run
459
- min_value_col: The column name of the minimum value
460
- max_value_col: The column name of the maximum value
461
- increment_col: The column name of the increment value. Defaults to column of 1's if None
462
- default_value_col: The column name of the default value. Defaults to min_value_col if None
463
- id_col: The column name of the id
464
- from_seeds: Boolean for whether this datasource is created from seeds
465
- user_group_col: The column name of the user group that the user is in for this option to be valid
466
- parent_id_col: The column name of the parent option id that the default value belongs to
467
- connection_name: Name of the connection to use defined in connections.py
468
- """
469
- super().__init__(
470
- table_or_query, min_value_col, max_value_col, increment_col=increment_col, id_col=id_col, from_seeds=from_seeds,
471
- user_group_col=user_group_col, parent_id_col=parent_id_col, connection_name=connection_name
472
- )
473
- self._default_value_col = default_value_col
474
-
475
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.NumberParameterConfig:
476
- """
477
- Method to convert the associated DataSourceParameter into a NumberParameterConfig
478
-
479
- Arguments:
480
- ds_param: The parameter to convert
481
- df: The dataframe containing the parameter options data
482
-
483
- Returns:
484
- The converted parameter
485
- """
486
- self._validate_parameter_type(ds_param, _pc.NumberParameterConfig)
487
-
488
- columns = [self._min_value_col, self._max_value_col, self._increment_col, self._default_value_col]
489
- df_agg = self._get_aggregated_df(df, columns)
490
-
491
- records = df_agg.to_dict("index")
492
- options = tuple(
493
- _po.NumberParameterOption(record[self._min_value_col], record[self._max_value_col],
494
- increment=self._get_key_from_record(self._increment_col, record, 1),
495
- default_value=self._get_key_from_record(self._default_value_col, record, None),
496
- user_groups=self._get_key_from_record_as_list(self._user_group_col, record),
497
- parent_option_ids=self._get_key_from_record_as_list(self._parent_id_col, record))
498
- for _, record in records.items()
499
- )
500
- return _pc.NumberParameterConfig(
501
- ds_param.name, ds_param.label, options, description=ds_param.description, user_attribute=ds_param.user_attribute,
502
- parent_name=ds_param.parent_name, **ds_param.extra_args
503
- )
504
-
505
-
506
- @_d.dataclass
507
- class NumberRangeDataSource(_NumericDataSource):
508
- """
509
- Lookup table for number range parameter default options
510
- """
511
- _default_lower_value_col: str | None
512
- _default_upper_value_col: str | None
513
-
514
- def __init__(
515
- self, table_or_query: str, min_value_col: str, max_value_col: str, *, increment_col: str | None = None,
516
- default_lower_value_col: str | None = None, default_upper_value_col: str | None = None, id_col: str | None = None,
517
- from_seeds: bool = False, user_group_col: str | None = None, parent_id_col: str | None = None,
518
- connection_name: str | None = None, **kwargs
519
- ) -> None:
520
- """
521
- Constructor for NumRangeDataSource
522
-
523
- Arguments:
524
- table_or_query: Either the name of the table to use, or a query to
525
- min_value_col: The column name of the minimum value
526
- max_value_col: The column name of the maximum value
527
- increment_col: The column name of the increment value. Defaults to column of 1's if None
528
- default_lower_value_col: The column name of the default lower value. Defaults to min_value_col if None
529
- default_upper_value_col: The column name of the default upper value. Defaults to max_value_col if None
530
- id_col: The column name of the id
531
- from_seeds: Boolean for whether this datasource is created from seeds
532
- user_group_col: The column name of the user group that the user is in for this option to be valid
533
- parent_id_col: The column name of the parent option id that the default value belongs to
534
- connection_name: Name of the connection to use defined in connections.py
535
- """
536
- super().__init__(
537
- table_or_query, min_value_col, max_value_col, increment_col=increment_col, id_col=id_col, from_seeds=from_seeds,
538
- user_group_col=user_group_col, parent_id_col=parent_id_col, connection_name=connection_name
539
- )
540
- self._default_lower_value_col = default_lower_value_col
541
- self._default_upper_value_col = default_upper_value_col
542
-
543
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.NumberRangeParameterConfig:
544
- """
545
- Method to convert the associated DataSourceParameter into a NumberRangeParameterConfig
546
-
547
- Arguments:
548
- ds_param: The parameter to convert
549
- df: The dataframe containing the parameter options data
550
-
551
- Returns:
552
- The converted parameter
553
- """
554
- self._validate_parameter_type(ds_param, _pc.NumberRangeParameterConfig)
555
-
556
- columns = [self._min_value_col, self._max_value_col, self._increment_col, self._default_lower_value_col, self._default_upper_value_col]
557
- df_agg = self._get_aggregated_df(df, columns)
558
-
559
- records = df_agg.to_dict("index")
560
- options = tuple(
561
- _po.NumberRangeParameterOption(record[self._min_value_col], record[self._max_value_col],
562
- increment=self._get_key_from_record(self._increment_col, record, 1),
563
- default_lower_value=self._get_key_from_record(self._default_lower_value_col, record, None),
564
- default_upper_value=self._get_key_from_record(self._default_upper_value_col, record, None),
565
- user_groups=self._get_key_from_record_as_list(self._user_group_col, record),
566
- parent_option_ids=self._get_key_from_record_as_list(self._parent_id_col, record))
567
- for _, record in records.items()
568
- )
569
- return _pc.NumberRangeParameterConfig(
570
- ds_param.name, ds_param.label, options, description=ds_param.description, user_attribute=ds_param.user_attribute,
571
- parent_name=ds_param.parent_name, **ds_param.extra_args
572
- )
573
-
574
-
575
- @_d.dataclass
576
- class TextDataSource(DataSource):
577
- """
578
- Lookup table for text parameter default options
579
- """
580
- _default_text_col: str
581
-
582
- def __init__(
583
- self, table_or_query: str, default_text_col: str, *, id_col: str | None = None, from_seeds: bool = False,
584
- user_group_col: str | None = None, parent_id_col: str | None = None, connection_name: str | None = None,
585
- **kwargs
586
- ) -> None:
587
- """
588
- Constructor for TextDataSource
589
-
590
- Arguments:
591
- table_or_query: Either the name of the table to use, or a query to run
592
- default_text_col: The column name of the default text
593
- id_col: The column name of the id
594
- from_seeds: Boolean for whether this datasource is created from seeds
595
- user_group_col: The column name of the user group that the user is in for this option to be valid
596
- parent_id_col: The column name of the parent option id that the default date belongs to
597
- connection_name: Name of the connection to use defined in connections.py
598
- """
599
- super().__init__(
600
- table_or_query, id_col=id_col, from_seeds=from_seeds, user_group_col=user_group_col, parent_id_col=parent_id_col,
601
- connection_name=connection_name
602
- )
603
- self._default_text_col = default_text_col
604
-
605
- def _convert(self, ds_param: _pc.DataSourceParameterConfig, df: _pd.DataFrame) -> _pc.TextParameterConfig:
606
- """
607
- Method to convert the associated DataSourceParameter into a TextParameterConfig
608
-
609
- Arguments:
610
- ds_param: The parameter to convert
611
- df: The dataframe containing the parameter options data
612
-
613
- Returns:
614
- The converted parameter
615
- """
616
- self._validate_parameter_type(ds_param, _pc.TextParameterConfig)
617
-
618
- columns = [self._default_text_col]
619
- df_agg = self._get_aggregated_df(df, columns)
620
-
621
- records = df_agg.to_dict("index")
622
- options = tuple(
623
- _po.TextParameterOption(default_text=str(record[self._default_text_col]),
624
- user_groups=self._get_key_from_record_as_list(self._user_group_col, record),
625
- parent_option_ids=self._get_key_from_record_as_list(self._parent_id_col, record))
626
- for _, record in records.items()
627
- )
628
- return _pc.TextParameterConfig(
629
- ds_param.name, ds_param.label, options, description=ds_param.description, user_attribute=ds_param.user_attribute,
630
- parent_name=ds_param.parent_name, **ds_param.extra_args
631
- )
1
+ from ._data_sources import (
2
+ SourceEnum,
3
+ SelectDataSource,
4
+ DateDataSource,
5
+ DateRangeDataSource,
6
+ NumberDataSource,
7
+ NumberRangeDataSource,
8
+ TextDataSource
9
+ )
10
+
11
+ __all__ = [
12
+ "SourceEnum", "SelectDataSource", "DateDataSource", "DateRangeDataSource",
13
+ "NumberDataSource", "NumberRangeDataSource", "TextDataSource"
14
+ ]