tinybird 0.0.1.dev273__py3-none-any.whl → 0.0.1.dev275__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 tinybird might be problematic. Click here for more details.

@@ -598,6 +598,12 @@ Ready? """
598
598
  warning_confirm_delete_branch = prompt_message("Do you want to remove '{branch}' Branch?")
599
599
  warning_confirm_delete_release = prompt_message("Do you want to remove Release {semver}?")
600
600
  warning_confirm_rollback_release = prompt_message("Do you want to rollback current Release {semver} to {rollback}?")
601
+ warning_confirm_on_demand_compute = warning_message(
602
+ "On-demand compute will incur additional costs beyond your regular usage.\n"
603
+ "This feature uses dedicated compute resources that are billed separately.\n"
604
+ "You can read more about the pricing at https://www.tinybird.co/docs/classic/work-with-data/process-and-copy/materialized-views#compute-compute-separation-for-populates\n\n"
605
+ "Do you want to proceed with on-demand compute?"
606
+ )
601
607
 
602
608
  warning_confirm_delete_token = prompt_message("Do you want to delete Token {token}?")
603
609
  warning_confirm_refresh_token = prompt_message("Do you want to refresh Token {token}?")
tinybird/tb/__cli__.py CHANGED
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
4
4
  __url__ = 'https://www.tinybird.co/docs/forward/commands'
5
5
  __author__ = 'Tinybird'
6
6
  __author_email__ = 'support@tinybird.co'
7
- __version__ = '0.0.1.dev273'
8
- __revision__ = '9f4ea9e'
7
+ __version__ = '0.0.1.dev275'
8
+ __revision__ = '0c15fc3'
@@ -704,9 +704,9 @@ def get_connection_datafile_local(config: dict[str, Any], connection_name: str)
704
704
  return "Connection not found"
705
705
 
706
706
 
707
- def run_tests(client: TinyB, project: Project, pipe_name: Optional[str] = None) -> None:
707
+ def run_tests(client: TinyB, project: Project, pipe_name: Optional[str] = None) -> Optional[str]:
708
708
  try:
709
- run_tests_common(name=(pipe_name,) if pipe_name else (), project=project, client=client)
709
+ return run_tests_common(name=(pipe_name,) if pipe_name else (), project=project, client=client)
710
710
  except SystemExit as e:
711
711
  raise Exception(e.args[0])
712
712
 
@@ -612,6 +612,7 @@ test_instructions = """
612
612
  - MANDATORY: Before creating the test, analyze the fixture files that the tables of the endpoint are using so you can create relevant tests.
613
613
  - IMPORTANT: expected_result field should always be an empty string, because it will be filled by the `create_test` tool.
614
614
  - If the endpoint does not have parameters, you can omit parameters and generate a single test.
615
+ - If some tests are skipped, it is because some test names do not match any pipe name. Rename the test file to match the pipe name.
615
616
  - The format of the test file is the following:
616
617
  <test_file_format>
617
618
  - name: kpis_single_day
@@ -5,8 +5,7 @@ from pydantic_ai.usage import Usage
5
5
  from tinybird.tb.modules.agent.animations import ThinkingAnimation
6
6
  from tinybird.tb.modules.agent.models import create_model
7
7
  from tinybird.tb.modules.agent.prompts import test_instructions, tests_files_prompt, tone_and_style_instructions
8
- from tinybird.tb.modules.agent.tools.test import create_tests as create_tests_tool
9
- from tinybird.tb.modules.agent.tools.test import run_tests as run_tests_tool
8
+ from tinybird.tb.modules.agent.tools.test import create_tests, remove_test, rename_test, run_tests
10
9
  from tinybird.tb.modules.agent.utils import TinybirdAgentContext
11
10
  from tinybird.tb.modules.project import Project
12
11
 
@@ -42,13 +41,17 @@ You can do the following:
42
41
  - Create new test files.
