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.

Files changed (96) hide show
  1. dateutils/__init__.py +6 -460
  2. dateutils/_enums.py +25 -0
  3. dateutils/_implementation.py +409 -0
  4. dateutils/types.py +6 -0
  5. squirrels/__init__.py +9 -13
  6. squirrels/_api_routes/__init__.py +5 -0
  7. squirrels/_api_routes/auth.py +262 -0
  8. squirrels/_api_routes/base.py +154 -0
  9. squirrels/_api_routes/dashboards.py +142 -0
  10. squirrels/_api_routes/data_management.py +103 -0
  11. squirrels/_api_routes/datasets.py +242 -0
  12. squirrels/_api_routes/oauth2.py +300 -0
  13. squirrels/_api_routes/project.py +214 -0
  14. squirrels/_api_server.py +145 -748
  15. squirrels/_arguments/__init__.py +0 -0
  16. squirrels/{arguments → _arguments}/init_time_args.py +7 -2
  17. squirrels/{arguments → _arguments}/run_time_args.py +4 -26
  18. squirrels/_auth.py +646 -93
  19. squirrels/_connection_set.py +5 -5
  20. squirrels/_constants.py +7 -1
  21. squirrels/{_dashboards_io.py → _dashboards.py} +87 -6
  22. squirrels/_data_sources.py +564 -0
  23. squirrels/_exceptions.py +9 -37
  24. squirrels/_initializer.py +31 -26
  25. squirrels/_manifest.py +5 -5
  26. squirrels/_model_builder.py +1 -1
  27. squirrels/_model_configs.py +2 -2
  28. squirrels/_model_queries.py +1 -1
  29. squirrels/_models.py +40 -27
  30. squirrels/{package_data → _package_data}/base_project/.env +1 -0
  31. squirrels/{package_data → _package_data}/base_project/.env.example +1 -0
  32. squirrels/{package_data → _package_data}/base_project/dashboards/dashboard_example.py +4 -4
  33. squirrels/{package_data → _package_data}/base_project/dashboards/dashboard_example.yml +2 -2
  34. squirrels/_package_data/base_project/macros/macros_example.sql +17 -0
  35. squirrels/{package_data → _package_data}/base_project/models/builds/build_example.py +2 -2
  36. squirrels/{package_data → _package_data}/base_project/models/builds/build_example.sql +1 -1
  37. squirrels/{package_data → _package_data}/base_project/models/dbviews/dbview_example.sql +1 -1
  38. squirrels/_package_data/base_project/models/federates/federate_example.py +41 -0
  39. squirrels/_package_data/base_project/models/federates/federate_example.sql +25 -0
  40. squirrels/{package_data → _package_data}/base_project/models/federates/federate_example.yml +6 -6
  41. squirrels/{package_data → _package_data}/base_project/parameters.yml +9 -8
  42. squirrels/_package_data/base_project/pyconfigs/connections.py +14 -0
  43. squirrels/{package_data → _package_data}/base_project/pyconfigs/context.py +14 -16
  44. squirrels/_package_data/base_project/pyconfigs/parameters.py +106 -0
  45. squirrels/_package_data/base_project/pyconfigs/user.py +51 -0
  46. squirrels/_package_data/templates/dataset_results.html +112 -0
  47. squirrels/_package_data/templates/oauth_login.html +271 -0
  48. squirrels/_parameter_configs.py +35 -35
  49. squirrels/_parameter_options.py +348 -0
  50. squirrels/_parameter_sets.py +47 -37
  51. squirrels/_parameters.py +1664 -0
  52. squirrels/_project.py +76 -32
  53. squirrels/_py_module.py +3 -2
  54. squirrels/_schemas/__init__.py +0 -0
  55. squirrels/_schemas/auth_models.py +144 -0
  56. squirrels/_schemas/query_param_models.py +67 -0
  57. squirrels/{_api_response_models.py → _schemas/response_models.py} +12 -8
  58. squirrels/_utils.py +38 -4
  59. squirrels/arguments.py +2 -0
  60. squirrels/auth.py +1 -0
  61. squirrels/connections.py +1 -0
  62. squirrels/dashboards.py +1 -82
  63. squirrels/data_sources.py +8 -563
  64. squirrels/parameter_options.py +8 -348
  65. squirrels/parameters.py +9 -1266
  66. squirrels/types.py +11 -0
  67. {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/METADATA +4 -1
  68. squirrels-0.5.0b4.dist-info/RECORD +94 -0
  69. squirrels/package_data/base_project/macros/macros_example.sql +0 -15
  70. squirrels/package_data/base_project/models/federates/federate_example.py +0 -44
  71. squirrels/package_data/base_project/models/federates/federate_example.sql +0 -17
  72. squirrels/package_data/base_project/pyconfigs/connections.py +0 -14
  73. squirrels/package_data/base_project/pyconfigs/parameters.py +0 -93
  74. squirrels/package_data/base_project/pyconfigs/user.py +0 -23
  75. squirrels-0.5.0b2.dist-info/RECORD +0 -70
  76. /squirrels/{dataset_result.py → _dataset_types.py} +0 -0
  77. /squirrels/{package_data → _package_data}/base_project/assets/expenses.db +0 -0
  78. /squirrels/{package_data → _package_data}/base_project/assets/weather.db +0 -0
  79. /squirrels/{package_data → _package_data}/base_project/connections.yml +0 -0
  80. /squirrels/{package_data → _package_data}/base_project/docker/.dockerignore +0 -0
  81. /squirrels/{package_data → _package_data}/base_project/docker/Dockerfile +0 -0
  82. /squirrels/{package_data → _package_data}/base_project/docker/compose.yml +0 -0
  83. /squirrels/{package_data → _package_data}/base_project/duckdb_init.sql +0 -0
  84. /squirrels/{package_data/base_project/.gitignore → _package_data/base_project/gitignore} +0 -0
  85. /squirrels/{package_data → _package_data}/base_project/models/builds/build_example.yml +0 -0
  86. /squirrels/{package_data → _package_data}/base_project/models/dbviews/dbview_example.yml +0 -0
  87. /squirrels/{package_data → _package_data}/base_project/models/sources.yml +0 -0
  88. /squirrels/{package_data → _package_data}/base_project/seeds/seed_categories.csv +0 -0
  89. /squirrels/{package_data → _package_data}/base_project/seeds/seed_categories.yml +0 -0
  90. /squirrels/{package_data → _package_data}/base_project/seeds/seed_subcategories.csv +0 -0
  91. /squirrels/{package_data → _package_data}/base_project/seeds/seed_subcategories.yml +0 -0
  92. /squirrels/{package_data → _package_data}/base_project/squirrels.yml.j2 +0 -0
  93. /squirrels/{package_data → _package_data}/base_project/tmp/.gitignore +0 -0
  94. {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/WHEEL +0 -0
  95. {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/entry_points.txt +0 -0
  96. {squirrels-0.5.0b2.dist-info → squirrels-0.5.0b4.dist-info}/licenses/LICENSE +0 -0
@@ -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 _utils as u, _constants as c, parameters as p, _parameter_configs as _pc, _py_module as pm, _api_response_models as arm
8
- from .arguments.init_time_args import ParametersArgs
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, ConnectionsArgs
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) -> arm.ParametersModel:
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 arm.ParametersModel(parameters=parameters)
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, _pc.ParameterConfigBase] = field(default_factory=OrderedDict)
38
- _data_source_params: dict[str, _pc.DataSourceParameterConfig] = field(default_factory=dict)
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[_pc.ParameterConfigBase]:
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: _pc.ParameterConfigBase) -> None:
47
+ def add(self, param_config: pc.ParameterConfigBase) -> None:
47
48
  self._data[param_config.name] = param_config
48
- if isinstance(param_config, _pc.DataSourceParameterConfig):
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[_pc.DataSourceParameterConfig]:
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, _pc.DataSourceParameterConfig):
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, _pc.ParameterConfig)
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, _pc.SelectionParameterConfig):
81
- if not isinstance(parent, _pc.SingleSelectParameterConfig):
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, _pc.SelectionParameterConfig):
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, _pc.ParameterConfig)
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, _pc.SelectionParameterConfig):
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, _pc.APIParamFieldInfo]:
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, _pc.ParameterConfig)
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
- obj: ParameterConfigsSet # this is static (set in load_from_file) to simplify development experience for pyconfigs/parameters.py
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(cls, default_conn_name: str, seeds: Seeds, conn_set: ConnectionSet) -> dict[str, pl.DataFrame]:
160
- def get_dataframe(ds_param_config: _pc.DataSourceParameterConfig) -> tuple[str, pl.DataFrame]:
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 = cls.obj._get_all_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
- cls.obj = ParameterConfigsSet()
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
- pm.run_pyconfig_main(base_path, c.PARAMETERS_FILE, {"sqrl": param_args})
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
- cls.obj._post_process_params(df_dict)
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 cls.obj
206
+ return param_configs_set