squirrels 0.5.0b3__py3-none-any.whl → 0.6.0.post0__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.
Files changed (93) hide show
  1. squirrels/__init__.py +4 -0
  2. squirrels/_api_routes/__init__.py +5 -0
  3. squirrels/_api_routes/auth.py +337 -0
  4. squirrels/_api_routes/base.py +196 -0
  5. squirrels/_api_routes/dashboards.py +156 -0
  6. squirrels/_api_routes/data_management.py +148 -0
  7. squirrels/_api_routes/datasets.py +220 -0
  8. squirrels/_api_routes/project.py +289 -0
  9. squirrels/_api_server.py +440 -792
  10. squirrels/_arguments/__init__.py +0 -0
  11. squirrels/_arguments/{_init_time_args.py → init_time_args.py} +23 -43
  12. squirrels/_arguments/{_run_time_args.py → run_time_args.py} +32 -68
  13. squirrels/_auth.py +590 -264
  14. squirrels/_command_line.py +130 -58
  15. squirrels/_compile_prompts.py +147 -0
  16. squirrels/_connection_set.py +16 -15
  17. squirrels/_constants.py +36 -11
  18. squirrels/_dashboards.py +179 -0
  19. squirrels/_data_sources.py +40 -34
  20. squirrels/_dataset_types.py +16 -11
  21. squirrels/_env_vars.py +209 -0
  22. squirrels/_exceptions.py +9 -37
  23. squirrels/_http_error_responses.py +52 -0
  24. squirrels/_initializer.py +7 -6
  25. squirrels/_logging.py +121 -0
  26. squirrels/_manifest.py +155 -77
  27. squirrels/_mcp_server.py +578 -0
  28. squirrels/_model_builder.py +11 -55
  29. squirrels/_model_configs.py +5 -5
  30. squirrels/_model_queries.py +1 -1
  31. squirrels/_models.py +276 -143
  32. squirrels/_package_data/base_project/.env +1 -24
  33. squirrels/_package_data/base_project/.env.example +31 -17
  34. squirrels/_package_data/base_project/connections.yml +4 -3
  35. squirrels/_package_data/base_project/dashboards/dashboard_example.py +13 -7
  36. squirrels/_package_data/base_project/dashboards/dashboard_example.yml +6 -6
  37. squirrels/_package_data/base_project/docker/Dockerfile +2 -2
  38. squirrels/_package_data/base_project/docker/compose.yml +1 -1
  39. squirrels/_package_data/base_project/duckdb_init.sql +1 -0
  40. squirrels/_package_data/base_project/models/builds/build_example.py +2 -2
  41. squirrels/_package_data/base_project/models/dbviews/dbview_example.sql +7 -2
  42. squirrels/_package_data/base_project/models/dbviews/dbview_example.yml +16 -10
  43. squirrels/_package_data/base_project/models/federates/federate_example.py +27 -17
  44. squirrels/_package_data/base_project/models/federates/federate_example.sql +3 -7
  45. squirrels/_package_data/base_project/models/federates/federate_example.yml +7 -7
  46. squirrels/_package_data/base_project/models/sources.yml +5 -6
  47. squirrels/_package_data/base_project/parameters.yml +24 -38
  48. squirrels/_package_data/base_project/pyconfigs/connections.py +8 -3
  49. squirrels/_package_data/base_project/pyconfigs/context.py +26 -14
  50. squirrels/_package_data/base_project/pyconfigs/parameters.py +124 -81
  51. squirrels/_package_data/base_project/pyconfigs/user.py +48 -15
  52. squirrels/_package_data/base_project/resources/public/.gitkeep +0 -0
  53. squirrels/_package_data/base_project/seeds/seed_categories.yml +1 -1
  54. squirrels/_package_data/base_project/seeds/seed_subcategories.yml +1 -1
  55. squirrels/_package_data/base_project/squirrels.yml.j2 +21 -31
  56. squirrels/_package_data/templates/login_successful.html +53 -0
  57. squirrels/_package_data/templates/squirrels_studio.html +22 -0
  58. squirrels/_parameter_configs.py +43 -22
  59. squirrels/_parameter_options.py +1 -1
  60. squirrels/_parameter_sets.py +41 -30
  61. squirrels/_parameters.py +560 -123
  62. squirrels/_project.py +487 -277
  63. squirrels/_py_module.py +71 -10
  64. squirrels/_request_context.py +33 -0
  65. squirrels/_schemas/__init__.py +0 -0
  66. squirrels/_schemas/auth_models.py +83 -0
  67. squirrels/_schemas/query_param_models.py +70 -0
  68. squirrels/_schemas/request_models.py +26 -0
  69. squirrels/_schemas/response_models.py +286 -0
  70. squirrels/_seeds.py +52 -13
  71. squirrels/_sources.py +29 -23
  72. squirrels/_utils.py +221 -42
  73. squirrels/_version.py +1 -3
  74. squirrels/arguments.py +7 -2
  75. squirrels/auth.py +4 -0
  76. squirrels/connections.py +2 -0
  77. squirrels/dashboards.py +3 -1
  78. squirrels/data_sources.py +6 -0
  79. squirrels/parameter_options.py +5 -0
  80. squirrels/parameters.py +5 -0
  81. squirrels/types.py +10 -3
  82. squirrels-0.6.0.post0.dist-info/METADATA +148 -0
  83. squirrels-0.6.0.post0.dist-info/RECORD +101 -0
  84. {squirrels-0.5.0b3.dist-info → squirrels-0.6.0.post0.dist-info}/WHEEL +1 -1
  85. squirrels/_api_response_models.py +0 -190
  86. squirrels/_dashboard_types.py +0 -82
  87. squirrels/_dashboards_io.py +0 -79
  88. squirrels-0.5.0b3.dist-info/METADATA +0 -110
  89. squirrels-0.5.0b3.dist-info/RECORD +0 -80
  90. /squirrels/_package_data/base_project/{assets → resources}/expenses.db +0 -0
  91. /squirrels/_package_data/base_project/{assets → resources}/weather.db +0 -0
  92. {squirrels-0.5.0b3.dist-info → squirrels-0.6.0.post0.dist-info}/entry_points.txt +0 -0
  93. {squirrels-0.5.0b3.dist-info → squirrels-0.6.0.post0.dist-info}/licenses/LICENSE +0 -0
