squirrels 0.2.1__py3-none-any.whl → 0.3.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 (48) hide show
  1. squirrels/__init__.py +11 -4
  2. squirrels/_api_response_models.py +118 -0
  3. squirrels/_api_server.py +140 -75
  4. squirrels/_authenticator.py +10 -8
  5. squirrels/_command_line.py +17 -11
  6. squirrels/_connection_set.py +2 -2
  7. squirrels/_constants.py +13 -5
  8. squirrels/_initializer.py +23 -13
  9. squirrels/_manifest.py +20 -10
  10. squirrels/_models.py +303 -148
  11. squirrels/_parameter_configs.py +195 -57
  12. squirrels/_parameter_sets.py +14 -17
  13. squirrels/_py_module.py +2 -4
  14. squirrels/_seeds.py +38 -0
  15. squirrels/_utils.py +41 -33
  16. squirrels/arguments/run_time_args.py +76 -34
  17. squirrels/data_sources.py +172 -51
  18. squirrels/dateutils.py +3 -3
  19. squirrels/package_data/assets/index.js +14 -14
  20. squirrels/package_data/base_project/connections.yml +1 -1
  21. squirrels/package_data/base_project/database/expenses.db +0 -0
  22. squirrels/package_data/base_project/docker/Dockerfile +1 -1
  23. squirrels/package_data/base_project/environcfg.yml +7 -7
  24. squirrels/package_data/base_project/models/dbviews/database_view1.py +25 -14
  25. squirrels/package_data/base_project/models/dbviews/database_view1.sql +21 -14
  26. squirrels/package_data/base_project/models/federates/dataset_example.py +6 -5
  27. squirrels/package_data/base_project/models/federates/dataset_example.sql +1 -1
  28. squirrels/package_data/base_project/parameters.yml +57 -28
  29. squirrels/package_data/base_project/pyconfigs/auth.py +11 -10
  30. squirrels/package_data/base_project/pyconfigs/connections.py +6 -8
  31. squirrels/package_data/base_project/pyconfigs/context.py +49 -33
  32. squirrels/package_data/base_project/pyconfigs/parameters.py +62 -30
  33. squirrels/package_data/base_project/seeds/seed_categories.csv +6 -0
  34. squirrels/package_data/base_project/seeds/seed_subcategories.csv +15 -0
  35. squirrels/package_data/base_project/squirrels.yml.j2 +37 -20
  36. squirrels/parameter_options.py +30 -10
  37. squirrels/parameters.py +300 -70
  38. squirrels/user_base.py +3 -13
  39. squirrels-0.3.0.dist-info/LICENSE +201 -0
  40. {squirrels-0.2.1.dist-info → squirrels-0.3.0.dist-info}/METADATA +15 -15
  41. squirrels-0.3.0.dist-info/RECORD +56 -0
  42. {squirrels-0.2.1.dist-info → squirrels-0.3.0.dist-info}/WHEEL +1 -1
  43. squirrels/package_data/base_project/seeds/mocks/category.csv +0 -3
  44. squirrels/package_data/base_project/seeds/mocks/max_filter.csv +0 -2
  45. squirrels/package_data/base_project/seeds/mocks/subcategory.csv +0 -6
  46. squirrels-0.2.1.dist-info/LICENSE +0 -22
  47. squirrels-0.2.1.dist-info/RECORD +0 -55
  48. {squirrels-0.2.1.dist-info → squirrels-0.3.0.dist-info}/entry_points.txt +0 -0
squirrels/_initializer.py CHANGED
@@ -33,8 +33,11 @@ class Initializer:
33
33
  def _copy_database_file(self, filepath: str):
34
34
  self._copy_file(u.join_paths(c.DATABASE_FOLDER, filepath))
35
35
 
36
- def _copy_pyconfigs_file(self, filepath: str):
37
- self._copy_file(u.join_paths(c.PYCONFIG_FOLDER, filepath))
36
+ def _copy_pyconfig_file(self, filepath: str):
37
+ self._copy_file(u.join_paths(c.PYCONFIGS_FOLDER, filepath))
38
+
39
+ def _copy_seed_file(self, filepath: str):
40
+ self._copy_file(u.join_paths(c.SEEDS_FOLDER, filepath))
38
41
 
39
42
  def init_project(self, args):
40
43
  options = ["core", "connections", "parameters", "dbview", "federate", "auth", "sample_db"]
@@ -73,7 +76,7 @@ class Initializer:
73
76
  default=False),
