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.
- squirrels/__init__.py +11 -4
- squirrels/_api_response_models.py +118 -0
- squirrels/_api_server.py +140 -75
- squirrels/_authenticator.py +10 -8
- squirrels/_command_line.py +17 -11
- squirrels/_connection_set.py +2 -2
- squirrels/_constants.py +13 -5
- squirrels/_initializer.py +23 -13
- squirrels/_manifest.py +20 -10
- squirrels/_models.py +303 -148
- squirrels/_parameter_configs.py +195 -57
- squirrels/_parameter_sets.py +14 -17
- squirrels/_py_module.py +2 -4
- squirrels/_seeds.py +38 -0
- squirrels/_utils.py +41 -33
- squirrels/arguments/run_time_args.py +76 -34
- squirrels/data_sources.py +172 -51
- squirrels/dateutils.py +3 -3
- squirrels/package_data/assets/index.js +14 -14
- squirrels/package_data/base_project/connections.yml +1 -1
- squirrels/package_data/base_project/database/expenses.db +0 -0
- squirrels/package_data/base_project/docker/Dockerfile +1 -1
- squirrels/package_data/base_project/environcfg.yml +7 -7
- squirrels/package_data/base_project/models/dbviews/database_view1.py +25 -14
- squirrels/package_data/base_project/models/dbviews/database_view1.sql +21 -14
- squirrels/package_data/base_project/models/federates/dataset_example.py +6 -5
- squirrels/package_data/base_project/models/federates/dataset_example.sql +1 -1
- squirrels/package_data/base_project/parameters.yml +57 -28
- squirrels/package_data/base_project/pyconfigs/auth.py +11 -10
- squirrels/package_data/base_project/pyconfigs/connections.py +6 -8
- squirrels/package_data/base_project/pyconfigs/context.py +49 -33
- squirrels/package_data/base_project/pyconfigs/parameters.py +62 -30
- squirrels/package_data/base_project/seeds/seed_categories.csv +6 -0
- squirrels/package_data/base_project/seeds/seed_subcategories.csv +15 -0
- squirrels/package_data/base_project/squirrels.yml.j2 +37 -20
- squirrels/parameter_options.py +30 -10
- squirrels/parameters.py +300 -70
- squirrels/user_base.py +3 -13
- squirrels-0.3.0.dist-info/LICENSE +201 -0
- {squirrels-0.2.1.dist-info → squirrels-0.3.0.dist-info}/METADATA +15 -15
- squirrels-0.3.0.dist-info/RECORD +56 -0
- {squirrels-0.2.1.dist-info → squirrels-0.3.0.dist-info}/WHEEL +1 -1
- squirrels/package_data/base_project/seeds/mocks/category.csv +0 -3
- squirrels/package_data/base_project/seeds/mocks/max_filter.csv +0 -2
- squirrels/package_data/base_project/seeds/mocks/subcategory.csv +0 -6
- squirrels-0.2.1.dist-info/LICENSE +0 -22
- squirrels-0.2.1.dist-info/RECORD +0 -55
- {squirrels-0.2.1.dist-info → squirrels-0.3.0.dist-info}/entry_points.txt +0 -0
|
@@ -1,55 +1,87 @@
|
|
|
1
|
-
|
|
1
|
+
from squirrels import ParametersArgs, parameters as p, parameter_options as po, data_sources as ds
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def main(sqrl:
|
|
4
|
+
def main(sqrl: ParametersArgs) -> None:
|
|
5
5
|
"""
|
|
6
6
|
Create all widget parameters in this file. If two or more datasets use a different set of parameters, define them all
|
|
7
7
|
here, and specify the subset of parameters used for each dataset in the "squirrels.yml" file.
|
|
8
8
|
|
|
9
9
|
Parameters are created by a factory method associated to some parameters class. For example (note the "Create"):
|
|
10
|
-
>
|
|
10
|
+
> p.SingleSelectParameter.Create(...)
|
|
11
11
|
|
|
12
12
|
The parameter classes available are:
|
|
13
|
-
- SingleSelectParameter, MultiSelectParameter, DateParameter, DateRangeParameter, NumberParameter, NumberRangeParameter
|
|
13
|
+
- SingleSelectParameter, MultiSelectParameter, DateParameter, DateRangeParameter, NumberParameter, NumberRangeParameter, TextParameter
|
|
14
14
|
|
|
15
15
|
The factory methods available are:
|
|
16
16
|
- Create, CreateSimple, CreateFromSource
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
## Example of creating SingleSelectParameter and specifying each option by code
|
|
20
20
|
group_by_options = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
po.SelectParameterOption("g0", "Transaction", columns=["masked_id", "date", "description"], aliases=["id", "date", "description"]),
|
|
22
|
+
po.SelectParameterOption("g1", "Date", columns=["date"]),
|
|
23
|
+
po.SelectParameterOption("g2", "Category", columns=["category"]),
|
|
24
|
+
po.SelectParameterOption("g3", "Subcategory", columns=["category", "subcategory"]),
|
|
25
25
|
]
|
|
26
|
-
|
|
26
|
+
p.SingleSelectParameter.Create(
|
|
27
|
+
"group_by", "Group By", group_by_options, description="Dimension to aggregate by"
|
|
28
|
+
)
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
## Example of creating a TextParameter
|
|
31
|
+
parent_name = "group_by"
|
|
32
|
+
text_options = [po.TextParameterOption(parent_option_ids="g0")]
|
|
33
|
+
p.TextParameter.Create(
|
|
34
|
+
"description_filter", "Description Contains", text_options, parent_name=parent_name,
|
|
35
|
+
description="Filter by transactions with this description"
|
|
36
|
+
)
|
|
30
37
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
## Example of creating DateParameter
|
|
39
|
+
p.DateParameter.CreateSimple(
|
|
40
|
+
"start_date", "Start Date", "2023-01-01", description="Filter by transactions after this date"
|
|
41
|
+
)
|
|
34
42
|
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
## Example of creating DateParameter from list of DateParameterOption's
|
|
44
|
+
end_date_option = [po.DateParameterOption("2023-12-31")]
|
|
45
|
+
p.DateParameter.Create(
|
|
46
|
+
"end_date", "End Date", end_date_option, description="Filter by transactions before this date"
|
|
47
|
+
)
|
|
37
48
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
## Example of creating DateRangeParameter
|
|
50
|
+
p.DateRangeParameter.CreateSimple(
|
|
51
|
+
"date_range", "Date Range", "2023-01-01", "2023-12-31", description="Filter by transactions within this date range"
|
|
52
|
+
)
|
|
41
53
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
54
|
+
## Example of creating MultiSelectParameter from lookup query/table
|
|
55
|
+
category_ds = ds.SelectDataSource("seed_categories", "category_id", "category", from_seeds=True)
|
|
56
|
+
p.MultiSelectParameter.CreateFromSource(
|
|
57
|
+
"category", "Category Filter", category_ds, description="The expense categories to filter by"
|
|
58
|
+
)
|
|
45
59
|
|
|
46
|
-
|
|
47
|
-
|
|
60
|
+
## Example of creating MultiSelectParameter with parent from lookup query/table
|
|
61
|
+
parent_name = "category"
|
|
62
|
+
subcategory_ds = ds.SelectDataSource(
|
|
63
|
+
"seed_subcategories", "subcategory_id", "subcategory", from_seeds=True, parent_id_col="category_id"
|
|
64
|
+
)
|
|
65
|
+
p.MultiSelectParameter.CreateFromSource(
|
|
66
|
+
"subcategory", "Subcategory Filter", subcategory_ds, parent_name=parent_name,
|
|
67
|
+
description="The expense subcategories to filter by (available options based on selected 'Category Filter')"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
## Example of creating NumberParameter
|
|
71
|
+
p.NumberParameter.CreateSimple(
|
|
72
|
+
"min_filter", "Amounts Greater Than", min_value=0, max_value=500, increment=10,
|
|
73
|
+
description="Filter by transactions greater than this amount"
|
|
74
|
+
)
|
|
48
75
|
|
|
49
|
-
|
|
76
|
+
## Example of creating NumberParameter from lookup query/table
|
|
50
77
|
query = "SELECT 0 as min_value, max(-amount) as max_value, 10 as increment FROM transactions WHERE category <> 'Income'"
|
|
51
|
-
max_amount_ds =
|
|
52
|
-
|
|
78
|
+
max_amount_ds = ds.NumberDataSource(query, "min_value", "max_value", increment_col="increment", default_value_col="max_value")
|
|
79
|
+
p.NumberParameter.CreateFromSource(
|
|
80
|
+
"max_filter", "Amounts Less Than", max_amount_ds, description="Filter by transactions less than this amount"
|
|
81
|
+
)
|
|
53
82
|
|
|
54
|
-
|
|
55
|
-
|
|
83
|
+
## Example of creating NumberRangeParameter
|
|
84
|
+
p.NumberRangeParameter.CreateSimple(
|
|
85
|
+
"between_filter", "Amounts Between", 0, 500, default_lower_value=10, default_upper_value=400,
|
|
86
|
+
description="Filter by transaction amounts within this range"
|
|
87
|
+
)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"subcategory","category_id","subcategory_id"
|
|
2
|
+
"Dining Out","0","0"
|
|
3
|
+
"Groceries","0","1"
|
|
4
|
+
"Utilities","1","2"
|
|
5
|
+
"Electronics","2","3"
|
|
6
|
+
"Ride Sharing","3","4"
|
|
7
|
+
"Mobile","1","5"
|
|
8
|
+
"Home Decor","2","6"
|
|
9
|
+
"Internet","1","7"
|
|
10
|
+
"Theater","4","8"
|
|
11
|
+
"Movies","4","9"
|
|
12
|
+
"Sports","2","10"
|
|
13
|
+
"Public Transit","3","11"
|
|
14
|
+
"Clothing","2","12"
|
|
15
|
+
"Concerts","4","13"
|
|
@@ -18,42 +18,57 @@ packages: []
|
|
|
18
18
|
{{ parameters -}}
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
selection_test_sets:
|
|
22
|
-
- name: sample_test_set
|
|
23
|
-
user_attributes: ## optional unless there are user attributes used by parameters or models
|
|
24
|
-
is_internal: True
|
|
25
|
-
organization: org1
|
|
26
|
-
parameters: ## optional - for unspecified parameters, default value is used
|
|
27
|
-
group_by: g3
|
|
28
|
-
start_date: 2023-02-01
|
|
29
|
-
end_date: 2023-12-01
|
|
30
|
-
category: ["1"]
|
|
31
|
-
|
|
32
|
-
|
|
33
21
|
datasets:
|
|
34
|
-
- name: dataset_example
|
|
22
|
+
- name: dataset_example ## model name uses same name unless "model" field is specified
|
|
35
23
|
label: Dataset Example
|
|
36
|
-
scope: public
|
|
37
|
-
parameters:
|
|
24
|
+
scope: public ## optional - one of 'public' (default), 'protected', or 'private'
|
|
25
|
+
parameters: ## optional - if not specified, then all parameters are used
|
|
38
26
|
- group_by
|
|
27
|
+
- description_filter
|
|
39
28
|
- start_date
|
|
40
29
|
- end_date
|
|
41
30
|
- category
|
|
42
31
|
- subcategory
|
|
43
32
|
- min_filter
|
|
44
33
|
- max_filter
|
|
45
|
-
traits: {}
|
|
34
|
+
traits: {} ## optional - defaults to empty object
|
|
46
35
|
|
|
47
|
-
- name:
|
|
36
|
+
- name: protected_dataset_example ## requires auth.py file to work
|
|
48
37
|
label: Dataset Example 2
|
|
49
38
|
model: dataset_example
|
|
50
|
-
scope:
|
|
39
|
+
scope: protected
|
|
51
40
|
parameters:
|
|
52
41
|
- group_by
|
|
42
|
+
- description_filter
|
|
53
43
|
- date_range
|
|
54
44
|
- category
|
|
55
45
|
- subcategory
|
|
56
46
|
- between_filter
|
|
47
|
+
default_test_set: auth_test1 ## optional - if not specified, uses setting 'selection_test_sets.default_name_used'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
selection_test_sets:
|
|
51
|
+
- name: no_auth_test1
|
|
52
|
+
datasets: ## optional section - if not provided, then test set is applicable for any dataset
|
|
53
|
+
- dataset_example
|
|
54
|
+
parameters: ## optional section - for unspecified parameters, default value is used
|
|
55
|
+
start_date: 2023-07-01 ## this parameter only exists for dataset 'dataset_example'
|
|
56
|
+
|
|
57
|
+
- name: auth_test1
|
|
58
|
+
datasets:
|
|
59
|
+
- protected_dataset_example
|
|
60
|
+
user_attributes: ## optional section - required if using test set on non-public datasets
|
|
61
|
+
role: customer
|
|
62
|
+
parameters:
|
|
63
|
+
date_range: [2023-02-01,2023-12-01] ## this parameter only exists for dataset 'protected_dataset_example'
|
|
64
|
+
|
|
65
|
+
- name: auth_test2
|
|
66
|
+
user_attributes:
|
|
67
|
+
username: alice ## optional - defaults to empty string
|
|
68
|
+
is_internal: True ## optional - defaults to False
|
|
69
|
+
role: manager
|
|
70
|
+
parameters:
|
|
71
|
+
group_by: g3 ## this parameter exists for all datasets. "g3" is the id for option "subcategory"
|
|
57
72
|
|
|
58
73
|
|
|
59
74
|
settings: {}
|
|
@@ -61,10 +76,12 @@ settings: {}
|
|
|
61
76
|
## Default values for settings:
|
|
62
77
|
# auth.token.expire_minutes: 30
|
|
63
78
|
# parameters.cache.size: 1024
|
|
64
|
-
# parameters.cache.ttl_minutes:
|
|
79
|
+
# parameters.cache.ttl_minutes: 60
|
|
65
80
|
# results.cache.size: 128
|
|
66
|
-
# results.cache.ttl_minutes:
|
|
81
|
+
# results.cache.ttl_minutes: 60
|
|
67
82
|
# selection_test_sets.default_name_used: default
|
|
68
83
|
# connections.default_name_used: default
|
|
69
84
|
# defaults.federates.materialized: table
|
|
70
85
|
# in_memory_database: sqlite
|
|
86
|
+
# seeds.infer_schema: True
|
|
87
|
+
# seeds.na_values: [NA]
|
squirrels/parameter_options.py
CHANGED
|
@@ -50,10 +50,6 @@ class ParameterOption(metaclass=ABCMeta):
|
|
|
50
50
|
|
|
51
51
|
return True
|
|
52
52
|
|
|
53
|
-
@abstractmethod
|
|
54
|
-
def _to_json_dict(self):
|
|
55
|
-
return {}
|
|
56
|
-
|
|
57
53
|
|
|
58
54
|
@dataclass
|
|
59
55
|
class SelectParameterOption(ParameterOption):
|
|
@@ -143,9 +139,6 @@ class _DateTypeParameterOption(ParameterOption):
|
|
|
143
139
|
except ValueError as e:
|
|
144
140
|
raise ConfigurationError(f'Invalid format for date "{date_str}".') from e
|
|
145
141
|
|
|
146
|
-
def _to_json_dict(self):
|
|
147
|
-
return {}
|
|
148
|
-
|
|
149
142
|
|
|
150
143
|
@dataclass
|
|
151
144
|
class DateParameterOption(_DateTypeParameterOption):
|
|
@@ -256,9 +249,9 @@ class _NumericParameterOption(ParameterOption):
|
|
|
256
249
|
|
|
257
250
|
def _to_json_dict(self):
|
|
258
251
|
return {
|
|
259
|
-
"min_value":
|
|
260
|
-
"max_value":
|
|
261
|
-
"increment":
|
|
252
|
+
"min_value": float(self._min_value),
|
|
253
|
+
"max_value": float(self._max_value),
|
|
254
|
+
"increment": float(self._increment)
|
|
262
255
|
}
|
|
263
256
|
|
|
264
257
|
|
|
@@ -328,3 +321,30 @@ class NumberRangeParameterOption(_NumericParameterOption):
|
|
|
328
321
|
self._default_lower_value = self._validate_value(default_lower_value) if default_lower_value is not None else self._min_value
|
|
329
322
|
self._default_upper_value = self._validate_value(default_upper_value) if default_upper_value is not None else self._max_value
|
|
330
323
|
self._validate_lower_upper_values("default_lower_value", self._default_lower_value, "default_upper_value", self._default_upper_value)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
@dataclass
|
|
327
|
+
class TextParameterOption(ParameterOption):
|
|
328
|
+
"""
|
|
329
|
+
Parameter option for default text values if it varies based on selection of another parameter
|
|
330
|
+
|
|
331
|
+
Attributes:
|
|
332
|
+
default_text: Default text for this option
|
|
333
|
+
user_groups: The user groups this parameter option would show for if "user_attribute" is specified in the Parameter factory
|
|
334
|
+
parent_option_ids: Set of parent option ids this parameter option would show for if "parent" is specified in the Parameter factory
|
|
335
|
+
"""
|
|
336
|
+
_default_text: str # = field(default=None, kw_only=True)
|
|
337
|
+
|
|
338
|
+
def __init__(
|
|
339
|
+
self, *, default_text: str = "", user_groups: Union[Iterable[Any], str] = frozenset(),
|
|
340
|
+
parent_option_ids: Union[Iterable[str], str] = frozenset(), **kwargs
|
|
341
|
+
) -> None:
|
|
342
|
+
"""
|
|
343
|
+
Constructor for TextParameterOption
|
|
344
|
+
|
|
345
|
+
Parameters:
|
|
346
|
+
...see Attributes of TextParameterOption
|
|
347
|
+
"""
|
|
348
|
+
super().__init__(user_groups=user_groups, parent_option_ids=parent_option_ids)
|
|
349
|
+
self._default_text = default_text
|
|
350
|
+
|