tinybird 0.0.1.dev273__py3-none-any.whl → 0.0.1.dev274__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.

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.dev274'
8
+ __revision__ = 'c3d62b9'
@@ -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}"
@@ -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.dev274
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
6
6
  Author: Tinybird
@@ -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=Ua6pj01kXp3GMMZoliQZuqwIh1eCDW2n3F6DKULSfMk,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
@@ -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.dev274.dist-info/METADATA,sha256=AQKOg2W-tA_h-i8h1vfz2fzxThxcaz-LKFJmBB-KJXU,1763
121
+ tinybird-0.0.1.dev274.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
122
+ tinybird-0.0.1.dev274.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
123
+ tinybird-0.0.1.dev274.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
124
+ tinybird-0.0.1.dev274.dist-info/RECORD,,