74
77
  inquirer.List(SAMPLE_DB,
75
78
  message="What sample sqlite database do you wish to use (if any)?",
76
- choices=["none"] + c.DATABASE_CHOICES)
79
+ choices= c.DATABASE_CHOICES)
77
80
  ]
78
81
  answers.update(inquirer.prompt(remaining_questions))
79
82
 
@@ -124,11 +127,9 @@ class Initializer:
124
127
  "connections": c.CONNECTIONS_YML_FILE if connections_use_yaml else None
125
128
  }
126
129
  substitutions = {key: get_content(val) for key, val in file_name_dict.items()}
127
- substitutions["db_view_file"] = db_view_file
128
- substitutions["final_view_file"] = federate_file
129
130
 
130
131
  manifest_template = get_content(c.MANIFEST_JINJA_FILE)
131
- manifest_content = u.render_string(manifest_template, substitutions)
132
+ manifest_content = u.render_string(manifest_template, **substitutions)
132
133
  output_path = u.join_paths(base_proj_dir, TMP_FOLDER, c.MANIFEST_FILE)
133
134
  with open(u.join_paths(output_path), "w") as f:
134
135
  f.write(manifest_content)
@@ -139,26 +140,35 @@ class Initializer:
139
140
  self._copy_file(c.MANIFEST_FILE, src_folder=TMP_FOLDER)
140
141
 
141
142
  if connections_use_py:
142
- self._copy_pyconfigs_file(c.CONNECTIONS_FILE)
143
- elif not connections_use_yaml:
143
+ self._copy_pyconfig_file(c.CONNECTIONS_FILE)
144
+ elif connections_use_yaml:
145
+ pass # already included in squirrels.yml
146
+ else:
144
147
  raise NotImplementedError(f"Format '{connections_format}' not supported for configuring database connections")
145
148
 
146
149
  if parameters_use_py:
147
- self._copy_pyconfigs_file(c.PARAMETERS_FILE)
148
- elif not parameters_use_yaml:
150
+ self._copy_pyconfig_file(c.PARAMETERS_FILE)
151
+ elif parameters_use_yaml:
152
+ pass # already included in squirrels.yml
153
+ else:
149
154
  raise NotImplementedError(f"Format '{parameters_format}' not supported for configuring widget parameters")
150
155
 
151
- self._copy_pyconfigs_file(c.CONTEXT_FILE)
156
+ self._copy_pyconfig_file(c.CONTEXT_FILE)
152
157
  self._copy_file(c.ENVIRON_CONFIG_FILE)
158
+ self._copy_seed_file(c.CATEGORY_SEED_FILE)
159
+ self._copy_seed_file(c.SUBCATEGORY_SEED_FILE)
153
160
 
154
161
  self._copy_dbview_file(db_view_file)
155
162
  self._copy_federate_file(federate_file)
156
163
 
157
164
  if answers.get(AUTH, False):
158
- self._copy_pyconfigs_file(c.AUTH_FILE)
165
+ self._copy_pyconfig_file(c.AUTH_FILE)
159
166
 
160
167
  sample_db = answers.get(SAMPLE_DB)
161
- if sample_db is not None and sample_db != "none":
168
+ if sample_db is None: # None if not prompt mode and '--sample-db' option was not specified
169
+ sample_db = c.EXPENSES_DB_NAME
170
+
171
+ if sample_db != c.NO_DB:
162
172
  if sample_db == c.EXPENSES_DB_NAME:
163
173
  self._copy_database_file(c.EXPENSES_DB_NAME+".db")
164
174
  elif sample_db == c.WEATHER_DB_NAME:
squirrels/_manifest.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from typing import Optional
2
- from dataclasses import dataclass
2
+ from dataclasses import dataclass, field
3
3
  from enum import Enum
4
4
  import yaml
5
5
 
@@ -96,16 +96,20 @@ class ParametersConfig(ManifestComponentConfig):
96
96
  @dataclass
97
97
  class TestSetsConfig(ManifestComponentConfig):
98
98
  name: str
99
- user_attributes: dict
100
- parameters: dict
99
+ datasets: Optional[list[str]] = None
100
+ is_authenticated: bool = False
101
+ user_attributes: dict = field(default_factory=dict)
102
+ parameters: dict = field(default_factory=dict)
101
103
 
102
104
  @classmethod
103
105
  def from_dict(cls, kwargs: dict):