File without changes
@@ -4,60 +4,40 @@ import polars as pl
4
4
 
5
5
  from .. import _utils as u
6
6
 
7
+
7
8
  @dataclass
8
9
  class ConnectionsArgs:
9
10
  project_path: str
10
- _proj_vars: dict[str, Any]
11
- _env_vars: dict[str, str]
11
+ proj_vars: dict[str, Any]
12
+ env_vars: dict[str, str]
12
13
 
13
- @property
14
- def proj_vars(self) -> dict[str, Any]:
15
- return self._proj_vars.copy()
16
-
17
- @property
18
- def env_vars(self) -> dict[str, str]:
19
- return self._env_vars.copy()
14
+ def __post_init__(self) -> None:
15
+ self.proj_vars = self.proj_vars.copy()
16
+ self.env_vars = self.env_vars.copy()
20
17
 
21
18
 
22
19
  @dataclass
23
- class ParametersArgs(ConnectionsArgs):
20
+ class AuthProviderArgs(ConnectionsArgs):
24
21
  pass
25
22
 
26
23
 
27
24
  @dataclass
28
- class _WithConnectionDictArgs(ConnectionsArgs):
29
- _connections: dict[str, Any]
30
-
31
- @property
32
- def connections(self) -> dict[str, Any]:
33
- """
34
- A dictionary of connection keys to SQLAlchemy Engines for database connections.
35
-
36
- Can also be used to store other in-memory objects in advance such as ML models.
37
- """
38
- return self._connections.copy()
25
+ class ParametersArgs(ConnectionsArgs):
26
+ pass
39
27
 
40
28
 
41
- class BuildModelArgs(_WithConnectionDictArgs):
29
+ @dataclass
30
+ class BuildModelArgs(ConnectionsArgs):
31
+ connections: dict[str, Any]
32
+ dependencies: Iterable[str]
33
+ _ref_func: Callable[[str], pl.LazyFrame]
34
+ _run_external_sql_func: Callable[[str, str], pl.DataFrame]
42
35
 
