squirrels 0.1.0__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 (127) hide show
  1. dateutils/__init__.py +6 -0
  2. dateutils/_enums.py +25 -0
  3. squirrels/dateutils.py → dateutils/_implementation.py +409 -380
  4. dateutils/types.py +6 -0
  5. squirrels/__init__.py +21 -18
  6. squirrels/_api_routes/__init__.py +5 -0
  7. squirrels/_api_routes/auth.py +337 -0
  8. squirrels/_api_routes/base.py +196 -0
  9. squirrels/_api_routes/dashboards.py +156 -0
  10. squirrels/_api_routes/data_management.py +148 -0
  11. squirrels/_api_routes/datasets.py +220 -0
  12. squirrels/_api_routes/project.py +289 -0
  13. squirrels/_api_server.py +552 -134
  14. squirrels/_arguments/__init__.py +0 -0
  15. squirrels/_arguments/init_time_args.py +83 -0
  16. squirrels/_arguments/run_time_args.py +111 -0
  17. squirrels/_auth.py +777 -0
  18. squirrels/_command_line.py +239 -107
  19. squirrels/_compile_prompts.py +147 -0
  20. squirrels/_connection_set.py +94 -0
  21. squirrels/_constants.py +141 -64
  22. squirrels/_dashboards.py +179 -0
  23. squirrels/_data_sources.py +570 -0
  24. squirrels/_dataset_types.py +91 -0
  25. squirrels/_env_vars.py +209 -0
  26. squirrels/_exceptions.py +29 -0
  27. squirrels/_http_error_responses.py +52 -0
  28. squirrels/_initializer.py +319 -110
  29. squirrels/_logging.py +121 -0
  30. squirrels/_manifest.py +357 -187
  31. squirrels/_mcp_server.py +578 -0
  32. squirrels/_model_builder.py +69 -0
  33. squirrels/_model_configs.py +74 -0
  34. squirrels/_model_queries.py +52 -0
  35. squirrels/_models.py +1201 -0
  36. squirrels/_package_data/base_project/.env +7 -0
  37. squirrels/_package_data/base_project/.env.example +44 -0
  38. squirrels/_package_data/base_project/connections.yml +16 -0
  39. squirrels/_package_data/base_project/dashboards/dashboard_example.py +40 -0
  40. squirrels/_package_data/base_project/dashboards/dashboard_example.yml +22 -0
  41. squirrels/_package_data/base_project/docker/.dockerignore +16 -0
  42. squirrels/_package_data/base_project/docker/Dockerfile +16 -0
  43. squirrels/_package_data/base_project/docker/compose.yml +7 -0
  44. squirrels/_package_data/base_project/duckdb_init.sql +10 -0
  45. squirrels/_package_data/base_project/gitignore +13 -0
  46. squirrels/_package_data/base_project/macros/macros_example.sql +17 -0
  47. squirrels/_package_data/base_project/models/builds/build_example.py +26 -0
  48. squirrels/_package_data/base_project/models/builds/build_example.sql +16 -0
  49. squirrels/_package_data/base_project/models/builds/build_example.yml +57 -0
  50. squirrels/_package_data/base_project/models/dbviews/dbview_example.sql +17 -0
  51. squirrels/_package_data/base_project/models/dbviews/dbview_example.yml +32 -0
  52. squirrels/_package_data/base_project/models/federates/federate_example.py +51 -0
  53. squirrels/_package_data/base_project/models/federates/federate_example.sql +21 -0
  54. squirrels/_package_data/base_project/models/federates/federate_example.yml +65 -0
  55. squirrels/_package_data/base_project/models/sources.yml +38 -0
  56. squirrels/_package_data/base_project/parameters.yml +142 -0
  57. squirrels/_package_data/base_project/pyconfigs/connections.py +19 -0
  58. squirrels/_package_data/base_project/pyconfigs/context.py +96 -0
  59. squirrels/_package_data/base_project/pyconfigs/parameters.py +141 -0
  60. squirrels/_package_data/base_project/pyconfigs/user.py +56 -0
  61. squirrels/_package_data/base_project/resources/expenses.db +0 -0
  62. squirrels/_package_data/base_project/resources/public/.gitkeep +0 -0
  63. squirrels/_package_data/base_project/resources/weather.db +0 -0
  64. squirrels/_package_data/base_project/seeds/seed_categories.csv +6 -0
  65. squirrels/_package_data/base_project/seeds/seed_categories.yml +15 -0
  66. squirrels/_package_data/base_project/seeds/seed_subcategories.csv +15 -0
  67. squirrels/_package_data/base_project/seeds/seed_subcategories.yml +21 -0
  68. squirrels/_package_data/base_project/squirrels.yml.j2 +61 -0
  69. squirrels/_package_data/base_project/tmp/.gitignore +2 -0
  70. squirrels/_package_data/templates/login_successful.html +53 -0
  71. squirrels/_package_data/templates/squirrels_studio.html +22 -0
  72. squirrels/_package_loader.py +29 -0
  73. squirrels/_parameter_configs.py +592 -0
  74. squirrels/_parameter_options.py +348 -0
  75. squirrels/_parameter_sets.py +207 -0
  76. squirrels/_parameters.py +1703 -0
  77. squirrels/_project.py +796 -0
  78. squirrels/_py_module.py +122 -0
  79. squirrels/_request_context.py +33 -0
  80. squirrels/_schemas/__init__.py +0 -0
  81. squirrels/_schemas/auth_models.py +83 -0
  82. squirrels/_schemas/query_param_models.py +70 -0
  83. squirrels/_schemas/request_models.py +26 -0
  84. squirrels/_schemas/response_models.py +286 -0
  85. squirrels/_seeds.py +97 -0
  86. squirrels/_sources.py +112 -0
  87. squirrels/_utils.py +540 -149
  88. squirrels/_version.py +1 -3
  89. squirrels/arguments.py +7 -0
  90. squirrels/auth.py +4 -0
  91. squirrels/connections.py +3 -0
  92. squirrels/dashboards.py +3 -0
  93. squirrels/data_sources.py +14 -282
  94. squirrels/parameter_options.py +13 -189
  95. squirrels/parameters.py +14 -801
  96. squirrels/types.py +18 -0
  97. squirrels-0.6.0.post0.dist-info/METADATA +148 -0
  98. squirrels-0.6.0.post0.dist-info/RECORD +101 -0
  99. {squirrels-0.1.0.dist-info → squirrels-0.6.0.post0.dist-info}/WHEEL +1 -2
  100. {squirrels-0.1.0.dist-info → squirrels-0.6.0.post0.dist-info}/entry_points.txt +1 -0
  101. squirrels-0.6.0.post0.dist-info/licenses/LICENSE +201 -0
  102. squirrels/_credentials_manager.py +0 -87
  103. squirrels/_module_loader.py +0 -37
  104. squirrels/_parameter_set.py +0 -151
  105. squirrels/_renderer.py +0 -286
  106. squirrels/_timed_imports.py +0 -37
  107. squirrels/connection_set.py +0 -126
  108. squirrels/package_data/base_project/.gitignore +0 -4
  109. squirrels/package_data/base_project/connections.py +0 -21
  110. squirrels/package_data/base_project/database/sample_database.db +0 -0
  111. squirrels/package_data/base_project/database/seattle_weather.db +0 -0
  112. squirrels/package_data/base_project/datasets/sample_dataset/context.py +0 -8
  113. squirrels/package_data/base_project/datasets/sample_dataset/database_view1.py +0 -23
  114. squirrels/package_data/base_project/datasets/sample_dataset/database_view1.sql.j2 +0 -7
  115. squirrels/package_data/base_project/datasets/sample_dataset/final_view.py +0 -10
  116. squirrels/package_data/base_project/datasets/sample_dataset/final_view.sql.j2 +0 -2
  117. squirrels/package_data/base_project/datasets/sample_dataset/parameters.py +0 -30
  118. squirrels/package_data/base_project/datasets/sample_dataset/selections.cfg +0 -6
  119. squirrels/package_data/base_project/squirrels.yaml +0 -26
  120. squirrels/package_data/static/favicon.ico +0 -0
  121. squirrels/package_data/static/script.js +0 -234
  122. squirrels/package_data/static/style.css +0 -110
  123. squirrels/package_data/templates/index.html +0 -32
  124. squirrels-0.1.0.dist-info/LICENSE +0 -22
  125. squirrels-0.1.0.dist-info/METADATA +0 -67
  126. squirrels-0.1.0.dist-info/RECORD +0 -40
  127. squirrels-0.1.0.dist-info/top_level.txt +0 -1
