squirrels 0.5.0b2__py3-none-any.whl → 0.5.0b4__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.
- dateutils/__init__.py +6 -460
- dateutils/_enums.py +25 -0
- dateutils/_implementation.py +409 -0
- dateutils/types.py +6 -0
- squirrels/__init__.py +9 -13
- squirrels/_api_routes/__init__.py +5 -0
- squirrels/_api_routes/auth.py +262 -0
- squirrels/_api_routes/base.py +154 -0
- squirrels/_api_routes/dashboards.py +142 -0
- squirrels/_api_routes/data_management.py +103 -0
- squirrels/_api_routes/datasets.py +242 -0
- squirrels/_api_routes/oauth2.py +300 -0
- squirrels/_api_routes/project.py +214 -0
- squirrels/_api_server.py +145 -748
- squirrels/_arguments/__init__.py +0 -0
- squirrels/{arguments → _arguments}/init_time_args.py +7 -2
- squirrels/{arguments → _arguments}/run_time_args.py +4 -26
- squirrels/_auth.py +646 -93
- squirrels/_connection_set.py +5 -5
- squirrels/_constants.py +7 -1
- squirrels/{_dashboards_io.py → _dashboards.py} +87 -6
- squirrels/_data_sources.py +564 -0
- squirrels/_exceptions.py +9 -37
- squirrels/_initializer.py +31 -26
- squirrels/_manifest.py +5 -5
- squirrels/_model_builder.py +1 -1
- squirrels/_model_configs.py +2 -2
- squirrels/_model_queries.py +1 -1
- squirrels/_models.py +40 -27
- squirrels/{package_data → _package_data}/base_project/.env +1 -0
- squirrels/{package_data → _package_data}/base_project/.env.example +1 -0
- squirrels/{package_data → _package_data}/base_project/dashboards/dashboard_example.py +4 -4
- squirrels/{package_data → _package_data}/base_project/dashboards/dashboard_example.yml +2 -2
- squirrels/_package_data/base_project/macros/macros_example.sql +17 -0
- squirrels/{package_data → _package_data}/base_project/models/builds/build_example.py +2 -2
- squirrels/{package_data → _package_data}/base_project/models/builds/build_example.sql +1 -1
- squirrels/{package_data → _package_data}/base_project/models/dbviews/dbview_example.sql +1 -1
- squirrels/_package_data/base_project/models/federates/federate_example.py +41 -0
- squirrels/_package_data/base_project/models/federates/federate_example.sql +25 -0
- squirrels/{package_data → _package_data}/base_project/models/federates/federate_example.yml +6 -6
- squirrels/{package_data → _package_data}/base_project/parameters.yml +9 -8
- squirrels/_package_data/base_project/pyconfigs/connections.py +14 -0
- squirrels/{package_data → _package_data}/base_project/pyconfigs/context.py +14 -16
- squirrels/_package_data/base_project/pyconfigs/parameters.py +106 -0
- squirrels/_package_data/base_project/pyconfigs/user.py +51 -0
- squirrels/_package_data/templates/dataset_results.html +112 -0
- squirrels/_package_data/templates/oauth_login.html +271 -0
- squirrels/_parameter_configs.py +35 -35
- squirrels/_parameter_options.py +348 -0
- squirrels/_parameter_sets.py +47 -37
- squirrels/_parameters.py +1664 -0
- squirrels/_project.py +76 -32
- squirrels/_py_module.py +3 -2
- squirrels/_schemas/__init__.py +0 -0
- squirrels/_schemas/auth_models.py +144 -0
- squirrels/_schemas/query_param_models.py +67 -0
- squirrels/{_api_response_models.py → _schemas/response_models.py} +12 -8
- squirrels/_utils.py +38 -4
- squirrels/arguments.py +2 -0
- squirrels/auth.py +1 -0
- squirrels/connections.py +1 -0
- squirrels/dashboards.py +1 -82
- squirrels/data_sources.py +8 -563
- squirrels/parameter_options.py +8 -348
- squirrels/parameters.py +9 -1266
- squirrels/types.py +11 -0
- {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/METADATA +4 -1
- squirrels-0.5.0b4.dist-info/RECORD +94 -0
- squirrels/package_data/base_project/macros/macros_example.sql +0 -15
- squirrels/package_data/base_project/models/federates/federate_example.py +0 -44
- squirrels/package_data/base_project/models/federates/federate_example.sql +0 -17
- squirrels/package_data/base_project/pyconfigs/connections.py +0 -14
- squirrels/package_data/base_project/pyconfigs/parameters.py +0 -93
- squirrels/package_data/base_project/pyconfigs/user.py +0 -23
- squirrels-0.5.0b2.dist-info/RECORD +0 -70
- /squirrels/{dataset_result.py → _dataset_types.py} +0 -0
- /squirrels/{package_data → _package_data}/base_project/assets/expenses.db +0 -0
- /squirrels/{package_data → _package_data}/base_project/assets/weather.db +0 -0
- /squirrels/{package_data → _package_data}/base_project/connections.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/docker/.dockerignore +0 -0
- /squirrels/{package_data → _package_data}/base_project/docker/Dockerfile +0 -0
- /squirrels/{package_data → _package_data}/base_project/docker/compose.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/duckdb_init.sql +0 -0
- /squirrels/{package_data/base_project/.gitignore → _package_data/base_project/gitignore} +0 -0
- /squirrels/{package_data → _package_data}/base_project/models/builds/build_example.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/models/dbviews/dbview_example.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/models/sources.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/seeds/seed_categories.csv +0 -0
- /squirrels/{package_data → _package_data}/base_project/seeds/seed_categories.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/seeds/seed_subcategories.csv +0 -0
- /squirrels/{package_data → _package_data}/base_project/seeds/seed_subcategories.yml +0 -0
- /squirrels/{package_data → _package_data}/base_project/squirrels.yml.j2 +0 -0
- /squirrels/{package_data → _package_data}/base_project/tmp/.gitignore +0 -0
- {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/WHEEL +0 -0
- {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/entry_points.txt +0 -0
- {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/licenses/LICENSE +0 -0
squirrels/_parameter_sets.py
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
from typing import Optional, Sequence, Any
|
|
2
|
+
from typing import Optional, Sequence, Callable, Any
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
4
|
from collections import OrderedDict
|
|
5
5
|
import time, concurrent.futures, polars as pl
|
|
6
6
|
|
|
7
|
-
from . import
|
|
8
|
-
from .
|
|
7
|
+
from . import _parameters as p, _utils as u, _constants as c, _parameter_configs as pc, _py_module as pm
|
|
8
|
+
from ._schemas import response_models as rm
|
|
9
|
+
from ._arguments.init_time_args import ParametersArgs
|
|
9
10
|
from ._manifest import ParametersConfig, ManifestConfig
|
|
10
|
-
from ._connection_set import ConnectionSet
|
|
11
|
+
from ._connection_set import ConnectionSet
|
|
11
12
|
from ._seeds import Seeds
|
|
12
13
|
from ._auth import BaseUser
|
|
13
14
|
|
|
@@ -22,11 +23,11 @@ class ParameterSet:
|
|
|
22
23
|
def get_parameters_as_dict(self) -> dict[str, p.Parameter]:
|
|
23
24
|
return self._parameters_dict.copy()
|
|
24
25
|
|
|
25
|
-
def to_api_response_model0(self) ->
|
|
26
|
+
def to_api_response_model0(self) -> rm.ParametersModel:
|
|
26
27
|
parameters = []
|
|
27
28
|
for x in self._parameters_dict.values():
|
|
28
29
|
parameters.append(x._to_api_response_model0())
|
|
29
|
-
return
|
|
30
|
+
return rm.ParametersModel(parameters=parameters)
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
@dataclass
|
|
@@ -34,21 +35,21 @@ class ParameterConfigsSet:
|
|
|
34
35
|
"""
|
|
35
36
|
Pool of parameter configs, can create multiple for unit testing purposes
|
|
36
37
|
"""
|
|
37
|
-
_data: dict[str,
|
|
38
|
-
_data_source_params: dict[str,
|
|
38
|
+
_data: dict[str, pc.ParameterConfigBase] = field(default_factory=OrderedDict)
|
|
39
|
+
_data_source_params: dict[str, pc.DataSourceParameterConfig] = field(default_factory=dict)
|
|
39
40
|
|
|
40
|
-
def get(self, name: Optional[str]) -> Optional[
|
|
41
|
+
def get(self, name: Optional[str]) -> Optional[pc.ParameterConfigBase]:
|
|
41
42
|
try:
|
|
42
43
|
return self._data[name] if name is not None else None
|
|
43
44
|
except KeyError as e:
|
|
44
45
|
raise u.ConfigurationError(f'Unable to find parameter named "{name}"') from e
|
|
45
46
|
|
|
46
|
-
def add(self, param_config:
|
|
47
|
+
def add(self, param_config: pc.ParameterConfigBase) -> None:
|
|
47
48
|
self._data[param_config.name] = param_config
|
|
48
|
-
if isinstance(param_config,
|
|
49
|
+
if isinstance(param_config, pc.DataSourceParameterConfig):
|
|
49
50
|
self._data_source_params[param_config.name] = param_config
|
|
50
51
|
|
|
51
|
-
def _get_all_ds_param_configs(self) -> Sequence[
|
|
52
|
+
def _get_all_ds_param_configs(self) -> Sequence[pc.DataSourceParameterConfig]:
|
|
52
53
|
return list(self._data_source_params.values())
|
|
53
54
|
|
|
54
55
|
def __convert_datasource_params(self, df_dict: dict[str, pl.DataFrame]) -> None:
|
|
@@ -64,7 +65,7 @@ class ParameterConfigsSet:
|
|
|
64
65
|
if parent_name is not None and parent_name not in done:
|
|
65
66
|
stack.append(parent_name)
|
|
66
67
|
continue
|
|
67
|
-
if isinstance(param,
|
|
68
|
+
if isinstance(param, pc.DataSourceParameterConfig):
|
|
68
69
|
if name not in df_dict:
|
|
69
70
|
raise u.ConfigurationError(f'No reference data found for parameter "{name}"')
|
|
70
71
|
self._data[name] = param.convert(df_dict[name])
|
|
@@ -73,12 +74,12 @@ class ParameterConfigsSet:
|
|
|
73
74
|
|
|
74
75
|
def __validate_param_relationships(self) -> None:
|
|
75
76
|
for param_config in self._data.values():
|
|
76
|
-
assert isinstance(param_config,
|
|
77
|
+
assert isinstance(param_config, pc.ParameterConfig)
|
|
77
78
|
parent_name = param_config.parent_name
|
|
78
79
|
parent = self.get(parent_name)
|
|
79
80
|
if parent:
|
|
80
|
-
if not isinstance(param_config,
|
|
81
|
-
if not isinstance(parent,
|
|
81
|
+
if not isinstance(param_config, pc.SelectionParameterConfig):
|
|
82
|
+
if not isinstance(parent, pc.SingleSelectParameterConfig):
|
|
82
83
|
raise u.ConfigurationError(f'Only single-select parameters can be parents of non-select parameters. ' +
|
|
83
84
|
f'Parameter "{parent_name}" is the parent of non-select parameter ' +
|
|
84
85
|
f'"{param_config.name}" but "{parent_name}" is not a single-select parameter.')
|
|
@@ -92,7 +93,7 @@ class ParameterConfigsSet:
|
|
|
92
93
|
f'among the options of non-select parameter "{param_config.name}".')
|
|
93
94
|
seen.update(lookup_keys)
|
|
94
95
|
|
|
95
|
-
if not isinstance(parent,
|
|
96
|
+
if not isinstance(parent, pc.SelectionParameterConfig):
|
|
96
97
|
raise u.ConfigurationError(f'Only selection parameters can be parents. Parameter "{parent_name}" is the parent of ' +
|
|
97
98
|
f'"{param_config.name}" but "{parent_name}" is not a selection parameter.')
|
|
98
99
|
|
|
@@ -121,7 +122,7 @@ class ParameterConfigsSet:
|
|
|
121
122
|
children = []
|
|
122
123
|
if curr_name not in parameters_by_name:
|
|
123
124
|
param_conf = self.get(curr_name)
|
|
124
|
-
assert isinstance(param_conf,
|
|
125
|
+
assert isinstance(param_conf, pc.ParameterConfig)
|
|
125
126
|
parent_name = param_conf.parent_name
|
|
126
127
|
if parent_name is None:
|
|
127
128
|
parent = None
|
|
@@ -133,7 +134,7 @@ class ParameterConfigsSet:
|
|
|
133
134
|
assert isinstance(parent, p._SelectionParameter) or parent is None
|
|
134
135
|
param = param_conf.with_selection(selections.get(curr_name), user, parent)
|
|
135
136
|
parameters_by_name[curr_name] = param
|
|
136
|
-
if isinstance(param_conf,
|
|
137
|
+
if isinstance(param_conf, pc.SelectionParameterConfig):
|
|
137
138
|
children = list(x for x in param_conf.children.keys() if x in dataset_params)
|
|
138
139
|
stack.pop()
|
|
139
140
|
stack.extend(children)
|
|
@@ -141,10 +142,10 @@ class ParameterConfigsSet:
|
|
|
141
142
|
ordered_parameters = OrderedDict((key, parameters_by_name[key]) for key in dataset_params if key in parameters_by_name)
|
|
142
143
|
return ParameterSet(ordered_parameters)
|
|
143
144
|
|
|
144
|
-
def get_all_api_field_info(self) -> dict[str,
|
|
145
|
+
def get_all_api_field_info(self) -> dict[str, pc.APIParamFieldInfo]:
|
|
145
146
|
api_field_infos = {}
|
|
146
147
|
for param, config in self._data.items():
|
|
147
|
-
assert isinstance(config,
|
|
148
|
+
assert isinstance(config, pc.ParameterConfig)
|
|
148
149
|
api_field_infos[param] = config.get_api_field_info()
|
|
149
150
|
return api_field_infos
|
|
150
151
|
|
|
@@ -153,44 +154,53 @@ class ParameterConfigsSetIO:
|
|
|
153
154
|
"""
|
|
154
155
|
Static class for the singleton object of ParameterConfigsSet
|
|
155
156
|
"""
|
|
156
|
-
|
|
157
|
+
param_factories: list[Callable[[ParametersArgs], pc.ParameterConfigBase]] = [] # this is static (set in load_from_file) to stage the functions from pyconfigs/parameters.py before using them
|
|
157
158
|
|
|
158
159
|
@classmethod
|
|
159
|
-
def _get_df_dict_from_data_sources(
|
|
160
|
-
|
|
160
|
+
def _get_df_dict_from_data_sources(
|
|
161
|
+
cls, param_configs_set: ParameterConfigsSet, default_conn_name: str, seeds: Seeds, conn_set: ConnectionSet
|
|
162
|
+
) -> dict[str, pl.DataFrame]:
|
|
163
|
+
|
|
164
|
+
def get_dataframe(ds_param_config: pc.DataSourceParameterConfig) -> tuple[str, pl.DataFrame]:
|
|
161
165
|
return ds_param_config.name, ds_param_config.get_dataframe(default_conn_name, conn_set, seeds)
|
|
162
166
|
|
|
163
|
-
ds_param_configs =
|
|
167
|
+
ds_param_configs = param_configs_set._get_all_ds_param_configs()
|
|
164
168
|
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
165
169
|
df_dict = dict(executor.map(get_dataframe, ds_param_configs))
|
|
166
170
|
|
|
167
171
|
return df_dict
|
|
168
172
|
|
|
169
173
|
@classmethod
|
|
170
|
-
def _add_from_dict(cls, param_config: ParametersConfig) -> None:
|
|
174
|
+
def _add_from_dict(cls, param_configs_set: ParameterConfigsSet, param_config: ParametersConfig) -> None:
|
|
171
175
|
ptype = getattr(p, param_config.type)
|
|
172
176
|
factory = getattr(ptype, param_config.factory)
|
|
173
|
-
factory(**param_config.arguments)
|
|
174
|
-
|
|
175
|
-
@classmethod
|
|
176
|
-
def get_param_args(cls, conn_args: ConnectionsArgs) -> ParametersArgs:
|
|
177
|
-
return ParametersArgs(conn_args.project_path, conn_args.proj_vars, conn_args.env_vars)
|
|
177
|
+
obj = factory(**param_config.arguments)
|
|
178
|
+
param_configs_set.add(obj)
|
|
178
179
|
|
|
179
180
|
@classmethod
|
|
180
181
|
def load_from_file(
|
|
181
182
|
cls, logger: u.Logger, base_path: str, manifest_cfg: ManifestConfig, seeds: Seeds, conn_set: ConnectionSet, param_args: ParametersArgs
|
|
182
183
|
) -> ParameterConfigsSet:
|
|
183
184
|
start = time.time()
|
|
184
|
-
|
|
185
|
+
param_configs_set = ParameterConfigsSet()
|
|
185
186
|
|
|
186
187
|
for param_as_dict in manifest_cfg.parameters:
|
|
187
|
-
cls._add_from_dict(param_as_dict)
|
|
188
|
+
cls._add_from_dict(param_configs_set, param_as_dict)
|
|
189
|
+
|
|
190
|
+
main_result = pm.run_pyconfig_main(base_path, c.PARAMETERS_FILE, {"sqrl": param_args}) # adds to cls.param_factories as side effect
|
|
191
|
+
param_factories = cls.param_factories
|
|
192
|
+
cls.param_factories = []
|
|
193
|
+
|
|
194
|
+
for param_factory in param_factories:
|
|
195
|
+
param_configs_set.add(param_factory(param_args))
|
|
188
196
|
|
|
189
|
-
|
|
197
|
+
if isinstance(main_result, list):
|
|
198
|
+
for param_config in main_result:
|
|
199
|
+
param_configs_set.add(param_config)
|
|
190
200
|
|
|
191
201
|
default_conn_name = manifest_cfg.env_vars.get(c.SQRL_CONNECTIONS_DEFAULT_NAME_USED, "default")
|
|
192
|
-
df_dict = cls._get_df_dict_from_data_sources(default_conn_name, seeds, conn_set)
|
|
193
|
-
|
|
202
|
+
df_dict = cls._get_df_dict_from_data_sources(param_configs_set, default_conn_name, seeds, conn_set)
|
|
203
|
+
param_configs_set._post_process_params(df_dict)
|
|
194
204
|
|
|
195
205
|
logger.log_activity_time("loading parameters", start)
|
|
196
|
-
return
|
|
206
|
+
return param_configs_set
|