squirrels 0.5.0b1__py3-none-any.whl → 0.5.0b2__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.
- squirrels/dateutils.py → dateutils/__init__.py +3 -5
- squirrels/_command_line.py +13 -9
- squirrels/_initializer.py +52 -33
- squirrels/_model_builder.py +2 -0
- squirrels/_model_configs.py +1 -1
- squirrels/_models.py +4 -2
- squirrels/_utils.py +1 -1
- squirrels/package_data/base_project/models/builds/build_example.yml +2 -0
- {squirrels-0.5.0b1.dist-info → squirrels-0.5.0b2.dist-info}/METADATA +11 -17
- {squirrels-0.5.0b1.dist-info → squirrels-0.5.0b2.dist-info}/RECORD +13 -13
- {squirrels-0.5.0b1.dist-info → squirrels-0.5.0b2.dist-info}/WHEEL +0 -0
- {squirrels-0.5.0b1.dist-info → squirrels-0.5.0b2.dist-info}/entry_points.txt +0 -0
- {squirrels-0.5.0b1.dist-info → squirrels-0.5.0b2.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,8 +5,6 @@ from dateutil.relativedelta import relativedelta
|
|
|
5
5
|
from abc import ABCMeta, abstractmethod
|
|
6
6
|
from enum import Enum
|
|
7
7
|
|
|
8
|
-
from . import _utils as u
|
|
9
|
-
|
|
10
8
|
|
|
11
9
|
class DayOfWeek(Enum):
|
|
12
10
|
Sunday = 0
|
|
@@ -62,7 +60,7 @@ class _DayIdxOfCalendarUnit(DateModifier):
|
|
|
62
60
|
super().__init__()
|
|
63
61
|
self.idx = idx
|
|
64
62
|
if self.idx == 0:
|
|
65
|
-
raise
|
|
63
|
+
raise ValueError(f"For constructors of class names that start with DayIdxOf_, idx cannot be zero")
|
|
66
64
|
self.incr = self.idx - 1 if self.idx > 0 else self.idx
|
|
67
65
|
|
|
68
66
|
|
|
@@ -84,7 +82,7 @@ class DayIdxOfMonthsCycle(_DayIdxOfCalendarUnit):
|
|
|
84
82
|
self._num_months_in_cycle = num_months_in_cycle
|
|
85
83
|
self._first_month_of_cycle = first_month_of_cycle
|
|
86
84
|
if 12 % self._num_months_in_cycle != 0:
|
|
87
|
-
raise
|
|
85
|
+
raise ValueError(f"Value X must fit evenly in 12")
|
|
88
86
|
self.first_month_of_first_cycle = (self._first_month_of_cycle.value - 1) % self._num_months_in_cycle + 1
|
|
89
87
|
|
|
90
88
|
def modify(self, date: Date) -> Date:
|
|
@@ -302,7 +300,7 @@ class DateModPipeline(DateModifier):
|
|
|
302
300
|
"""
|
|
303
301
|
assert isinstance(step, _OffsetUnits)
|
|
304
302
|
if step.offset == 0:
|
|
305
|
-
raise
|
|
303
|
+
raise ValueError(f"The length of 'step' must not be zero")
|
|
306
304
|
|
|
307
305
|
output: Sequence[Date] = []
|
|
308
306
|
end_date = self.modify(start_date)
|
squirrels/_command_line.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from argparse import ArgumentParser, _SubParsersAction
|
|
2
|
-
import sys, asyncio, traceback, io,
|
|
2
|
+
import sys, asyncio, traceback, io, subprocess
|
|
3
3
|
|
|
4
4
|
sys.path.append('.')
|
|
5
5
|
|
|
@@ -11,10 +11,12 @@ from ._project import SquirrelsProject
|
|
|
11
11
|
from . import _constants as c, _utils as u
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def _run_duckdb_cli(project: SquirrelsProject):
|
|
14
|
+
def _run_duckdb_cli(project: SquirrelsProject, ui: bool):
|
|
15
15
|
_, target_init_path = u._read_duckdb_init_sql()
|
|
16
16
|
init_args = f"-init {target_init_path}" if target_init_path else ""
|
|
17
17
|
command = ['duckdb']
|
|
18
|
+
if ui:
|
|
19
|
+
command.append('-ui')
|
|
18
20
|
if init_args:
|
|
19
21
|
command.extend(init_args.split())
|
|
20
22
|
command.extend(['-readonly', project._duckdb_venv_path])
|
|
@@ -48,21 +50,22 @@ def main():
|
|
|
48
50
|
|
|
49
51
|
init_parser = add_subparser(subparsers, c.INIT_CMD, 'Create a new squirrels project')
|
|
50
52
|
|
|
51
|
-
init_parser.add_argument('name', nargs='?', type=str, help='The name of the project')
|
|
52
|
-
init_parser.add_argument('-
|
|
53
|
-
init_parser.add_argument('--
|
|
53
|
+
init_parser.add_argument('name', nargs='?', type=str, help='The name of the project folder to create. Ignored if --curr-dir is used')
|
|
54
|
+
init_parser.add_argument('--curr-dir', action='store_true', help='Create the project in the current directory')
|
|
55
|
+
init_parser.add_argument('--use-defaults', action='store_true', help='Use default values for unspecified options (except project folder name) instead of prompting for input')
|
|
54
56
|
init_parser.add_argument('--connections', type=str, choices=c.CONF_FORMAT_CHOICES, help=f'Configure database connections as yaml (default) or python')
|
|
55
57
|
init_parser.add_argument('--parameters', type=str, choices=c.CONF_FORMAT_CHOICES, help=f'Configure parameters as python (default) or yaml')
|
|
56
58
|
init_parser.add_argument('--build', type=str, choices=c.FILE_TYPE_CHOICES, help='Create build model as sql (default) or python file')
|
|
57
59
|
init_parser.add_argument('--federate', type=str, choices=c.FILE_TYPE_CHOICES, help='Create federated model as sql (default) or python file')
|
|
58
|
-
init_parser.add_argument('--dashboard',
|
|
60
|
+
init_parser.add_argument('--dashboard', type=str, choices=['y', 'n'], help=f'Include (y) or exclude (n, default) a sample dashboard file')
|
|
61
|
+
init_parser.add_argument('--admin-password', type=str, help='The password for the admin user. If --use-defaults is used, then a random password is generated')
|
|
59
62
|
|
|
60
63
|
def with_file_format_options(parser: ArgumentParser):
|
|
61
64
|
help_text = "Create model as sql (default) or python file"
|
|
62
65
|
parser.add_argument('--format', type=str, choices=c.FILE_TYPE_CHOICES, default=c.SQL_FILE_TYPE, help=help_text)
|
|
63
66
|
return parser
|
|
64
67
|
|
|
65
|
-
get_file_help_text = "Get a sample file for the squirrels project. If the file name already exists, it will be
|
|
68
|
+
get_file_help_text = "Get a sample file for the squirrels project. If the file name already exists, it will be suffixed with a timestamp."
|
|
66
69
|
get_file_parser = add_subparser(subparsers, c.GET_FILE_CMD, get_file_help_text)
|
|
67
70
|
get_file_subparsers = get_file_parser.add_subparsers(title='file_name', dest='file_name')
|
|
68
71
|
add_subparser(get_file_subparsers, c.DOTENV_FILE, f'Get sample {c.DOTENV_FILE} and {c.DOTENV_FILE}.example files')
|
|
@@ -104,6 +107,7 @@ def main():
|
|
|
104
107
|
build_parser.add_argument('--stage', type=str, help='If the venv file is in use, stage the duckdb file to replace the venv later')
|
|
105
108
|
|
|
106
109
|
duckdb_parser = add_subparser(subparsers, c.DUCKDB_CMD, 'Run the duckdb command line tool')
|
|
110
|
+
duckdb_parser.add_argument('--ui', action='store_true', help='Run the duckdb local UI')
|
|
107
111
|
|
|
108
112
|
run_parser = add_subparser(subparsers, c.RUN_CMD, 'Run the API server')
|
|
109
113
|
run_parser.add_argument('--build', action='store_true', help='Build the virtual data environment (with duckdb) first before running the API server')
|
|
@@ -116,7 +120,7 @@ def main():
|
|
|
116
120
|
if args.version:
|
|
117
121
|
print(__version__)
|
|
118
122
|
elif args.command == c.INIT_CMD:
|
|
119
|
-
Initializer(project_name=args.name,
|
|
123
|
+
Initializer(project_name=args.name, use_curr_dir=args.curr_dir).init_project(args)
|
|
120
124
|
elif args.command == c.GET_FILE_CMD:
|
|
121
125
|
Initializer().get_file(args)
|
|
122
126
|
elif args.command is None:
|
|
@@ -131,7 +135,7 @@ def main():
|
|
|
131
135
|
asyncio.run(task)
|
|
132
136
|
print()
|
|
133
137
|
elif args.command == c.DUCKDB_CMD:
|
|
134
|
-
_run_duckdb_cli(project)
|
|
138
|
+
_run_duckdb_cli(project, args.ui)
|
|
135
139
|
elif args.command == c.RUN_CMD:
|
|
136
140
|
if args.build:
|
|
137
141
|
task = project.build(full_refresh=True)
|
squirrels/_initializer.py
CHANGED
|
@@ -10,9 +10,9 @@ TMP_FOLDER = "tmp"
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class Initializer:
|
|
13
|
-
def __init__(self, *, project_name: Optional[str] = None,
|
|
14
|
-
self.project_name = project_name
|
|
15
|
-
self.
|
|
13
|
+
def __init__(self, *, project_name: Optional[str] = None, use_curr_dir: bool = False):
|
|
14
|
+
self.project_name = project_name if not use_curr_dir else None
|
|
15
|
+
self.use_curr_dir = use_curr_dir
|
|
16
16
|
|
|
17
17
|
def _path_exists(self, filepath: u.Path) -> bool:
|
|
18
18
|
return os.path.exists(filepath)
|
|
@@ -40,8 +40,6 @@ class Initializer:
|
|
|
40
40
|
if self._files_have_same_content(src_path, filepath2):
|
|
41
41
|
perform_copy = False
|
|
42
42
|
extra_msg = "Skipping... file contents is same as source"
|
|
43
|
-
elif self.overwrite:
|
|
44
|
-
extra_msg = "Overwriting file..."
|
|
45
43
|
else:
|
|
46
44
|
filepath2 = self._add_timestamp_to_filename(old_filepath)
|
|
47
45
|
extra_msg = f'Creating file as "{filepath2}" instead...'
|
|
@@ -116,42 +114,63 @@ class Initializer:
|
|
|
116
114
|
self._copy_file(u.Path(c.DOTENV_FILE + ".example"))
|
|
117
115
|
|
|
118
116
|
def init_project(self, args):
|
|
119
|
-
options = ["
|
|
120
|
-
|
|
117
|
+
options = ["connections", "parameters", "build", "federate", "dashboard", "admin_password"]
|
|
118
|
+
CONNECTIONS, PARAMETERS, BUILD, FEDERATE, DASHBOARD, ADMIN_PASSWORD = options
|
|
121
119
|
|
|
122
120
|
# Add project name prompt if not provided
|
|
123
|
-
if self.project_name is None:
|
|
121
|
+
if self.project_name is None and not args.curr_dir:
|
|
124
122
|
questions = [
|
|
125
|
-
inquirer.Text('project_name', message="What is your project name? (leave blank to create in current directory)")
|
|
123
|
+
inquirer.Text('project_name', message="What is your project folder name? (leave blank to create in current directory)")
|
|
126
124
|
]
|
|
127
125
|
answers = inquirer.prompt(questions)
|
|
128
126
|
assert isinstance(answers, dict)
|
|
129
127
|
self.project_name = answers['project_name']
|
|
130
128
|
|
|
131
129
|
answers = { x: getattr(args, x) for x in options }
|
|
132
|
-
if
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
130
|
+
if DASHBOARD in answers:
|
|
131
|
+
answers[DASHBOARD] = (answers[DASHBOARD] == 'y') # convert 'y' or 'n' to boolean
|
|
132
|
+
|
|
133
|
+
if not args.use_defaults:
|
|
134
|
+
questions = []
|
|
135
|
+
if answers.get(CONNECTIONS) is None:
|
|
136
|
+
questions.append(
|
|
137
|
+
inquirer.List(
|
|
138
|
+
CONNECTIONS, message=f"How would you like to configure the database connections?", choices=c.CONF_FORMAT_CHOICES
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
if answers.get(PARAMETERS) is None:
|
|
142
|
+
questions.append(
|
|
143
|
+
inquirer.List(
|
|
144
|
+
PARAMETERS, message=f"How would you like to configure the parameters?", choices=c.CONF_FORMAT_CHOICES2
|
|
145
|
+
),
|
|
146
|
+
)
|
|
147
|
+
if answers.get(BUILD) is None:
|
|
148
|
+
questions.append(
|
|
149
|
+
inquirer.List(
|
|
150
|
+
BUILD, message="What's the file format for the build model?", choices=c.FILE_TYPE_CHOICES
|
|
151
|
+
),
|
|
152
|
+
)
|
|
153
|
+
if answers.get(FEDERATE) is None:
|
|
154
|
+
questions.append(
|
|
155
|
+
inquirer.List(
|
|
156
|
+
FEDERATE, message="What's the file format for the federated model?", choices=c.FILE_TYPE_CHOICES
|
|
157
|
+
),
|
|
158
|
+
)
|
|
159
|
+
if answers.get(DASHBOARD) is None:
|
|
160
|
+
questions.append(
|
|
161
|
+
inquirer.Confirm(
|
|
162
|
+
DASHBOARD, message=f"Do you want to include a dashboard example?", default=False
|
|
163
|
+
),
|
|
164
|
+
)
|
|
165
|
+
if answers.get(ADMIN_PASSWORD) is None:
|
|
166
|
+
questions.append(
|
|
167
|
+
inquirer.Password(
|
|
168
|
+
"admin_password", message="What's the admin password? (leave blank to generate a random one)"
|
|
169
|
+
),
|
|
170
|
+
)
|
|
171
|
+
more_answers = inquirer.prompt(questions)
|
|
172
|
+
assert isinstance(more_answers, dict)
|
|
173
|
+
answers.update(more_answers)
|
|
155
174
|
|
|
156
175
|
def get_answer(key, default):
|
|
157
176
|
"""
|
|
@@ -177,7 +196,7 @@ class Initializer:
|
|
|
177
196
|
parameters_use_py = (parameters_format == c.PYTHON_FORMAT)
|
|
178
197
|
|
|
179
198
|
build_config_file = c.BUILD_FILE_STEM + ".yml"
|
|
180
|
-
build_format = get_answer(BUILD, c.
|
|
199
|
+
build_format = get_answer(BUILD, c.SQL_FILE_TYPE)
|
|
181
200
|
if build_format == c.SQL_FILE_TYPE:
|
|
182
201
|
build_file = c.BUILD_FILE_STEM + ".sql"
|
|
183
202
|
elif build_format == c.PYTHON_FILE_TYPE:
|
squirrels/_model_builder.py
CHANGED
|
@@ -79,6 +79,8 @@ class ModelBuilder:
|
|
|
79
79
|
duckdb_stg_path.replace(duckdb_dev_path)
|
|
80
80
|
elif duckdb_path.exists():
|
|
81
81
|
shutil.copy(duckdb_path, duckdb_dev_path)
|
|
82
|
+
else:
|
|
83
|
+
duckdb_dev_path.unlink(missing_ok=True) # delete any lingering development copy to create a fresh one later
|
|
82
84
|
|
|
83
85
|
self._logger.log_activity_time("creating development copy of virtual data environment", start)
|
|
84
86
|
|
squirrels/_model_configs.py
CHANGED
|
@@ -47,7 +47,7 @@ class QueryModelConfig(ModelConfig):
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
class BuildModelConfig(QueryModelConfig):
|
|
50
|
-
materialization: str = Field(default="
|
|
50
|
+
materialization: str = Field(default="VIEW", description="The materialization of the model (ignored if Python model which is always a table)")
|
|
51
51
|
|
|
52
52
|
def get_sql_for_build(self, model_name: str, select_query: str) -> str:
|
|
53
53
|
if self.materialization.upper() == "TABLE":
|
squirrels/_models.py
CHANGED
|
@@ -476,15 +476,17 @@ class DbviewModel(QueryModel):
|
|
|
476
476
|
connection_props = self.conn_set.get_connection(connection_name)
|
|
477
477
|
|
|
478
478
|
if self.model_config.translate_to_duckdb and isinstance(connection_props, ConnectionProperties):
|
|
479
|
+
source_func = lambda source_name: "venv." + source_name
|
|
479
480
|
macros = {
|
|
480
|
-
"source":
|
|
481
|
+
"source": source_func, "ref": source_func
|
|
481
482
|
}
|
|
482
483
|
compiled_query2 = self._get_compiled_sql_query_str(compiled_query_str, macros)
|
|
483
484
|
compiled_query_str = self._get_duckdb_query(connection_props.dialect, compiled_query2)
|
|
484
485
|
is_duckdb = True
|
|
485
486
|
else:
|
|
487
|
+
source_func = lambda source_name: self.sources[source_name].get_table()
|
|
486
488
|
macros = {
|
|
487
|
-
"source":
|
|
489
|
+
"source": source_func, "ref": source_func
|
|
488
490
|
}
|
|
489
491
|
compiled_query_str = self._get_compiled_sql_query_str(compiled_query_str, macros)
|
|
490
492
|
is_duckdb = False
|
squirrels/_utils.py
CHANGED
|
@@ -20,7 +20,7 @@ polars_dtypes_to_sqrl_dtypes: dict[type[pl.DataType], list[str]] = {
|
|
|
20
20
|
pl.Int32: ["integer", "int", "int4"],
|
|
21
21
|
pl.Int64: ["bigint", "long", "int8"],
|
|
22
22
|
pl.Float32: ["float", "float4", "real"],
|
|
23
|
-
pl.Float64: ["double", "float8"],
|
|
23
|
+
pl.Float64: ["double", "float8", "decimal"], # Note: Polars Decimal type is considered unstable, so we use Float64 for "decimal"
|
|
24
24
|
pl.Boolean: ["boolean", "bool", "logical"],
|
|
25
25
|
pl.Date: ["date"],
|
|
26
26
|
pl.Time: ["time"],
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
description: |
|
|
2
2
|
This is an example of a build model. It adds a new column called "month" to the source table "src_transactions".
|
|
3
3
|
|
|
4
|
+
materialization: TABLE # optional - defaults to "VIEW" for SQL models, ignored and always a "TABLE" for Python models
|
|
5
|
+
|
|
4
6
|
depends_on: # optional for SQL models - the "ref" macro also adds to this set
|
|
5
7
|
- src_transactions
|
|
6
8
|
- seed_categories
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: squirrels
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b2
|
|
4
4
|
Summary: Squirrels - API Framework for Data Analytics
|
|
5
5
|
Project-URL: Homepage, https://squirrels-analytics.github.io
|
|
6
6
|
Project-URL: Repository, https://github.com/squirrels-analytics/squirrels
|
|
@@ -62,8 +62,8 @@ Here are a few of the things that squirrels can do:
|
|
|
62
62
|
- Configure parameter widgets (types include single-select, multi-select, date, number, etc.) for your datasets (in `parameters.py`).
|
|
63
63
|
- Use Jinja SQL templates (just like dbt!) or python functions (that return a Python dataframe such as polars or pandas) to define dynamic query logic based on parameter selections.
|
|
64
64
|
- Query multiple databases and join the results together in a final view in one API endpoint/dataset!
|
|
65
|
-
- Test your API endpoints with
|
|
66
|
-
- Define
|
|
65
|
+
- Test your API endpoints with Squirrels Studio or by a command line that generates rendered sql queries and results (for a given set of parameter selections).
|
|
66
|
+
- 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!
|
|
67
67
|
|
|
68
68
|
## License
|
|
69
69
|
|
|
@@ -77,18 +77,18 @@ The sections below describe how to set up your local environment for squirrels d
|
|
|
77
77
|
|
|
78
78
|
### Setup
|
|
79
79
|
|
|
80
|
-
This project requires python version 3.10 or above to be installed. It also uses the python
|
|
80
|
+
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/.
|
|
81
81
|
|
|
82
|
-
Then, to install all dependencies, run:
|
|
82
|
+
Then, to install all dependencies in a virtual environment, run:
|
|
83
83
|
|
|
84
|
-
```
|
|
85
|
-
|
|
84
|
+
```bash
|
|
85
|
+
uv sync
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
And activate the virtual environment
|
|
88
|
+
And activate the virtual environment with:
|
|
89
89
|
|
|
90
|
-
```
|
|
91
|
-
|
|
90
|
+
```bash
|
|
91
|
+
source .venv/bin/activate
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
To confirm that the setup worked, run the following to show the help page for all squirrels CLI commands:
|
|
@@ -97,11 +97,9 @@ To confirm that the setup worked, run the following to show the help page for al
|
|
|
97
97
|
sqrl -h
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
You can enter `exit` to exit the virtual environment shell. You can also run `poetry run sqrl -h` to run squirrels commands without activating the virtual environment.
|
|
101
|
-
|
|
102
100
|
### Testing
|
|
103
101
|
|
|
104
|
-
|
|
102
|
+
Run `uv run pytest`. Or if you have the virtual environment activated, simply run `pytest`.
|
|
105
103
|
|
|
106
104
|
### Project Structure
|
|
107
105
|
|
|
@@ -110,7 +108,3 @@ From the root of the git repo, the source code can be found in the `squirrels` f
|
|
|
110
108
|
To understand what a specific squirrels command is doing, start from the `_command_line.py` file as your entry point.
|
|
111
109
|
|
|
112
110
|
The library version is maintained in both the `pyproject.toml` and the `squirrels/_version.py` files.
|
|
113
|
-
|
|
114
|
-
When a user initializes a squirrels project using `sqrl init`, the files are copied from the `squirrels/package_data/base_project` folder. The contents in the `database` subfolder were constructed from the scripts in the `database_elt` folder.
|
|
115
|
-
|
|
116
|
-
For the Squirrels UI activated by `sqrl run`, the HTML, CSS, and Javascript files can be found in the `static` and `templates` subfolders of `squirrels/package_data`. The CSS and Javascript files are minified and built from the source files in this project: https://github.com/squirrels-analytics/squirrels-testing-ui.
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
+
dateutils/__init__.py,sha256=7HDDMpT26jreIkDecQo_-CGPwmhMBwMsCyLKuWc4EPY,16673
|
|
1
2
|
squirrels/__init__.py,sha256=Y62ldkfs81jsKcetWLDw_1a98gwALx9Ww1b_rLsBpbs,1010
|
|
2
3
|
squirrels/_api_response_models.py,sha256=fQWjEBGAyy8KbkaY4jjOKvxhEcvQPU1bF2dJRTVTRc4,13601
|
|
3
4
|
squirrels/_api_server.py,sha256=1jhUr7GwwwD0O5dqQOX11uuU3Ea-zKXheeeQM0cLrDE,51181
|
|
4
5
|
squirrels/_auth.py,sha256=XCC9i-Z7PaU74u-fqR6_d_eoc9qVh-5nC0CdYp4Svvg,19254
|
|
5
|
-
squirrels/_command_line.py,sha256=
|
|
6
|
+
squirrels/_command_line.py,sha256=ZB7cTJabWiYEV6tFi1l87M-w468LJ-DV7TNgQ_bqFbY,11151
|
|
6
7
|
squirrels/_connection_set.py,sha256=ZxnNAj9Cu_5ba0uwi6v_ItH6nurFnONrPgB47_GE-3I,3987
|
|
7
8
|
squirrels/_constants.py,sha256=RDoUo4HtiVIQXatVdLoMXaGs1pkNER-Kgnmgs4FUx_Y,3126
|
|
8
9
|
squirrels/_dashboards_io.py,sha256=PPZGB6TpPYxaWJ2pJMj0cZNT9Vo14QV9w-1idLb_eaE,2993
|
|
9
10
|
squirrels/_exceptions.py,sha256=OOywX0UhX-KnvC8MScl2E6KYq3bzLq-PSqOpF7NbUvc,2481
|
|
10
|
-
squirrels/_initializer.py,sha256
|
|
11
|
+
squirrels/_initializer.py,sha256=-aQHgpGADfJDfMUW1ToJR_4YJgglIAHJ2zH457h3rzY,14100
|
|
11
12
|
squirrels/_manifest.py,sha256=SrnGj_dd6L1O5Ygfr_B4rvxv_zx9iZap8bSfHTjhx4o,10208
|
|
12
|
-
squirrels/_model_builder.py,sha256=
|
|
13
|
-
squirrels/_model_configs.py,sha256=
|
|
13
|
+
squirrels/_model_builder.py,sha256=fdoBcbbDpQaSTApV0mHKbq3yFe5xrr-TggdehEx8xE0,5063
|
|
14
|
+
squirrels/_model_configs.py,sha256=90ops65jN_iEeZjdR6VzfV0AGbTro6m4XEzbo5Mlf6Y,3299
|
|
14
15
|
squirrels/_model_queries.py,sha256=xzfkPvHMq-5m22pnb-Zd045gRTdWe7UP6RmS9AZ-LRk,1086
|
|
15
|
-
squirrels/_models.py,sha256=
|
|
16
|
+
squirrels/_models.py,sha256=C99VZVQsdcLYRBxNasOj95o8LNJcVxW5AqcxxYo0mIQ,48796
|
|
16
17
|
squirrels/_package_loader.py,sha256=xcIur5Z38OWd-OVjsueFstVV567zlkK9UBnLS4NawJY,1158
|
|
17
18
|
squirrels/_parameter_configs.py,sha256=sWQEJ7Hr6s1TE91H6qZsUO7uUAZqlS0z2Af3ZNoqc7I,23981
|
|
18
19
|
squirrels/_parameter_sets.py,sha256=aE6IDELpLgytjt_G7eI9oTEMgDCgkb71dxATBsrnC38,9837
|
|
@@ -20,12 +21,11 @@ squirrels/_project.py,sha256=3Ve6waHnRh92tu-KJSy5GJ5imaIf4LqBQcq_dlokAJs,28314
|
|
|
20
21
|
squirrels/_py_module.py,sha256=LgILTjMx3jyb92o8Y35ezpntuk6u6ezYVGAICKhUSUM,2622
|
|
21
22
|
squirrels/_seeds.py,sha256=yyIYp4bn9Sg6lhgvsOYIJQHIpPbvLNsyGHVfswEyVd8,2225
|
|
22
23
|
squirrels/_sources.py,sha256=j5mY_EtA5cxoHwtk8RwTVHO74hleik2lS7mF9gVnG_A,4840
|
|
23
|
-
squirrels/_utils.py,sha256=
|
|
24
|
+
squirrels/_utils.py,sha256=dOGlXjMY_Ad-A5TCVPyIeW81738cK4Ytz2Wghv2irPU,12138
|
|
24
25
|
squirrels/_version.py,sha256=M8aFbJ4vlAi3Sk9b7leRuEfkNBjkkX5S_F9lA4h8GK4,105
|
|
25
26
|
squirrels/dashboards.py,sha256=pekv_ERwoHHpBLYjIXSJ7Z8X7suWmjyex_whpCpZY60,1974
|
|
26
27
|
squirrels/data_sources.py,sha256=W3wzXyC7wGVnz49JkWYZQxBqNuViC_QhulM90KEuLCY,26088
|
|
27
28
|
squirrels/dataset_result.py,sha256=wZvvRs4U1Hva_iyoFosAAu76S1yfv1Cd5SX3UMIw2PA,2838
|
|
28
|
-
squirrels/dateutils.py,sha256=kH2JNvQz0xjfYSh4xNTEAvm73f2EVXNpbXAB9zM2694,16730
|
|
29
29
|
squirrels/parameter_options.py,sha256=cWYKNoBUopHq6VfaeBu-nN2V0_IY3OgYpmYhKODNCew,16956
|
|
30
30
|
squirrels/parameters.py,sha256=kcMQ5-GEQ5lA9Zs_-R21n2Hq5_gULCygQy-Rf1FJK-4,56001
|
|
31
31
|
squirrels/arguments/init_time_args.py,sha256=wl9PrVr3iHsMuZQEfrUj_gyzjdSqMTdQbpYUPjWQEsc,3477
|
|
@@ -48,7 +48,7 @@ squirrels/package_data/base_project/macros/macros_example.sql,sha256=oxC6TZmoqgT
|
|
|
48
48
|
squirrels/package_data/base_project/models/sources.yml,sha256=Miujhj5QRnbN1Q6BkQyeyX8FZAROPDPLWzVgdsdZy9o,1890
|
|
49
49
|
squirrels/package_data/base_project/models/builds/build_example.py,sha256=SUfWN7E8lZJYl-Zi2c-KoLADha4S5sw4T6cVhhozLaY,1014
|
|
50
50
|
squirrels/package_data/base_project/models/builds/build_example.sql,sha256=UNpgvybUV7sVK-KN2h-ULDyDb4uwN3nYNGZUcBLBtrU,506
|
|
51
|
-
squirrels/package_data/base_project/models/builds/build_example.yml,sha256=
|
|
51
|
+
squirrels/package_data/base_project/models/builds/build_example.yml,sha256=kUd6j5u8qU6UD294AowPBHFOb8yYDA_dxWlCIBrPl90,1407
|
|
52
52
|
squirrels/package_data/base_project/models/dbviews/dbview_example.sql,sha256=hGj7rNJZzgEKGxqzwjmkCAdL-0hOh4U7pIJCyz2SYHk,266
|
|
53
53
|
squirrels/package_data/base_project/models/dbviews/dbview_example.yml,sha256=BFTGdBe7OcyNWKjBh7IhWgmfFgG3nT4toCR3XG5ZgLI,947
|
|
54
54
|
squirrels/package_data/base_project/models/federates/federate_example.py,sha256=g30cVukwI9UIypZR6KOU1z0KWLwx2kGIkRHhrdmeZq8,1774
|
|
@@ -63,8 +63,8 @@ squirrels/package_data/base_project/seeds/seed_categories.yml,sha256=NZ4BVvYYCEq
|
|
|
63
63
|
squirrels/package_data/base_project/seeds/seed_subcategories.csv,sha256=Tta1oIgnc2nukNMDlUkIErRKNH_8YT5EPp1A2kQKcow,327
|
|
64
64
|
squirrels/package_data/base_project/seeds/seed_subcategories.yml,sha256=QTgw8Eld-p6Kntf53FyXyn7-7vKYI7IOJVu-Lr-FHCY,583
|
|
65
65
|
squirrels/package_data/base_project/tmp/.gitignore,sha256=XImoqcWvJY0C0L_TWCx1ljvqU7qh9fUTJmK4ACCmNFI,13
|
|
66
|
-
squirrels-0.5.
|
|
67
|
-
squirrels-0.5.
|
|
68
|
-
squirrels-0.5.
|
|
69
|
-
squirrels-0.5.
|
|
70
|
-
squirrels-0.5.
|
|
66
|
+
squirrels-0.5.0b2.dist-info/METADATA,sha256=JTh_jdSvir5R6fCBIwjYJ_nRD6OfKwWnti-o2di3UXY,4399
|
|
67
|
+
squirrels-0.5.0b2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
68
|
+
squirrels-0.5.0b2.dist-info/entry_points.txt,sha256=i6vgjhJ3o_cdSFYofFcNY9DFMPr4MIcuwnkskSTXfJc,95
|
|
69
|
+
squirrels-0.5.0b2.dist-info/licenses/LICENSE,sha256=qqERuumQtQVsMrEXvJHuecJvV2sLxbleEubd_Zk8dY8,11338
|
|
70
|
+
squirrels-0.5.0b2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|