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.

@@ -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 u.ConfigurationError(f"For constructors of class names that start with DayIdxOf_, idx cannot be zero")
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 u.ConfigurationError(f"Value X must fit evenly in 12")
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 u.ConfigurationError(f"The length of 'step' must not be zero")
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)
@@ -1,5 +1,5 @@
1
1
  from argparse import ArgumentParser, _SubParsersAction
2
- import sys, asyncio, traceback, io, os, subprocess
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('-o', '--overwrite', action='store_true', help="Overwrite files that already exist")
53
- init_parser.add_argument('--core', action='store_true', help='Include all core files')
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', action='store_true', help=f'Include a sample dashboard file')
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 prefixed with a timestamp."
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, overwrite=args.overwrite).init_project(args)
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, overwrite: bool = False):
14
- self.project_name = project_name
15
- self.overwrite = overwrite
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 = ["core", "connections", "parameters", "build", "federate", "dashboard"]
120
- _, CONNECTIONS, PARAMETERS, BUILD, FEDERATE, DASHBOARD = options
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 not any(answers.values()):
133
- questions = [
134
- inquirer.List(
135
- CONNECTIONS, message=f"How would you like to configure the database connections?", choices=c.CONF_FORMAT_CHOICES
136
- ),
137
- inquirer.List(
138
- PARAMETERS, message=f"How would you like to configure the parameters?", choices=c.CONF_FORMAT_CHOICES2
139
- ),
140
- inquirer.List(
141
- BUILD, message="What's the file format for the build model?", choices=c.FILE_TYPE_CHOICES
142
- ),
143
- inquirer.List(
144
- FEDERATE, message="What's the file format for the federated model?", choices=c.FILE_TYPE_CHOICES
145
- ),
146
- inquirer.Confirm(
147
- DASHBOARD, message=f"Do you want to include a dashboard example?", default=False
148
- ),
149
- inquirer.Password(
150
- "admin_password", message="What's the admin password? (leave blank to generate a random one)"
151
- ),
152
- ]
153
- answers = inquirer.prompt(questions)
154
- assert isinstance(answers, dict)
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.PYTHON_FILE_TYPE)
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:
@@ -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
 
@@ -47,7 +47,7 @@ class QueryModelConfig(ModelConfig):
47
47
 
48
48
 
49
49
  class BuildModelConfig(QueryModelConfig):
50
- materialization: str = Field(default="TABLE", description="The materialization of the model (ignored if Python model which is always a table)")
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": lambda source_name: "venv." + source_name
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": lambda source_name: self.sources[source_name].get_table()
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.0b1
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 an interactive UI or by a command line that generates rendered sql queries and results (for a given set of parameter selections).
66
- - Define authentication logic (in `auth.py`) and authorize privacy scope per dataset (in `squirrels.yml`). The user's attributes can even be used in your query logic!
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 build tool `poetry`. Information on setting up poetry can be found at: https://python-poetry.org/docs/.
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
- poetry install
84
+ ```bash
85
+ uv sync
86
86
  ```
87
87
 
88
- And activate the virtual environment created by poetry with:
88
+ And activate the virtual environment with:
89
89
 
90
- ```
91
- poetry shell
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
- In poetry's virtual environment, run `pytest`.
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=urMyS7xIyNCWoiBWDLr6lDz0M_3NvaoPfMIo0vvn5cQ,10663
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=fwB_sSJqiBQqYseLshiItEyZCAWMc9bA_qqAW3l0ZIY,13265
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=_rUfGgmvvsyFhmXLvDzuP3gDPT_TLXgrZSusqjhhtRo,4921
13
- squirrels/_model_configs.py,sha256=03gzjFwoMiPtEPMg3U4Ekm7vJtQ2NU3Ks2Aj6gY-2vs,3300
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=JmkUSx02ccRRGzGqQNh_Hxxqk4KCATNcxTVekUWOExU,48680
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=gzcPAQCJna674YomsxTgVe4DZucGJTVotxMWawoudzw,12043
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=bwA_r6j8CIgrzuRnxpVmR350nGvy_USDy6p7TOy4lBI,1284
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.0b1.dist-info/METADATA,sha256=eZ83IOAOLOTs9zsox-IS8Xd_CTCEiAu7qGtLdhvFoGI,5053
67
- squirrels-0.5.0b1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
68
- squirrels-0.5.0b1.dist-info/entry_points.txt,sha256=i6vgjhJ3o_cdSFYofFcNY9DFMPr4MIcuwnkskSTXfJc,95
69
- squirrels-0.5.0b1.dist-info/licenses/LICENSE,sha256=qqERuumQtQVsMrEXvJHuecJvV2sLxbleEubd_Zk8dY8,11338
70
- squirrels-0.5.0b1.dist-info/RECORD,,
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,,