@@ -0,0 +1,74 @@
1
+ from enum import Enum
2
+ from pydantic import BaseModel, Field
3
+
4
+ from ._env_vars import SquirrelsEnvVars
5
+
6
+
7
+ class ColumnCategory(Enum):
8
+ DIMENSION = "dimension"
9
+ MEASURE = "measure"
10
+ MISC = "misc"
11
+
12
+
13
+ class ColumnConfig(BaseModel):
14
+ name: str = Field(description="The name of the column")
15
+ type: str = Field(default="", description="The type of the column such as 'string', 'integer', 'float', 'boolean', 'datetime', etc.")
16
+ condition: list[str] = Field(default_factory=list, description="The condition(s) of when the column is included. Only for documentation purposes.")
17
+ description: str = Field(default="", description="The description of the column")
18
+ category: ColumnCategory = Field(default=ColumnCategory.MISC, description="The category of the column, either 'dimension', 'measure', or 'misc'")
19
+ depends_on: set[str] = Field(default_factory=set, description="List of dependent columns")
20
+ pass_through: bool = Field(default=False, description="Whether the column should be passed through to the federate")
21
+
22
+
23
+ class ModelConfig(BaseModel):
24
+ description: str = Field(default="", description="The description of the model")
25
+ columns: list[ColumnConfig] = Field(default_factory=list, description="The columns of the model")
26
+
27
+
28
+ class SeedConfig(ModelConfig):
29
+ cast_column_types: bool = Field(default=False, description="Whether the column types should be cast to the appropriate type")
30
+
31
+
32
+ class ConnectionInterface(BaseModel):
33
+ connection: str | None = Field(default=None, description="The connection name of the source model / database view")
34
+
35
+ def finalize_connection(self, *, default_conn_name: str = "default"):
36
+ if self.connection is None:
37
+ self.connection = default_conn_name
38
+ return self
39
+
40
+ def get_connection(self) -> str:
41
+ assert self.connection is not None, "Connection must be set"
42
+ return self.connection
43
+
44
+
45
+ class QueryModelConfig(ModelConfig):
46
+ depends_on: set[str] = Field(default_factory=set, description="The dependencies of the model")
47
+
48
+
49
+ class BuildModelConfig(QueryModelConfig):
50
+ materialization: str = Field(default="VIEW", description="The materialization of the model (ignored if Python model which is always a table)")
51
+
52
+ def get_sql_for_build(self, model_name: str, select_query: str) -> str:
53
+ if self.materialization.upper() == "TABLE":
54
+ materialization = "TABLE"
55
+ elif self.materialization.upper() == "VIEW":
56
+ materialization = "VIEW"
57
+ else:
58
+ raise ValueError(f"Invalid materialization: {self.materialization}")
59
+
60
+ create_prefix = f"CREATE OR REPLACE {materialization} {model_name} AS\n\n"
61
+ return create_prefix + select_query
62
+
63
+
64
+ class DbviewModelConfig(ConnectionInterface, QueryModelConfig):
65
+ translate_to_duckdb: bool = Field(default=False, description="Whether to translate the query to DuckDB and use DuckDB tables at runtime")
66
+
67
+
68
+ class FederateModelConfig(QueryModelConfig):
69
+ eager: bool = Field(default=False, description="Whether the model should always be materialized in memory for SQL models")
70
+
71
+ def get_sql_for_create(self, model_name: str, select_query: str) -> str:
72
+ materialization = "TABLE" if self.eager else "VIEW"
73
+ create_prefix = f"CREATE {materialization} {model_name} AS\n\n"
74
+ return create_prefix + select_query
@@ -0,0 +1,52 @@
1
+ from abc import ABCMeta
2
+ from dataclasses import dataclass, field
3
+ from typing import Callable, Generic, TypeVar, Any
4
+ import polars as pl, pandas as pd
5
+
6
+ from ._arguments.run_time_args import BuildModelArgs
7
+ from ._model_configs import ModelConfig
8
+
9
+
10
+ # Input query file classes
11
+
12
+ @dataclass(frozen=True)
13
+ class QueryFile(metaclass=ABCMeta):
14
+ filepath: str
15
+ raw_query: Any
16
+
17
+ @dataclass(frozen=True)
18
+ class SqlQueryFile(QueryFile):
19
+ raw_query: str
20
+
21
+ @dataclass(frozen=True)
22
+ class PyQueryFile(QueryFile):
23
+ raw_query: Callable[[BuildModelArgs], pl.LazyFrame | pd.DataFrame]
24
+
25
+
26
+ Q = TypeVar('Q', bound=QueryFile)
27
+ M = TypeVar('M', bound=ModelConfig)
28
+
29
+ @dataclass(frozen=True)
30
+ class QueryFileWithConfig(Generic[Q, M]):
31
+ query_file: Q
32
+ config: M
33
+
34
+
35
+ # Compiled query classes
36
+
37
+ @dataclass
38
+ class Query(metaclass=ABCMeta):
39
+ query: Any
40
+
41
+ @dataclass
42
+ class WorkInProgress(Query):
43
+ query: None = field(default=None, init=False)
44
+
45
+ @dataclass
46
+ class SqlModelQuery(Query):
47
+ query: str
48
+ is_duckdb: bool
49
+
50
+ @dataclass
51
+ class PyModelQuery(Query):
52
+ query: Callable[[], pl.LazyFrame | pd.DataFrame]