104
106
  cls._validate_required(kwargs, [c.TEST_SET_NAME_KEY], c.TEST_SETS_KEY)
105
107
  name = str(kwargs[c.TEST_SET_NAME_KEY])
108
+ datasets = kwargs.get(c.TEST_SET_DATASETS_KEY)
109
+ is_authenticated = (c.TEST_SET_USER_ATTR_KEY in kwargs)
106
110
  user_attributes = kwargs.get(c.TEST_SET_USER_ATTR_KEY, {})
107
111
  parameters = kwargs.get(c.TEST_SET_PARAMETERS_KEY, {})
108
- return cls(name, user_attributes, parameters)
112
+ return cls(name, datasets, is_authenticated, user_attributes, parameters)
109
113
 
110
114
 
111
115
  @dataclass
@@ -147,6 +151,7 @@ class DatasetsConfig(ManifestComponentConfig):
147
151
  scope: DatasetScope
148
152
  parameters: Optional[list[str]]
149
153
  traits: dict
154
+ default_test_set: Optional[str]
150
155
 
151
156
  @classmethod
152
157
  def from_dict(cls, kwargs: dict):
@@ -163,7 +168,8 @@ class DatasetsConfig(ManifestComponentConfig):
163
168
 
164
169
  parameters = kwargs.get(c.DATASET_PARAMETERS_KEY)
165
170
  traits = kwargs.get(c.DATASET_TRAITS_KEY, {})
166
- return cls(name, label, model, scope, parameters, traits)
171
+ default_test_set = kwargs.get(c.DATASET_DEFAULT_TEST_SET_KEY)
172
+ return cls(name, label, model, scope, parameters, traits, default_test_set)
167
173
 
168
174
 
169
175
  @dataclass
@@ -208,14 +214,18 @@ class _ManifestConfig:
208
214
  params = [ParametersConfig.from_dict(x) for x in kwargs.get(c.PARAMETERS_KEY, [])]
209
215
 
210
216
  test_sets = cls._create_configs_as_dict(TestSetsConfig, kwargs, c.TEST_SETS_KEY, c.TEST_SET_NAME_KEY)
211
- default_test_set: str = settings.get(c.TEST_SET_DEFAULT_USED_SETTING, c.DEFAULT_TEST_SET_NAME)
212
- test_sets.setdefault(default_test_set, TestSetsConfig.from_dict({c.TEST_SET_NAME_KEY: default_test_set}))
213
-
214
217
  dbviews = cls._create_configs_as_dict(DbviewConfig, kwargs, c.DBVIEWS_KEY, c.DBVIEW_NAME_KEY)
215
218
  federates = cls._create_configs_as_dict(FederateConfig, kwargs, c.FEDERATES_KEY, c.FEDERATE_NAME_KEY)
216
219
  datasets = cls._create_configs_as_dict(DatasetsConfig, kwargs, c.DATASETS_KEY, c.DATASET_NAME_KEY)
217
220
 
218
221
  return cls(proj_vars, packages, db_conns, params, test_sets, dbviews, federates, datasets, settings)
222
+
223
+ def get_default_test_set(self, dataset_name: str) -> tuple[str, dict]:
224
+ default_1 = self.datasets[dataset_name].default_test_set
225
+ default_2 = self.settings.get(c.TEST_SET_DEFAULT_USED_SETTING, c.DEFAULT_TEST_SET_NAME)
226
+ default_name = default_1 if default_1 is not None else default_2
227
+ default_test_set = self.selection_test_sets.get(default_name, TestSetsConfig.from_dict({c.TEST_SET_NAME_KEY: default_name}))
228
+ return default_name, default_test_set
219
229
 
220
230
 
221
231
  class ManifestIO:
@@ -227,8 +237,8 @@ class ManifestIO:
227
237
 
228
238
  start = time.time()
229
239
  raw_content = u.read_file(c.MANIFEST_FILE)
230
- env_config = EnvironConfigIO.obj.get_all_env_vars()
231
- content = u.render_string(raw_content, env_config)
240
+ env_vars = EnvironConfigIO.obj.get_all_env_vars()
241
+ content = u.render_string(raw_content, env_vars=env_vars, **env_vars) # TODO: deprecate **env_vars
232
242
  proj_config = yaml.safe_load(content)
233
243
  cls.obj = _ManifestConfig.from_dict(proj_config)
234
244
  timer.add_activity_time(f"loading {c.MANIFEST_FILE} file", start)