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.
- squirrels/__init__.py +4 -0
- squirrels/_api_routes/__init__.py +5 -0
- squirrels/_api_routes/auth.py +337 -0
- squirrels/_api_routes/base.py +196 -0
- squirrels/_api_routes/dashboards.py +156 -0
- squirrels/_api_routes/data_management.py +148 -0
- squirrels/_api_routes/datasets.py +220 -0
- squirrels/_api_routes/project.py +289 -0
- squirrels/_api_server.py +440 -792
- squirrels/_arguments/__init__.py +0 -0
- squirrels/_arguments/{_init_time_args.py → init_time_args.py} +23 -43
- squirrels/_arguments/{_run_time_args.py → run_time_args.py} +32 -68
- squirrels/_auth.py +590 -264
- squirrels/_command_line.py +130 -58
- squirrels/_compile_prompts.py +147 -0
- squirrels/_connection_set.py +16 -15
- squirrels/_constants.py +36 -11
- squirrels/_dashboards.py +179 -0
- squirrels/_data_sources.py +40 -34
- squirrels/_dataset_types.py +16 -11
- squirrels/_env_vars.py +209 -0
- squirrels/_exceptions.py +9 -37
- squirrels/_http_error_responses.py +52 -0
- squirrels/_initializer.py +7 -6
- squirrels/_logging.py +121 -0
- squirrels/_manifest.py +155 -77
- squirrels/_mcp_server.py +578 -0
- squirrels/_model_builder.py +11 -55
- squirrels/_model_configs.py +5 -5
- squirrels/_model_queries.py +1 -1
- squirrels/_models.py +276 -143
- squirrels/_package_data/base_project/.env +1 -24
- squirrels/_package_data/base_project/.env.example +31 -17
- squirrels/_package_data/base_project/connections.yml +4 -3
- squirrels/_package_data/base_project/dashboards/dashboard_example.py +13 -7
- squirrels/_package_data/base_project/dashboards/dashboard_example.yml +6 -6
- squirrels/_package_data/base_project/docker/Dockerfile +2 -2
- squirrels/_package_data/base_project/docker/compose.yml +1 -1
- squirrels/_package_data/base_project/duckdb_init.sql +1 -0
- squirrels/_package_data/base_project/models/builds/build_example.py +2 -2
- squirrels/_package_data/base_project/models/dbviews/dbview_example.sql +7 -2
- squirrels/_package_data/base_project/models/dbviews/dbview_example.yml +16 -10
- squirrels/_package_data/base_project/models/federates/federate_example.py +27 -17
- squirrels/_package_data/base_project/models/federates/federate_example.sql +3 -7
- squirrels/_package_data/base_project/models/federates/federate_example.yml +7 -7
- squirrels/_package_data/base_project/models/sources.yml +5 -6
- squirrels/_package_data/base_project/parameters.yml +24 -38
- squirrels/_package_data/base_project/pyconfigs/connections.py +8 -3
- squirrels/_package_data/base_project/pyconfigs/context.py +26 -14
- squirrels/_package_data/base_project/pyconfigs/parameters.py +124 -81
- squirrels/_package_data/base_project/pyconfigs/user.py +48 -15
- squirrels/_package_data/base_project/resources/public/.gitkeep +0 -0
- squirrels/_package_data/base_project/seeds/seed_categories.yml +1 -1
- squirrels/_package_data/base_project/seeds/seed_subcategories.yml +1 -1
- squirrels/_package_data/base_project/squirrels.yml.j2 +21 -31
- squirrels/_package_data/templates/login_successful.html +53 -0
- squirrels/_package_data/templates/squirrels_studio.html +22 -0
- squirrels/_parameter_configs.py +43 -22
- squirrels/_parameter_options.py +1 -1
- squirrels/_parameter_sets.py +41 -30
- squirrels/_parameters.py +560 -123
- squirrels/_project.py +487 -277
- squirrels/_py_module.py +71 -10
- squirrels/_request_context.py +33 -0
- squirrels/_schemas/__init__.py +0 -0
- squirrels/_schemas/auth_models.py +83 -0
- squirrels/_schemas/query_param_models.py +70 -0
- squirrels/_schemas/request_models.py +26 -0
- squirrels/_schemas/response_models.py +286 -0
- squirrels/_seeds.py +52 -13
- squirrels/_sources.py +29 -23
- squirrels/_utils.py +221 -42
- squirrels/_version.py +1 -3
- squirrels/arguments.py +7 -2
- squirrels/auth.py +4 -0
- squirrels/connections.py +2 -0
- squirrels/dashboards.py +3 -1
- squirrels/data_sources.py +6 -0
- squirrels/parameter_options.py +5 -0
- squirrels/parameters.py +5 -0
- squirrels/types.py +10 -3
- squirrels-0.6.0.post0.dist-info/METADATA +148 -0
- squirrels-0.6.0.post0.dist-info/RECORD +101 -0
- {squirrels-0.5.0b3.dist-info → squirrels-0.6.0.post0.dist-info}/WHEEL +1 -1
- squirrels/_api_response_models.py +0 -190
- squirrels/_dashboard_types.py +0 -82
- squirrels/_dashboards_io.py +0 -79
- squirrels-0.5.0b3.dist-info/METADATA +0 -110
- squirrels-0.5.0b3.dist-info/RECORD +0 -80
- /squirrels/_package_data/base_project/{assets → resources}/expenses.db +0 -0
- /squirrels/_package_data/base_project/{assets → resources}/weather.db +0 -0
- {squirrels-0.5.0b3.dist-info → squirrels-0.6.0.post0.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
11
|
-
|
|
11
|
+
proj_vars: dict[str, Any]
|
|
12
|
+
env_vars: dict[str, str]
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
20
|
+
class AuthProviderArgs(ConnectionsArgs):
|
|
24
21
|
pass
|
|
25
22
|
|
|
26
23
|
|
|
27
24
|
@dataclass
|
|
28
|
-
class
|
|
29
|
-
|
|
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
|
-
|
|
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
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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 .
|
|
5
|
-
from ..
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
self.
|
|
20
|
-
self.
|
|
21
|
-
self.
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
self.
|
|
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
|
-
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
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
|
"""
|