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
@@ -1,55 +1,87 @@
1
- import squirrels as sr
1
+ from squirrels import ParametersArgs, parameters as p, parameter_options as po, data_sources as ds
2
2
 
3
3
 
4
- def main(sqrl: sr.ParametersArgs) -> None:
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
- > sr.SingleSelectParameter.Create(...)
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
- """ Example of creating SingleSelectParameter and specifying each option by code """
19
+ ## Example of creating SingleSelectParameter and specifying each option by code
20
20
  group_by_options = [
21
- sr.SelectParameterOption("g0", "Transaction", columns=["id", "date"]),
22
- sr.SelectParameterOption("g1", "Date", columns=["date"]),
23
- sr.SelectParameterOption("g2", "Category", columns=["category"]),
24
- sr.SelectParameterOption("g3", "Subcategory", columns=["category", "subcategory"]),
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
- sr.SingleSelectParameter.Create("group_by", "Group By", group_by_options)
26
+ p.SingleSelectParameter.Create(
27
+ "group_by", "Group By", group_by_options, description="Dimension to aggregate by"
28
+ )
27
29
 
28
- """ Example of creating DateParameter """
29
- sr.DateParameter.CreateSimple("start_date", "Start Date", "2023-01-01")
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
- """ Example of creating DateParameter from list of DateParameterOption's """
32
- end_date_option = [sr.DateParameterOption("2023-12-31")]
33
- sr.DateParameter.Create("end_date", "End Date", end_date_option)
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
- """ Example of creating DateRangeParameter """
36
- sr.DateRangeParameter.CreateSimple("date_range", "Date Range", "2023-01-01", "2023-12-31")
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
- """ Example of creating MultiSelectParameter from lookup query/table """
39
- category_ds = sr.MultiSelectDataSource("categories", "category_id", "category")
40
- sr.MultiSelectParameter.CreateFromSource("category", "Category Filter", category_ds)
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
- """ Example of creating MultiSelectParameter with parent from lookup query/table """
43
- subcategory_ds = sr.MultiSelectDataSource("subcategories", "subcategory_id", "subcategory", parent_id_col="category_id")
44
- sr.MultiSelectParameter.CreateFromSource("subcategory", "Subcategory Filter", subcategory_ds, parent_name="category")
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
- """ Example of creating NumberParameter """
47
- sr.NumberParameter.CreateSimple("min_filter", "Amounts Greater Than", min_value=0, max_value=500, increment=10)
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
- """ Example of creating NumberParameter from lookup query/table """
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 = sr.NumberDataSource(query, "min_value", "max_value", increment_col="increment", default_value_col="max_value")
52
- sr.NumberParameter.CreateFromSource("max_filter", "Amounts Less Than", max_amount_ds)
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
- """ Example of creating NumberRangeParameter """
55
- sr.NumberRangeParameter.CreateSimple("between_filter", "Amounts Between", 0, 500, default_lower_value=10, default_upper_value=400)
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,6 @@
1
+ "category_id","category"
2
+ "0","Food"
3
+ "1","Bills"
4
+ "2","Shopping"
5
+ "3","Transportation"
6
+ "4","Entertainment"
@@ -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 ## model with same name is used unless "model" field is specified for dataset
22
+ - name: dataset_example ## model name uses same name unless "model" field is specified
35
23
  label: Dataset Example
36
- scope: public ## optional - one of 'public' (default), 'protected', or 'private'
37
- parameters: ## optional - if not specified, then all parameters are used
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: {} ## optional
34
+ traits: {} ## optional - defaults to empty object
46
35
 
47
- - name: private_dataset_example
36
+ - name: protected_dataset_example ## requires auth.py file to work
48
37
  label: Dataset Example 2
49
38
  model: dataset_example
50
- scope: private
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: 0
79
+ # parameters.cache.ttl_minutes: 60
65
80
  # results.cache.size: 128
66
- # results.cache.ttl_minutes: 0
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]
@@ -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": str(self._min_value),
260
- "max_value": str(self._max_value),
261
- "increment": str(self._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
+