43
- def __init__(
44
- self, conn_args: ConnectionsArgs, _connections: dict[str, Any],
45
- dependencies: Iterable[str],
46
- ref: Callable[[str], pl.LazyFrame],
47
- run_external_sql: Callable[[str, str], pl.DataFrame]
48
- ):
49
- super().__init__(conn_args.project_path, conn_args.proj_vars, conn_args.env_vars, _connections)
50
- self._dependencies = dependencies
51
- self._ref = ref
52
- self._run_external_sql = run_external_sql
36
+ def __post_init__(self) -> None:
37
+ super().__post_init__()
38
+ self.connections = self.connections.copy()
39
+ self.dependencies = set(self.dependencies)
53
40
 
54
- @property
55
- def dependencies(self) -> set[str]:
56
- """
57
- The set of dependent data model names
58
- """
59
- return set(self._dependencies)
60
-
61
41
  def ref(self, model: str) -> pl.LazyFrame:
62
42
  """
63
43
  Returns the result (as polars DataFrame) of a dependent model (predefined in "dependencies" function)
@@ -71,7 +51,7 @@ class BuildModelArgs(_WithConnectionDictArgs):
71
51
  Returns:
72
52
  A polars DataFrame
73
53
  """
74
- return self._ref(model)
54
+ return self._ref_func(model)
75
55
 
76
56
  def run_external_sql(self, connection_name: str, sql_query: str, **kwargs) -> pl.DataFrame:
77
57
  """
@@ -84,20 +64,20 @@ class BuildModelArgs(_WithConnectionDictArgs):
84
64
  Returns:
85
65
  The query result as a polars DataFrame
86
66
  """
87
- return self._run_external_sql(sql_query, connection_name)
67
+ return self._run_external_sql_func(sql_query, connection_name)
88
68
 
89
69
  def run_sql_on_dataframes(self, sql_query: str, *, dataframes: dict[str, pl.LazyFrame] | None = None, **kwargs) -> pl.DataFrame:
90
70
  """
91
71
  Uses a dictionary of dataframes to execute a SQL query in an embedded in-memory DuckDB database
92
72
 
93
73
  Arguments:
94
- sql_query: The SQL query to run
74
+ sql_query: The SQL query to run (DuckDB dialect)
95
75
  dataframes: A dictionary of table names to their polars LazyFrame. If None, uses results of dependent models
96
76
 
97
77
  Returns:
98
78
  The result as a polars DataFrame from running the query
99
79
  """
100
80
  if dataframes is None:
101
- dataframes = {x: self.ref(x) for x in self._dependencies}
81
+ dataframes = {x: self.ref(x) for x in self.dependencies}
102
82
 
103
83
  return u.run_sql_on_dataframes(sql_query, dataframes)
@@ -1,45 +1,27 @@
1
1
  from typing import Callable, Any, Coroutine
2
+ from dataclasses import dataclass, field, KW_ONLY
2
3
  import polars as pl
3
4
 
4
- from ._init_time_args import ParametersArgs, BuildModelArgs
5
- from .._auth import BaseUser
5
+ from .init_time_args import ConnectionsArgs, ParametersArgs, BuildModelArgs
6
+ from .._schemas.auth_models import AbstractUser
6
7
  from .._parameters import Parameter, TextValue
7
8
 
8
9
 
10
+ @dataclass
9
11
  class ContextArgs(ParametersArgs):
