squirrels 0.4.1__tar.gz → 0.5.0__tar.gz
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-0.5.0/.gitignore +82 -0
- {squirrels-0.4.1 → squirrels-0.5.0}/LICENSE +1 -1
- squirrels-0.5.0/PKG-INFO +113 -0
- squirrels-0.5.0/README.md +73 -0
- squirrels-0.5.0/dateutils/__init__.py +6 -0
- squirrels-0.5.0/dateutils/_enums.py +25 -0
- squirrels-0.4.1/squirrels/dateutils.py → squirrels-0.5.0/dateutils/_implementation.py +58 -111
- squirrels-0.5.0/dateutils/types.py +6 -0
- squirrels-0.5.0/pyproject.toml +77 -0
- squirrels-0.5.0/squirrels/__init__.py +21 -0
- squirrels-0.5.0/squirrels/_api_routes/__init__.py +5 -0
- squirrels-0.5.0/squirrels/_api_routes/auth.py +271 -0
- squirrels-0.5.0/squirrels/_api_routes/base.py +165 -0
- squirrels-0.5.0/squirrels/_api_routes/dashboards.py +150 -0
- squirrels-0.5.0/squirrels/_api_routes/data_management.py +145 -0
- squirrels-0.5.0/squirrels/_api_routes/datasets.py +257 -0
- squirrels-0.5.0/squirrels/_api_routes/oauth2.py +298 -0
- squirrels-0.5.0/squirrels/_api_routes/project.py +252 -0
- squirrels-0.5.0/squirrels/_api_server.py +358 -0
- squirrels-0.5.0/squirrels/_arguments/__init__.py +0 -0
- squirrels-0.5.0/squirrels/_arguments/init_time_args.py +108 -0
- squirrels-0.5.0/squirrels/_arguments/run_time_args.py +147 -0
- squirrels-0.5.0/squirrels/_auth.py +960 -0
- squirrels-0.5.0/squirrels/_command_line.py +203 -0
- squirrels-0.5.0/squirrels/_compile_prompts.py +147 -0
- squirrels-0.5.0/squirrels/_connection_set.py +102 -0
- squirrels-0.5.0/squirrels/_constants.py +136 -0
- squirrels-0.5.0/squirrels/_dashboards.py +160 -0
- squirrels-0.4.1/squirrels/data_sources.py → squirrels-0.5.0/squirrels/_data_sources.py +163 -224
- squirrels-0.5.0/squirrels/_dataset_types.py +84 -0
- squirrels-0.5.0/squirrels/_exceptions.py +29 -0
- squirrels-0.5.0/squirrels/_initializer.py +318 -0
- squirrels-0.5.0/squirrels/_logging.py +115 -0
- squirrels-0.5.0/squirrels/_manifest.py +346 -0
- squirrels-0.5.0/squirrels/_model_builder.py +69 -0
- squirrels-0.5.0/squirrels/_model_configs.py +74 -0
- squirrels-0.5.0/squirrels/_model_queries.py +52 -0
- squirrels-0.5.0/squirrels/_models.py +1107 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/.env +42 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/.env.example +42 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/assets/expenses.db +0 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/connections.yml +16 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/dashboards/dashboard_example.py +34 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/dashboards/dashboard_example.yml +22 -0
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/docker/.dockerignore +5 -2
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/docker/Dockerfile +3 -3
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/docker/compose.yml +1 -1
- squirrels-0.5.0/squirrels/_package_data/base_project/duckdb_init.sql +10 -0
- squirrels-0.4.1/squirrels/package_data/base_project/.gitignore → squirrels-0.5.0/squirrels/_package_data/base_project/gitignore +3 -2
- squirrels-0.5.0/squirrels/_package_data/base_project/macros/macros_example.sql +17 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/builds/build_example.py +26 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/builds/build_example.sql +16 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/builds/build_example.yml +57 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/dbviews/dbview_example.sql +12 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/dbviews/dbview_example.yml +26 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/federates/federate_example.py +37 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/federates/federate_example.sql +19 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/federates/federate_example.yml +65 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/models/sources.yml +38 -0
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/parameters.yml +56 -40
- squirrels-0.5.0/squirrels/_package_data/base_project/pyconfigs/connections.py +14 -0
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/pyconfigs/context.py +21 -40
- squirrels-0.5.0/squirrels/_package_data/base_project/pyconfigs/parameters.py +141 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/pyconfigs/user.py +44 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/seeds/seed_categories.yml +15 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/seeds/seed_subcategories.csv +15 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/seeds/seed_subcategories.yml +21 -0
- squirrels-0.5.0/squirrels/_package_data/base_project/squirrels.yml.j2 +61 -0
- squirrels-0.5.0/squirrels/_package_data/templates/dataset_results.html +112 -0
- squirrels-0.5.0/squirrels/_package_data/templates/oauth_login.html +271 -0
- squirrels-0.5.0/squirrels/_package_data/templates/squirrels_studio.html +20 -0
- {squirrels-0.4.1 → squirrels-0.5.0}/squirrels/_package_loader.py +8 -4
- {squirrels-0.4.1 → squirrels-0.5.0}/squirrels/_parameter_configs.py +104 -103
- squirrels-0.4.1/squirrels/parameter_options.py → squirrels-0.5.0/squirrels/_parameter_options.py +1 -1
- {squirrels-0.4.1 → squirrels-0.5.0}/squirrels/_parameter_sets.py +57 -47
- squirrels-0.4.1/squirrels/parameters.py → squirrels-0.5.0/squirrels/_parameters.py +571 -173
- squirrels-0.5.0/squirrels/_project.py +721 -0
- {squirrels-0.4.1 → squirrels-0.5.0}/squirrels/_py_module.py +7 -5
- squirrels-0.5.0/squirrels/_schemas/__init__.py +0 -0
- squirrels-0.5.0/squirrels/_schemas/auth_models.py +167 -0
- squirrels-0.5.0/squirrels/_schemas/query_param_models.py +75 -0
- squirrels-0.4.1/squirrels/_api_response_models.py → squirrels-0.5.0/squirrels/_schemas/response_models.py +126 -47
- squirrels-0.5.0/squirrels/_seeds.py +58 -0
- squirrels-0.5.0/squirrels/_sources.py +110 -0
- squirrels-0.5.0/squirrels/_utils.py +431 -0
- {squirrels-0.4.1 → squirrels-0.5.0}/squirrels/_version.py +1 -1
- squirrels-0.5.0/squirrels/arguments.py +7 -0
- squirrels-0.5.0/squirrels/auth.py +4 -0
- squirrels-0.5.0/squirrels/connections.py +3 -0
- squirrels-0.5.0/squirrels/dashboards.py +3 -0
- squirrels-0.5.0/squirrels/data_sources.py +14 -0
- squirrels-0.5.0/squirrels/parameter_options.py +13 -0
- squirrels-0.5.0/squirrels/parameters.py +14 -0
- squirrels-0.5.0/squirrels/types.py +16 -0
- squirrels-0.4.1/PKG-INFO +0 -117
- squirrels-0.4.1/README.md +0 -78
- squirrels-0.4.1/pyproject.toml +0 -54
- squirrels-0.4.1/squirrels/__init__.py +0 -19
- squirrels-0.4.1/squirrels/_api_server.py +0 -552
- squirrels-0.4.1/squirrels/_authenticator.py +0 -85
- squirrels-0.4.1/squirrels/_command_line.py +0 -122
- squirrels-0.4.1/squirrels/_connection_set.py +0 -80
- squirrels-0.4.1/squirrels/_constants.py +0 -106
- squirrels-0.4.1/squirrels/_dashboards_io.py +0 -61
- squirrels-0.4.1/squirrels/_environcfg.py +0 -84
- squirrels-0.4.1/squirrels/_initializer.py +0 -221
- squirrels-0.4.1/squirrels/_manifest.py +0 -217
- squirrels-0.4.1/squirrels/_models.py +0 -548
- squirrels-0.4.1/squirrels/_seeds.py +0 -39
- squirrels-0.4.1/squirrels/_utils.py +0 -256
- squirrels-0.4.1/squirrels/arguments/init_time_args.py +0 -40
- squirrels-0.4.1/squirrels/arguments/run_time_args.py +0 -208
- squirrels-0.4.1/squirrels/dashboards.py +0 -82
- squirrels-0.4.1/squirrels/package_data/assets/favicon.ico +0 -0
- squirrels-0.4.1/squirrels/package_data/assets/index.css +0 -1
- squirrels-0.4.1/squirrels/package_data/assets/index.js +0 -58
- squirrels-0.4.1/squirrels/package_data/base_project/assets/expenses.db +0 -0
- squirrels-0.4.1/squirrels/package_data/base_project/connections.yml +0 -7
- squirrels-0.4.1/squirrels/package_data/base_project/dashboards/dashboard_example.py +0 -32
- squirrels-0.4.1/squirrels/package_data/base_project/dashboards.yml +0 -10
- squirrels-0.4.1/squirrels/package_data/base_project/env.yml +0 -29
- squirrels-0.4.1/squirrels/package_data/base_project/models/dbviews/dbview_example.py +0 -47
- squirrels-0.4.1/squirrels/package_data/base_project/models/dbviews/dbview_example.sql +0 -22
- squirrels-0.4.1/squirrels/package_data/base_project/models/federates/federate_example.py +0 -21
- squirrels-0.4.1/squirrels/package_data/base_project/models/federates/federate_example.sql +0 -3
- squirrels-0.4.1/squirrels/package_data/base_project/pyconfigs/auth.py +0 -45
- squirrels-0.4.1/squirrels/package_data/base_project/pyconfigs/connections.py +0 -19
- squirrels-0.4.1/squirrels/package_data/base_project/pyconfigs/parameters.py +0 -95
- squirrels-0.4.1/squirrels/package_data/base_project/seeds/seed_subcategories.csv +0 -15
- squirrels-0.4.1/squirrels/package_data/base_project/squirrels.yml.j2 +0 -94
- squirrels-0.4.1/squirrels/package_data/templates/index.html +0 -18
- squirrels-0.4.1/squirrels/project.py +0 -378
- squirrels-0.4.1/squirrels/user_base.py +0 -55
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/assets/weather.db +0 -0
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/seeds/seed_categories.csv +0 -0
- {squirrels-0.4.1/squirrels/package_data → squirrels-0.5.0/squirrels/_package_data}/base_project/tmp/.gitignore +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
sandbox*
|
|
2
|
+
playground*
|
|
3
|
+
site/
|
|
4
|
+
.venv/
|
|
5
|
+
TODOS.md
|
|
6
|
+
|
|
7
|
+
# pyenv files
|
|
8
|
+
.python-version
|
|
9
|
+
|
|
10
|
+
# Pipenv files
|
|
11
|
+
Pipfile
|
|
12
|
+
Pipfile.lock
|
|
13
|
+
|
|
14
|
+
### PythonVanilla ###
|
|
15
|
+
# Byte-compiled / optimized / DLL files
|
|
16
|
+
__pycache__/
|
|
17
|
+
*.py[cod]
|
|
18
|
+
*$py.class
|
|
19
|
+
|
|
20
|
+
# C extensions
|
|
21
|
+
*.so
|
|
22
|
+
|
|
23
|
+
# Distribution / packaging
|
|
24
|
+
.Python
|
|
25
|
+
build/
|
|
26
|
+
develop-eggs/
|
|
27
|
+
dist/
|
|
28
|
+
downloads/
|
|
29
|
+
eggs/
|
|
30
|
+
.eggs/
|
|
31
|
+
lib/
|
|
32
|
+
lib64/
|
|
33
|
+
parts/
|
|
34
|
+
sdist/
|
|
35
|
+
var/
|
|
36
|
+
wheels/
|
|
37
|
+
share/python-wheels/
|
|
38
|
+
*.egg-info/
|
|
39
|
+
.installed.cfg
|
|
40
|
+
*.egg
|
|
41
|
+
MANIFEST
|
|
42
|
+
|
|
43
|
+
# Installer logs
|
|
44
|
+
pip-log.txt
|
|
45
|
+
pip-delete-this-directory.txt
|
|
46
|
+
|
|
47
|
+
# Unit test / coverage reports
|
|
48
|
+
htmlcov/
|
|
49
|
+
.tox/
|
|
50
|
+
.nox/
|
|
51
|
+
.coverage
|
|
52
|
+
.coverage.*
|
|
53
|
+
.cache
|
|
54
|
+
nosetests.xml
|
|
55
|
+
coverage.xml
|
|
56
|
+
*.cover
|
|
57
|
+
*.py,cover
|
|
58
|
+
.hypothesis/
|
|
59
|
+
.pytest_cache/
|
|
60
|
+
cover/
|
|
61
|
+
|
|
62
|
+
# Translations
|
|
63
|
+
*.mo
|
|
64
|
+
*.pot
|
|
65
|
+
|
|
66
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
67
|
+
__pypackages__/
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
### VisualStudioCode ###
|
|
71
|
+
.vscode
|
|
72
|
+
|
|
73
|
+
# Local History for Visual Studio Code
|
|
74
|
+
.history/
|
|
75
|
+
|
|
76
|
+
# Built Visual Studio Code Extensions
|
|
77
|
+
*.vsix
|
|
78
|
+
|
|
79
|
+
### VisualStudioCode Patch ###
|
|
80
|
+
# Ignore all local history of files
|
|
81
|
+
.history
|
|
82
|
+
.ionide
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright
|
|
189
|
+
Copyright 2025 Tim Huang
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
squirrels-0.5.0/PKG-INFO
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: squirrels
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: Squirrels - API Framework for Data Analytics
|
|
5
|
+
Project-URL: Homepage, https://squirrels-analytics.github.io
|
|
6
|
+
Project-URL: Repository, https://github.com/squirrels-analytics/squirrels
|
|
7
|
+
Project-URL: Documentation, https://squirrels-analytics.github.io
|
|
8
|
+
Author-email: Tim Huang <tim.yuting@hotmail.com>
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Classifier: Typing :: Typed
|
|
15
|
+
Requires-Python: ~=3.10
|
|
16
|
+
Requires-Dist: authlib<2,>=1.5.2
|
|
17
|
+
Requires-Dist: bcrypt<5,>=4.0.1
|
|
18
|
+
Requires-Dist: cachetools>=5.3.2
|
|
19
|
+
Requires-Dist: duckdb<2,>=1.4.0
|
|
20
|
+
Requires-Dist: fastapi<1,>=0.112.1
|
|
21
|
+
Requires-Dist: gitpython<4,>=3.1.41
|
|
22
|
+
Requires-Dist: inquirer<4,>=3.2.1
|
|
23
|
+
Requires-Dist: itsdangerous<3,>=2.2.0
|
|
24
|
+
Requires-Dist: jinja2<4,>=3.1.3
|
|
25
|
+
Requires-Dist: libpass<2,>=1.9.0
|
|
26
|
+
Requires-Dist: matplotlib<4,>=3.8.3
|
|
27
|
+
Requires-Dist: mcp>=1.13.1
|
|
28
|
+
Requires-Dist: pandas<3,>=2.1.4
|
|
29
|
+
Requires-Dist: polars<2,>=1.14.0
|
|
30
|
+
Requires-Dist: pyarrow>=19.0.1
|
|
31
|
+
Requires-Dist: pydantic<3,>=2.8.2
|
|
32
|
+
Requires-Dist: pyjwt<3,>=2.8.0
|
|
33
|
+
Requires-Dist: python-dotenv<2,>=1.0.1
|
|
34
|
+
Requires-Dist: python-multipart<1,>=0.0.9
|
|
35
|
+
Requires-Dist: pyyaml<7,>=6.0.1
|
|
36
|
+
Requires-Dist: sqlalchemy<3,>=2.0.25
|
|
37
|
+
Requires-Dist: sqlglot>=26.12.1
|
|
38
|
+
Requires-Dist: uvicorn<1,>=0.30.6
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# Squirrels
|
|
42
|
+
|
|
43
|
+
Squirrels is an API framework that lets you create REST APIs for dynamic data analytics!
|
|
44
|
+
|
|
45
|
+
**Documentation**: <a href="https://squirrels-analytics.github.io/" target="_blank">https://squirrels-analytics.github.io/</a>
|
|
46
|
+
|
|
47
|
+
**Source Code**: <a href="https://github.com/squirrels-analytics/squirrels" target="_blank">https://github.com/squirrels-analytics/squirrels</a>
|
|
48
|
+
|
|
49
|
+
## Table of Contents
|
|
50
|
+
|
|
51
|
+
- [Main Features](#main-features)
|
|
52
|
+
- [License](#license)
|
|
53
|
+
- [Contributing to Squirrels](#contributing-to-squirrels)
|
|
54
|
+
- [Setup](#setup)
|
|
55
|
+
- [Testing](#testing)
|
|
56
|
+
- [Project Structure](#project-structure)
|
|
57
|
+
|
|
58
|
+
## Main Features
|
|
59
|
+
|
|
60
|
+
Here are a few of the things that Squirrels can do:
|
|
61
|
+
|
|
62
|
+
- Connect to any database by specifying its SQLAlchemy url (in `squirrels.yml`) or by using its native connector library in python (in `connections.py`).
|
|
63
|
+
- Configure API routes for datasets (in `squirrels.yml`) without writing code.
|
|
64
|
+
- Configure parameter widgets (types include single-select, multi-select, date, number, etc.) for your datasets (in `parameters.py`).
|
|
65
|
+
- Use SQL templates (templated with Jinja, like dbt) or python functions (that return a Python dataframe in polars or pandas) to define dynamic query logic based on parameter selections.
|
|
66
|
+
- Query multiple databases and join the results together in a final view in one API endpoint/dataset!
|
|
67
|
+
- Test your API endpoints with Squirrels Studio or by a command line that generates rendered sql queries and results as files (for a given set of parameter selections).
|
|
68
|
+
- Define User model (in `user.py`) and authorize privacy scope per dataset (in `squirrels.yml`). The user's attributes can even be used in your query logic!
|
|
69
|
+
- Serve dataset metadata and results to AI agents via MCP (Model Context Protocol)
|
|
70
|
+
|
|
71
|
+
## License
|
|
72
|
+
|
|
73
|
+
Squirrels is released under the Apache 2.0 license.
|
|
74
|
+
|
|
75
|
+
See the file LICENSE for more details.
|
|
76
|
+
|
|
77
|
+
## Contributing to Squirrels
|
|
78
|
+
|
|
79
|
+
The sections below describe how to set up your local environment for Squirrels development and run unit tests. A high level overview of the project structure is also provided.
|
|
80
|
+
|
|
81
|
+
### Setup
|
|
82
|
+
|
|
83
|
+
This project requires python version 3.10 or above to be installed. It also uses the python package manager `uv`. Information on setting up poetry can be found at: https://docs.astral.sh/uv/getting-started/installation/.
|
|
84
|
+
|
|
85
|
+
Then, to install all dependencies in a virtual environment, run:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
uv sync
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
And activate the virtual environment with:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
source .venv/bin/activate
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
To confirm that the setup worked, run the following to show the help page for all Squirrels CLI commands:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
sqrl -h
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Testing
|
|
104
|
+
|
|
105
|
+
Run `uv run pytest`. Or if you have the virtual environment activated, simply run `pytest`.
|
|
106
|
+
|
|
107
|
+
### Project Structure
|
|
108
|
+
|
|
109
|
+
From the root of the git repo, the source code can be found in the `squirrels` folder and unit tests can be found in the `tests` folder.
|
|
110
|
+
|
|
111
|
+
To understand what a specific Squirrels command is doing, start from the `_command_line.py` file as your entry point.
|
|
112
|
+
|
|
113
|
+
The library version is maintained in both the `pyproject.toml` and the `squirrels/_version.py` files.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Squirrels
|
|
2
|
+
|
|
3
|
+
Squirrels is an API framework that lets you create REST APIs for dynamic data analytics!
|
|
4
|
+
|
|
5
|
+
**Documentation**: <a href="https://squirrels-analytics.github.io/" target="_blank">https://squirrels-analytics.github.io/</a>
|
|
6
|
+
|
|
7
|
+
**Source Code**: <a href="https://github.com/squirrels-analytics/squirrels" target="_blank">https://github.com/squirrels-analytics/squirrels</a>
|
|
8
|
+
|
|
9
|
+
## Table of Contents
|
|
10
|
+
|
|
11
|
+
- [Main Features](#main-features)
|
|
12
|
+
- [License](#license)
|
|
13
|
+
- [Contributing to Squirrels](#contributing-to-squirrels)
|
|
14
|
+
- [Setup](#setup)
|
|
15
|
+
- [Testing](#testing)
|
|
16
|
+
- [Project Structure](#project-structure)
|
|
17
|
+
|
|
18
|
+
## Main Features
|
|
19
|
+
|
|
20
|
+
Here are a few of the things that Squirrels can do:
|
|
21
|
+
|
|
22
|
+
- Connect to any database by specifying its SQLAlchemy url (in `squirrels.yml`) or by using its native connector library in python (in `connections.py`).
|
|
23
|
+
- Configure API routes for datasets (in `squirrels.yml`) without writing code.
|
|
24
|
+
- Configure parameter widgets (types include single-select, multi-select, date, number, etc.) for your datasets (in `parameters.py`).
|
|
25
|
+
- Use SQL templates (templated with Jinja, like dbt) or python functions (that return a Python dataframe in polars or pandas) to define dynamic query logic based on parameter selections.
|
|
26
|
+
- Query multiple databases and join the results together in a final view in one API endpoint/dataset!
|
|
27
|
+
- Test your API endpoints with Squirrels Studio or by a command line that generates rendered sql queries and results as files (for a given set of parameter selections).
|
|
28
|
+
- Define User model (in `user.py`) and authorize privacy scope per dataset (in `squirrels.yml`). The user's attributes can even be used in your query logic!
|
|
29
|
+
- Serve dataset metadata and results to AI agents via MCP (Model Context Protocol)
|
|
30
|
+
|
|
31
|
+
## License
|
|
32
|
+
|
|
33
|
+
Squirrels is released under the Apache 2.0 license.
|
|
34
|
+
|
|
35
|
+
See the file LICENSE for more details.
|
|
36
|
+
|
|
37
|
+
## Contributing to Squirrels
|
|
38
|
+
|
|
39
|
+
The sections below describe how to set up your local environment for Squirrels development and run unit tests. A high level overview of the project structure is also provided.
|
|
40
|
+
|
|
41
|
+
### Setup
|
|
42
|
+
|
|
43
|
+
This project requires python version 3.10 or above to be installed. It also uses the python package manager `uv`. Information on setting up poetry can be found at: https://docs.astral.sh/uv/getting-started/installation/.
|
|
44
|
+
|
|
45
|
+
Then, to install all dependencies in a virtual environment, run:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
uv sync
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
And activate the virtual environment with:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
source .venv/bin/activate
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
To confirm that the setup worked, run the following to show the help page for all Squirrels CLI commands:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
sqrl -h
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Testing
|
|
64
|
+
|
|
65
|
+
Run `uv run pytest`. Or if you have the virtual environment activated, simply run `pytest`.
|
|
66
|
+
|
|
67
|
+
### Project Structure
|
|
68
|
+
|
|
69
|
+
From the root of the git repo, the source code can be found in the `squirrels` folder and unit tests can be found in the `tests` folder.
|
|
70
|
+
|
|
71
|
+
To understand what a specific Squirrels command is doing, start from the `_command_line.py` file as your entry point.
|
|
72
|
+
|
|
73
|
+
The library version is maintained in both the `pyproject.toml` and the `squirrels/_version.py` files.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from ._enums import DayOfWeekEnum, MonthEnum
|
|
2
|
+
from ._implementation import (
|
|
3
|
+
DayIdxOfMonthsCycle, DayIdxOfYear, DayIdxOfQuarter, DayIdxOfMonth, DayIdxOfWeek,
|
|
4
|
+
OffsetYears, OffsetMonths, OffsetWeeks, OffsetDays,
|
|
5
|
+
DateModPipeline, DateStringModifier, TimestampModifier
|
|
6
|
+
)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DayOfWeekEnum(Enum):
|
|
5
|
+
Sunday = 0
|
|
6
|
+
Monday = 1
|
|
7
|
+
Tuesday = 2
|
|
8
|
+
Wednesday = 3
|
|
9
|
+
Thursday = 4
|
|
10
|
+
Friday = 5
|
|
11
|
+
Saturday = 6
|
|
12
|
+
|
|
13
|
+
class MonthEnum(Enum):
|
|
14
|
+
January = 1
|
|
15
|
+
February = 2
|
|
16
|
+
March = 3
|
|
17
|
+
April = 4
|
|
18
|
+
May = 5
|
|
19
|
+
June = 6
|
|
20
|
+
July = 7
|
|
21
|
+
August = 8
|
|
22
|
+
September = 9
|
|
23
|
+
October = 10
|
|
24
|
+
November = 11
|
|
25
|
+
December = 12
|