43
42
  - Update existing test files.
44
43
  - Run tests.
44
+ - Rename test files.
45
+ - Remove test files.
45
46
  """,
46
47
  tone_and_style_instructions,
47
48
  test_instructions,
48
49
  ],
49
50
  tools=[
50
- Tool(create_tests_tool, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
51
- Tool(run_tests_tool, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
51
+ Tool(create_tests, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
52
+ Tool(run_tests, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
53
+ Tool(rename_test, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
54
+ Tool(remove_test, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
52
55
  ],
53
56
  )
54
57
 
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from pathlib import Path
2
3
  from typing import Optional
3
4
 
@@ -122,7 +123,6 @@ def run_tests(ctx: RunContext[TinybirdAgentContext], pipe_name: Optional[str] =
122
123
  return f"User did not confirm the proposed changes and gave the following feedback: {feedback}"
123
124
 
124
125
  test_output = ctx.deps.run_tests(pipe_name=pipe_name)
125
- click.echo(test_output)
126
126
  ctx.deps.thinking_animation.start()
127
127
  if pipe_name:
128
128
  return f"Tests for '{pipe_name}' endpoint in {path} and ran successfully\n{test_output}"
@@ -146,3 +146,111 @@ def run_tests(ctx: RunContext[TinybirdAgentContext], pipe_name: Optional[str] =
146
146
  error_message = error_message.replace(test_exit_code, "")
147
147
  ctx.deps.thinking_animation.start()
148
148
  return f"Error running tests: {error_message}"
149
+
150
+
151
+ def rename_test(ctx: RunContext[TinybirdAgentContext], path: str, new_path: str) -> str:
152
+ """Renames a test file.
153
+
154
+ Args:
155
+ path (str): The path to the test file to rename. Required.
156
+ new_path (str): The new path to the test file. Required.
157
+
158
+ Returns:
159
+ str: Result of the rename operation.
160
+ """
161
+ try:
162
+ ctx.deps.thinking_animation.stop()
163
+ confirmation = show_confirmation(
164
+ title=f"Rename '{path}' to '{new_path}'?",
165
+ skip_confirmation=ctx.deps.dangerously_skip_permissions,
166
+ )
167
+
168
+ if confirmation == "review":
169
+ feedback = show_input(ctx.deps.workspace_name)
170
+ ctx.deps.thinking_animation.start()
171
+ return f"User did not confirm the proposed changes and gave the following feedback: {feedback}"
172
+
173
+ click.echo(FeedbackManager.highlight(message=f"» Renaming test file {path} to {new_path}..."))
174
+ old_path_full = Path(ctx.deps.folder) / path.removeprefix("/")
175
+ new_path_full = Path(ctx.deps.folder) / new_path.removeprefix("/")
176
+
177
+ if not old_path_full.exists():
178
+ click.echo(FeedbackManager.error(message=f"Error: Test file {path} not found"))
179
+ ctx.deps.thinking_animation.start()
180
+ return f"Error: Test file {path} not found (double check the file path)"
181
+
182
+ if new_path_full.exists():
183
+ click.echo(FeedbackManager.error(message=f"Error: Test file {new_path} already exists"))
184
+ ctx.deps.thinking_animation.start()
185
+ return f"Error: Test file {new_path} already exists"
186
+
187
+ # Ensure new file has .yaml extension for test files
188
+ if new_path_full.suffix != ".yaml":
189
+ new_path_full = new_path_full.with_suffix(".yaml")
190
+ new_path = str(new_path_full.relative_to(ctx.deps.folder))
191
+
192
+ parent_path = new_path_full.parent
193
+ parent_path.mkdir(parents=True, exist_ok=True)
194
+ os.rename(old_path_full, new_path_full)
195
+
196
+ click.echo(FeedbackManager.success(message=f"✓ {new_path} created"))
197
+ ctx.deps.thinking_animation.start()
198
+ return f"Renamed test file from {path} to {new_path}"
199
+ except AgentRunCancelled as e:
200
+ raise e
201
+ except FileNotFoundError:
202
+ ctx.deps.thinking_animation.start()
203
+ click.echo(FeedbackManager.error(message=f"Error: Test file {path} not found"))
204
+ return f"Error: Test file {path} not found (double check the file path)"
205
+ except Exception as e:
206
+ ctx.deps.thinking_animation.stop()
207
+ click.echo(FeedbackManager.error(message=e))
208
+ ctx.deps.thinking_animation.start()
209
+ return f"Error renaming test file {path} to {new_path}: {e}"
210
+
211
+
212
+ def remove_test(ctx: RunContext[TinybirdAgentContext], path: str) -> str:
213
+ """Removes a test file from the project folder
214
+
215
+ Args:
216
+ path (str): The path to the test file to remove. Required.
217
+
218
+ Returns:
219
+ str: If the test file was removed successfully.
220
+ """
221
+ try:
222
+ ctx.deps.thinking_animation.stop()
223
+ path = path.removeprefix("/")
224
+ full_path = Path(ctx.deps.folder) / path
225
+
226
+ if not full_path.exists():
227
+ click.echo(FeedbackManager.error(message=f"Error: Test file {path} not found"))
228
+ ctx.deps.thinking_animation.start()
229
+ return f"Error: Test file {path} not found (double check the file path)"
230
+
231
+ confirmation = show_confirmation(
232
+ title=f"Delete '{path}'?",
233
+ skip_confirmation=ctx.deps.dangerously_skip_permissions,
234
+ )
235
+
236
+ if confirmation == "review":
237
+ feedback = show_input(ctx.deps.workspace_name)
238
+ ctx.deps.thinking_animation.start()
239
+ return f"User did not confirm the proposed changes and gave the following feedback: {feedback}"
240
+
241
+ click.echo(FeedbackManager.highlight(message=f"» Removing {path}..."))
242
+
243
+ # Remove the test file
244
+ full_path.unlink()
245
+
246
+ click.echo(FeedbackManager.success(message=f"✓ {path} removed"))
247
+ ctx.deps.thinking_animation.start()
248
+
249
+ return f"Removed test file {path}."
250
+ except AgentRunCancelled as e:
251
+ raise e
252
+ except Exception as e:
253
+ ctx.deps.thinking_animation.stop()
254
+ click.echo(FeedbackManager.error(message=e))
255
+ ctx.deps.thinking_animation.start()
256
+ return f"Error removing test file {path}: {e}"
@@ -149,7 +149,7 @@ def cli(
149
149
  if user_token:
150
150
  config_temp.set_user_token(user_token)
151
151
  if token or host or user_token:
152
- try_update_config_with_remote(config_temp, auto_persist=False, raise_on_errors=False)
152
+ try_update_config_with_remote(config_temp, auto_persist=True, raise_on_errors=False)
153
153
 
154
154
  # Overwrite token and host with env vars manually, without resorting to click.
155
155
  #
@@ -19,11 +19,24 @@ from tinybird.tb.modules.project import Project
19
19
 
20
20
 
21
21
  # TODO(eclbg): This should eventually end up in client.py, but we're not using it here yet.
22
- def api_fetch(url: str, headers: dict) -> dict:
23
- r = requests.get(url, headers=headers)
24
- if r.status_code == 200:
25
- logging.debug(json.dumps(r.json(), indent=2))
26
- return r.json()
22
+ def api_fetch(url: str, headers: dict, max_retries: int = 3, backoff_factor: float = 0.5) -> dict:
23
+ retries = 0
24
+ while retries <= max_retries:
25
+ try:
26
+ r = requests.get(url, headers=headers)
27
+ if r.status_code == 200:
28
+ logging.debug(json.dumps(r.json(), indent=2))
29
+ return r.json()
30
+ else:
31
+ raise Exception(f"Request failed with status code {r.status_code}")
32
+ except Exception:
33
+ retries += 1
34
+ if retries > max_retries:
35
+ break
36
+
37
+ wait_time = backoff_factor * (2 ** (retries - 1))
38
+ time.sleep(wait_time)
39
+
27
40
  # Try to parse and print the error from the response
28
41
  try:
29
42
  result = r.json()
@@ -35,6 +48,7 @@ def api_fetch(url: str, headers: dict) -> dict:
35
48
  message = "Error parsing response from API"
36
49
  click.echo(FeedbackManager.error(message=message))
37
50
  sys_exit("deployment_error", message)
51
+
38
52
  return {}
39
53
 
40
54
 
@@ -48,6 +62,7 @@ def api_post(
48
62
  if r.status_code < 300:
49
63
  logging.debug(json.dumps(r.json(), indent=2))
50
64
  return r.json()
65
+
51
66
  # Try to parse and print the error from the response
52
67
  try:
53
68
  result = r.json()
@@ -61,6 +76,7 @@ def api_post(
61
76
  message = "Error parsing response from API"
62
77
  click.echo(FeedbackManager.error(message=message))
63
78
  sys_exit("deployment_error", message)
79
+
64
80
  return {}
65
81
 
66
82
 
@@ -188,7 +188,7 @@ def update_test(pipe: str, project: Project, client: TinyB) -> None:
188
188
  cleanup_test_workspace(client, project.folder)
189
189
 
190
190
 
191
- def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> None:
191
+ def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> Optional[str]:
192
192
  full_error = ""
193
193
  try:
194
194
  load_secrets(project=project, client=client)
@@ -203,19 +203,30 @@ def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> None:
203
203
  endpoints if len(endpoints) > 0 else glob.glob(f"{project.path}/tests/**/*.y*ml", recursive=True)
204
204
  )
205
205
 
206
- def run_test(test_file) -> Optional[str]:
206
+ def run_test(test_file) -> Tuple[Optional[str], int, int, bool]:
207
207
  test_file_path = Path(test_file)
208
- click.echo(FeedbackManager.info(message=f"* {test_file_path.stem}{test_file_path.suffix}"))
209
208
  test_file_content = parse_tests(test_file_path.read_text())
209
+ total_tests = len(test_file_content)
210
+
211
+ # Check if pipe exists before processing any tests
212
+ try:
213
+ client._req(f"/v0/pipes/{test_file_path.stem}")
214
+ click.echo(FeedbackManager.info(message=f"* {test_file_path.stem}{test_file_path.suffix}"))
215
+ except Exception:
216
+ # Entire test file skipped because pipe doesn't exist
217
+ click.echo(FeedbackManager.info(message=f"* {test_file_path.stem}{test_file_path.suffix}"))
218
+ click.echo(
219
+ FeedbackManager.warning(message=f"✗ All tests skipped ({test_file_path.stem}.pipe not found)")
220
+ )
221
+ return None, total_tests, total_tests, True # True indicates file was skipped
222
+
210
223
  test_file_errors = ""
224
+ skipped_count = 0
225
+
211
226
  for test in test_file_content:
212
227
  try:
213
228
  test_params = test["parameters"].split("?")[1] if "?" in test["parameters"] else test["parameters"]
214
- response = None
215
- try:
216
- response = get_pipe_data(client, pipe_name=test_file_path.stem, test_params=test_params)
217
- except Exception:
218
- continue
229
+ response = get_pipe_data(client, pipe_name=test_file_path.stem, test_params=test_params)
219
230
 
220
231
  expected_result = response.text
221
232
  if response.status_code >= 400:
@@ -237,23 +248,45 @@ def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> None:
237
248
  except Exception as e:
238
249
  test_file_errors += f"✗ {test['name']} failed\n** Output and expected output are different: \n{e}"
239
250
  click.echo(FeedbackManager.error(message=test_file_errors))
240
- return test_file_errors
241
- return None
251
+ return test_file_errors, skipped_count, total_tests, False
252
+ return None, skipped_count, total_tests, False # False indicates file was not skipped
242
253
 
243
254
  failed_tests_count = 0
255
+ skipped_files_count = 0
256
+ total_tests_count = 0
244
257
  test_count = len(test_files)
245
-
258
+ output = ""
246
259
  for test_file in test_files:
247
- if run_test_error := run_test(test_file):
260
+ run_test_error, skipped_count, individual_tests_count, file_skipped = run_test(test_file)
261
+ total_tests_count += individual_tests_count
262
+
263
+ if file_skipped:
264
+ skipped_files_count += 1
265
+ elif run_test_error:
248
266
  full_error += f"\n{run_test_error}"
249
267
  failed_tests_count += 1
250
268
 
269
+ runnable_files_count = test_count - skipped_files_count
270
+ passed_files_count = runnable_files_count - failed_tests_count
271
+
251
272
  if failed_tests_count:
252
- error = f"\n✗ {test_count - failed_tests_count}/{test_count} passed"
273
+ error = f"\n✗ {passed_files_count}/{runnable_files_count} passed"
274
+ if skipped_files_count > 0:
275
+ error += f" ({skipped_files_count} skipped)"
276
+ output += f"{error}\n"
253
277
  click.echo(FeedbackManager.error(message=error))
254
278
  sys_exit("test_error", full_error)
255
279
  else:
256
- click.echo(FeedbackManager.success(message=f"\n✓ {test_count}/{test_count} passed"))
280
+ if runnable_files_count == 0:
281
+ success_message = "\n✓ No tests to run"
282
+ else:
283
+ success_message = f"\n✓ {runnable_files_count}/{runnable_files_count} passed"
284
+ if skipped_files_count > 0:
285
+ success_message += f" ({skipped_files_count} skipped)"
286
+ message_color = FeedbackManager.success if runnable_files_count > 0 else FeedbackManager.warning
287
+ click.echo(message_color(message=success_message))
288
+ output += f"{success_message}\n"
289
+ return output
257
290
  except Exception as e:
258
291
  raise CLITestException(FeedbackManager.error(message=str(e)))
259
292
  finally:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev273
3
+ Version: 0.0.1.dev275
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
6
6
  Author: Tinybird
@@ -1,7 +1,7 @@
1
1
  tinybird/connectors.py,sha256=7Gjms7b5MAaBFGi3xytsJurCylprONpFcYrzp4Fw2Rc,15241
2
2
  tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
3
3
  tinybird/datatypes.py,sha256=r4WCvspmrXTJHiPjjyOTiZyZl31FO3Ynkwq4LQsYm6E,11059
4
- tinybird/feedback_manager.py,sha256=1INQFfRfuMCb9lfB8KNf4r6qC2khW568hoHjtk-wshI,69305
4
+ tinybird/feedback_manager.py,sha256=XY8d83pRlq-LH7xHMApkaEebfXEWLjDzrGe1prpcTHE,69778
5
5
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
6
6
  tinybird/prompts.py,sha256=HoDv9TxPiP8v2XoGTWYxP133dK9CEbXVv4XE5IT339c,45483
7
7
  tinybird/sql.py,sha256=BufnOgclQokDyihtuXesOwHBsebN6wRXIxO5wKRkOwE,48299
@@ -17,7 +17,7 @@ tinybird/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1w
17
17
  tinybird/datafile/parse_connection.py,sha256=tRyn2Rpr1TeWet5BXmMoQgaotbGdYep1qiTak_OqC5E,1825
18
18
  tinybird/datafile/parse_datasource.py,sha256=ssW8QeFSgglVFi3sDZj_HgkJiTJ2069v2JgqnH3CkDE,1825
19
19
  tinybird/datafile/parse_pipe.py,sha256=xf4m0Tw44QWJzHzAm7Z7FwUoUUtr7noMYjU1NiWnX0k,3880
20
- tinybird/tb/__cli__.py,sha256=kp7873OcOrpDdwPcuqes22hVltt_E98SAn-s_yb-kQ4,247
20
+ tinybird/tb/__cli__.py,sha256=F6DuvogeaLQfXF18e87QuhWLJgcSX2Sq60BJKK8XzF8,247
21
21
  tinybird/tb/check_pypi.py,sha256=Gp0HkHHDFMSDL6nxKlOY51z7z1Uv-2LRexNTZSHHGmM,552
22
22
  tinybird/tb/cli.py,sha256=FdDFEIayjmsZEVsVSSvRiVYn_FHOVg_zWQzchnzfWho,1008
23
23
  tinybird/tb/client.py,sha256=IQRaInDjOwr9Fzaz3_xXc3aUGqh94tM2lew7IZbB9eM,53733
@@ -25,7 +25,7 @@ tinybird/tb/config.py,sha256=mhMTGnMB5KcxGoh3dewIr2Jjsa6pHE183gCPAQWyp6o,3973
25
25
  tinybird/tb/modules/build.py,sha256=efD-vamK1NPaDo9R86Hn8be2DYoW0Hh5bZiH7knK5dk,7790
26
26
  tinybird/tb/modules/build_common.py,sha256=dthlaDn_CuwZnedQcUi7iIdDoHWfSbbbGQwiDgNcmC0,13062
27
27
  tinybird/tb/modules/cicd.py,sha256=0KLKccha9IP749QvlXBmzdWv1On3mFwMY4DUcJlBxiE,7326
28
- tinybird/tb/modules/cli.py,sha256=OC4jqGciUAgPQLgmo4ztjiQTOiGzqX3yILfxjbZ-CIs,16686
28
+ tinybird/tb/modules/cli.py,sha256=4jNxb2EMimguzyGdKlJc0qyNhDaJ05ph0bTBwyj_mVs,16685
29
29
  tinybird/tb/modules/common.py,sha256=tj6DR2yOqMMQ0PILwFGXmMogxdrbQCgj36HdSM611rs,82657
30
30
  tinybird/tb/modules/config.py,sha256=gK7rgaWTDd4ZKCrNEg_Uemr26EQjqWt6TjyQKujxOws,11462
31
31
  tinybird/tb/modules/connection.py,sha256=axp8Fny1_4PSLJGN4UF6WygyRbQtM3Lbt6thxHKTxzw,17790
@@ -33,7 +33,7 @@ tinybird/tb/modules/copy.py,sha256=dPZkcIDvxjJrlQUIvToO0vsEEEs4EYumbNV77-BzNoU,4
33
33
  tinybird/tb/modules/create.py,sha256=pJxHXG69c9Z_21s-7VuJ3RZOF_nJU51LEwiAkvI3dZY,23251
34
34
  tinybird/tb/modules/datasource.py,sha256=pae-ENeHYIF1HHYRSOziFC-2FPLUFa0KS60YpdlKCS8,41725
35
35
  tinybird/tb/modules/deployment.py,sha256=v0layOmG0IMnuXc3RT39mpGfa5M8yPlrL9F089fJFCo,15964
36
- tinybird/tb/modules/deployment_common.py,sha256=gP2jYdRw8aehfKIHVQaS3DoS7sA43I-sQkLykcL83jE,19193
36
+ tinybird/tb/modules/deployment_common.py,sha256=2NJgoONEfhFpGIPeE_wULDuUkomxPsIu2gbHgL1qcw8,19653
37
37
  tinybird/tb/modules/deprecations.py,sha256=rrszC1f_JJeJ8mUxGoCxckQTJFBCR8wREf4XXXN-PRc,4507
38
38
  tinybird/tb/modules/dev_server.py,sha256=57FCKuWpErwYUYgHspYDkLWEm9F4pbvVOtMrFXX1fVU,10129
39
39
  tinybird/tb/modules/endpoint.py,sha256=ksRj6mfDb9Xv63PhTkV_uKSosgysHElqagg3RTt21Do,11958
@@ -63,13 +63,13 @@ tinybird/tb/modules/sink.py,sha256=dK2s__my0ePIUYrqBzhPSgdWN9rbpvP1G4dT7DJzz80,3
63
63
  tinybird/tb/modules/table.py,sha256=4XrtjM-N0zfNtxVkbvLDQQazno1EPXnxTyo7llivfXk,11035
64
64
  tinybird/tb/modules/telemetry.py,sha256=T9gtsQffWqG_4hRBaUJPzOfMkPwz7mH-R6Bn1XRYViA,11482
65
65
  tinybird/tb/modules/test.py,sha256=O2-mS4uMU6nPi7yWPpWzshAgOlYKiGS-tkM12pXQGMI,1906
66
- tinybird/tb/modules/test_common.py,sha256=YZwAdSfYVXdvArfTc9tH-2QBOhb_XbnJ3eKvyXTJuEM,12717
66
+ tinybird/tb/modules/test_common.py,sha256=kZ503FFXZwUkZ8zCGZKjBXmRKfF6ooqohkuFhzNRX48,14442
67
67
  tinybird/tb/modules/token.py,sha256=ZhW_o7XCr90wJRhMN6816vyo_TVfnzPXyIhrhzQ7oZ0,13807
68
68
  tinybird/tb/modules/watch.py,sha256=No0bK1M1_3CYuMaIgylxf7vYFJ72lTJe3brz6xQ-mJo,8819
69
69
  tinybird/tb/modules/workspace.py,sha256=Q_8HcxMsNg8QG9aBlwcWS2umrDP5IkTIHqqz3sfmGuc,11341
70
70
  tinybird/tb/modules/workspace_members.py,sha256=5JdkJgfuEwbq-t6vxkBhYwgsiTDxF790wsa6Xfif9nk,8608
71
71
  tinybird/tb/modules/agent/__init__.py,sha256=i3oe3vDIWWPaicdCM0zs7D7BJ1W0k7th93ooskHAV00,54
72
- tinybird/tb/modules/agent/agent.py,sha256=f0j0GScN3wdLSWRrxyjqlyPf1bTHgmJm62sM3XAAzQ8,31080
72
+ tinybird/tb/modules/agent/agent.py,sha256=MjLpl2uNASKJiKH74U9HgvQk4h8gxii5u2KR1nJAXx4,31096
73
73
  tinybird/tb/modules/agent/animations.py,sha256=4WOC5_2BracttmMCrV0H91tXfWcUzQHBUaIJc5FA7tE,3490
74
74
  tinybird/tb/modules/agent/banner.py,sha256=l6cO5Fi7lbVKp-GsBP8jf3IkjOWxg2jpAt9NBCy0WR8,4085
75
75
  tinybird/tb/modules/agent/command_agent.py,sha256=NTzgb9qnuG-gDpk87VijKs1UUMukJPaJI5UiZtRWUoQ,2864
@@ -77,8 +77,8 @@ tinybird/tb/modules/agent/compactor.py,sha256=BK5AxZFhrp3xWnsRnYaleiYoIWtVNc-_m6
77
77
  tinybird/tb/modules/agent/explore_agent.py,sha256=HkzKmggfSMz7S3RSeKnZXufq-z_U0tTQJpF7JfNIaGQ,3504
78
78
  tinybird/tb/modules/agent/memory.py,sha256=vBewB_64L_wHoT4tLT6UX2uxcHwSY880QZ26F9rPqXs,3793
79
79
  tinybird/tb/modules/agent/models.py,sha256=IAxqlnHy8c2OeSnDrrSp2Mg38W9_r0GsDM87Wv-YNfM,925
80
- tinybird/tb/modules/agent/prompts.py,sha256=gIwYbfym7ydZIQQF0Xe4Nri4g-cyKlvR8UWUD8n-6QA,34934
81
- tinybird/tb/modules/agent/testing_agent.py,sha256=mjR9OJ_KzGnjCnjRxp5-sf01LSDkO4-QqknTbkZ-R-Q,2752
80
+ tinybird/tb/modules/agent/prompts.py,sha256=PZ-WymaU1Dni-jh_xk8P_DO4mRtSN7Bv7tfoZ89nzJs,35066
81
+ tinybird/tb/modules/agent/testing_agent.py,sha256=AtwtJViH7805i7djyBgDb7SSUtDyJnw0TWJu6lBFsrg,2953
82
82
  tinybird/tb/modules/agent/utils.py,sha256=U1s6_tGynArRA42GvDr5qz2acxVVKfO8NwBLMngyqSI,31788
83
83
  tinybird/tb/modules/agent/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
84
  tinybird/tb/modules/agent/tools/analyze.py,sha256=CR5LXg4fou-zYEksqnjpJ0icvxJVoKnTctoI1NRvqCM,3873
@@ -96,7 +96,7 @@ tinybird/tb/modules/agent/tools/plan.py,sha256=2KHLNkr2f1RfkbAR4mCVsv94LGosXd8-k
96
96
  tinybird/tb/modules/agent/tools/request_endpoint.py,sha256=xseEDQez2xfnPWNOoGnRmHB2KR9WLCx_q-vzS6NtaOY,3972
97
97
  tinybird/tb/modules/agent/tools/run_command.py,sha256=XjPDTTzkba9GOQBDiSTwddluyXkguVhxvXnRaC8m-Zc,1657
98
98
  tinybird/tb/modules/agent/tools/secret.py,sha256=UbF9YIW4zh5qdF7qCeMhbhsDt_2qdjjntJE1e8HSUG0,4292
99
- tinybird/tb/modules/agent/tools/test.py,sha256=CbGak_coopCTtqHoPWy-BwgLMIyEyeO34NTNkv18au4,6041
99
+ tinybird/tb/modules/agent/tools/test.py,sha256=4XuEWVHLOTSO51Z9xJ08dTjk0j3IWY_JlPtSBO5aaUs,10373
100
100
  tinybird/tb/modules/datafile/build.py,sha256=NFKBrusFLU0WJNCXePAFWiEDuTaXpwc0lHlOQWEJ43s,51117
101
101
  tinybird/tb/modules/datafile/build_common.py,sha256=2yNdxe49IMA9wNvl25NemY2Iaz8L66snjOdT64dm1is,4511
102
102
  tinybird/tb/modules/datafile/build_datasource.py,sha256=Ra8pVQBDafbFRUKlhpgohhTsRyp_ADKZJVG8Gd69idY,17227
@@ -117,8 +117,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
117
117
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
118
118
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
119
119
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
120
- tinybird-0.0.1.dev273.dist-info/METADATA,sha256=axU5LHrxl4jCoiSzp8el1blBj3BGsqYMzLqtKmXXt_0,1763
121
- tinybird-0.0.1.dev273.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
122
- tinybird-0.0.1.dev273.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
123
- tinybird-0.0.1.dev273.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
124
- tinybird-0.0.1.dev273.dist-info/RECORD,,
120
+ tinybird-0.0.1.dev275.dist-info/METADATA,sha256=94PPiZAh3Vx9P9w5zSsse5_Dr9KV22caI0t7iM0hNsE,1763
121
+ tinybird-0.0.1.dev275.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
122
+ tinybird-0.0.1.dev275.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
123
+ tinybird-0.0.1.dev275.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
124
+ tinybird-0.0.1.dev275.dist-info/RECORD,,