10
-
11
- def __init__(
12
- self, param_args: ParametersArgs,
13
- user: BaseUser | None,
14
- prms: dict[str, Parameter],
15
- traits: dict[str, Any]
16
- ):
17
- super().__init__(param_args.project_path, param_args.proj_vars, param_args.env_vars)
18
- self.user = user
19
- self._prms = prms
20
- self._traits = traits
21
- self._placeholders = {}
22
-
23
- @property
24
- def prms(self) -> dict[str, Parameter]:
25
- """
26
- A dictionary of parameter names to parameter
27
- """
28
- return self._prms.copy()
29
-
30
- @property
31
- def traits(self) -> dict[str, Any]:
32
- """
33
- A dictionary of dataset trait name to value
34
- """
35
- return self._traits.copy()
36
-
37
- @property
38
- def _placeholders_copy(self) -> dict[str, Any]:
39
- """
40
- A dictionary of placeholder name to placeholder value
41
- """
42
- return self._placeholders.copy()
12
+ user: AbstractUser
13
+ prms: dict[str, Parameter]
14
+ configurables: dict[str, str]
15
+ _conn_args: ConnectionsArgs
16
+ _: KW_ONLY
17
+ _placeholders: dict[str, Any] = field(default_factory=dict)
18
+
19
+ def __post_init__(self) -> None:
20
+ super().__post_init__()
21
+ self.prms = self.prms.copy()
22
+ self.configurables = self.configurables.copy()
23
+ self._conn_args = ConnectionsArgs(**self._conn_args.__dict__)
24
+ self._placeholders = self._placeholders.copy()
43
25
 
44
26
  def set_placeholder(self, placeholder: str, value: TextValue | Any) -> str:
45
27
  """
@@ -68,32 +50,14 @@ class ContextArgs(ParametersArgs):
68
50
  return (param_name in self.prms and self.prms[param_name].is_enabled())
69
51
 
70
52
 
71
- class ModelArgs(BuildModelArgs, ContextArgs):
72
-
73
- def __init__(
74
- self, ctx_args: ContextArgs, build_model_args: BuildModelArgs,
75
- ctx: dict[str, Any]
76
- ):
77
- super(ContextArgs, self).__init__(ctx_args.project_path, ctx_args.proj_vars, ctx_args.env_vars)
78
- self._project_path = ctx_args.project_path
79
- self._proj_vars = ctx_args.proj_vars
80
- self._env_vars = ctx_args.env_vars
81
- self.user = ctx_args.user
82
- self._prms = ctx_args.prms
83
- self._traits = ctx_args.traits
84
- self._placeholders = ctx_args._placeholders_copy
85
- self._connections = build_model_args.connections
86
- self._dependencies = build_model_args.dependencies
87
- self._ref = build_model_args.ref
88
- self._run_external_sql = build_model_args.run_external_sql
89
- self._ctx = ctx
90
-
91
- @property
92
- def ctx(self) -> dict[str, Any]:
93
- """
94
- Dictionary of context variables
95
- """
96
- return self._ctx.copy()
53
+ @dataclass
54
+ class ModelArgs(ContextArgs, BuildModelArgs):
55
+ ctx: dict[str, Any]
56
+
57
+ def __post_init__(self) -> None:
58
+ ContextArgs.__post_init__(self)
59
+ BuildModelArgs.__post_init__(self)
60
+ self.ctx = self.ctx.copy()
97
61
 
98
62
  def is_placeholder(self, placeholder: str) -> bool:
99
63
  """
@@ -122,14 +86,14 @@ class ModelArgs(BuildModelArgs, ContextArgs):
122
86
  return self._placeholders.get(placeholder)
123
87
 
124
88
 
125
- class DashboardArgs(ParametersArgs):
89
+ @dataclass
90
+ class DashboardArgs(ContextArgs):
91
+ ctx: dict[str, Any]
92
+ _get_dataset: Callable[[str, dict[str, Any]], Coroutine[Any, Any, pl.DataFrame]]
126
93
 
127
- def __init__(
128
- self, param_args: ParametersArgs,
129
- get_dataset: Callable[[str, dict[str, Any]], Coroutine[Any, Any, pl.DataFrame]]
130
- ):
131
- super().__init__(param_args.project_path, param_args.proj_vars, param_args.env_vars)
132
- self._get_dataset = get_dataset
94
+ def __post_init__(self) -> None:
95
+ super().__post_init__()
96
+ self.ctx = self.ctx.copy()
133
97
 
134
98
  async def dataset(self, name: str, *, fixed_parameters: dict[str, Any] = {}) -> pl.DataFrame:
135
99
  """