tinybird 0.0.1.dev303__py3-none-any.whl → 0.0.1.dev304__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/sql_template.py CHANGED
@@ -384,14 +384,13 @@ def array_type(types):
384
384
  if isinstance(x, Placeholder):
385
385
  if default:
386
386
  x = default
387
- else:
388
- if _type and _type in types:
389
- if _type == "String":
390
- x = ""
391
- else:
392
- x = ",".join(map(str, [types[_type](x) for _ in range(2)]))
393
- else:
387
+ elif _type and _type in types:
388
+ if _type == "String":
394
389
  x = ""
390
+ else:
391
+ x = ",".join(map(str, [types[_type](x) for _ in range(2)]))
392
+ else:
393
+ x = ""
395
394
  elif x is None:
396
395
  x = default
397
396
  if x is None:
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.dev303'
8
- __revision__ = 'ff545f6'
7
+ __version__ = '0.0.1.dev304'
8
+ __revision__ = '9a414a1'
@@ -54,20 +54,20 @@ def display_banner():
54
54
  """Convert RGB values to ANSI escape code"""
55
55
  if use_truecolor:
56
56
  return f"\033[38;2;{r};{g};{b}m"
57
- else:
58
- # Convert to 8-bit color (256 color palette)
59
- # Simple approximation: map RGB to 216-color cube + grayscale
60
- if r == g == b:
61
- # Grayscale
62
- gray = int(r / 255 * 23) + 232
63
- return f"\033[38;5;{gray}m"
64
- else:
65
- # Color cube (6x6x6)
66
- r_idx = int(r / 255 * 5)
67
- g_idx = int(g / 255 * 5)
68
- b_idx = int(b / 255 * 5)
69
- color_idx = 16 + (36 * r_idx) + (6 * g_idx) + b_idx
70
- return f"\033[38;5;{color_idx}m"
57
+
58
+ # Convert to 8-bit color (256 color palette)
59
+ # Simple approximation: map RGB to 216-color cube + grayscale
60
+ if r == g == b:
61
+ # Grayscale
62
+ gray = int(r / 255 * 23) + 232
63
+ return f"\033[38;5;{gray}m"
64
+
65
+ # Color cube (6x6x6)
66
+ r_idx = int(r / 255 * 5)
67
+ g_idx = int(g / 255 * 5)
68
+ b_idx = int(b / 255 * 5)
69
+ color_idx = 16 + (36 * r_idx) + (6 * g_idx) + b_idx
70
+ return f"\033[38;5;{color_idx}m"
71
71
 
72
72
  # Define solid color (corresponding to #27f795)
73
73
  solid_color = [39, 247, 149] # #27f795 in RGB
@@ -125,23 +125,20 @@ def execute_query(
125
125
 
126
126
  if not result["data"]:
127
127
  click.echo(FeedbackManager.info_no_rows())
128
+ elif script:
129
+ try:
130
+ # Execute the LLM-generated plotext script
131
+ chart_output = _execute_plotext_script(script, result["data"], result["meta"])
132
+ click.echo(chart_output)
133
+ except Exception as script_error:
134
+ click.echo(FeedbackManager.error(message=f"There was an error rendering the chart.\n{script_error}"))
135
+ ctx.deps.thinking_animation.start()
136
+ return f"After executing the query: {query}, there was an error rendering the chart: {script_error}. Fix the script and render the chart again."
128
137
  else:
129
- if script:
130
- try:
131
- # Execute the LLM-generated plotext script
132
- chart_output = _execute_plotext_script(script, result["data"], result["meta"])
133
- click.echo(chart_output)
134
- except Exception as script_error:
135
- click.echo(
136
- FeedbackManager.error(message=f"There was an error rendering the chart.\n{script_error}")
137
- )
138
- ctx.deps.thinking_animation.start()
139
- return f"After executing the query: {query}, there was an error rendering the chart: {script_error}. Fix the script and render the chart again."
140
- else:
141
- echo_safe_humanfriendly_tables_format_pretty_table(
142
- data=[d.values() for d in result["data"]], column_names=result["data"][0].keys()
143
- )
144
- click.echo("Showing first 10 results\n")
138
+ echo_safe_humanfriendly_tables_format_pretty_table(
139
+ data=[d.values() for d in result["data"]], column_names=result["data"][0].keys()
140
+ )
141
+ click.echo("Showing first 10 results\n")
145
142
 
146
143
  ctx.deps.thinking_animation.start()
147
144
  display_format = "chart" if script else "table"
@@ -580,59 +580,50 @@ def create_terminal_box(content: str, new_content: Optional[str] = None, title:
580
580
  else:
581
581
  line_num_str = f"{line_num:>4}"
582
582
 
583
- if diff_marker:
584
- if COLORAMA_AVAILABLE:
585
- if diff_marker == "-":
586
- # Fill the entire content area with red background
587
- content_with_bg = f"{Back.RED}{diff_marker} {content}{Style.RESET_ALL}"
588
- # Calculate padding needed for the content area
589
- content_area_width = available_width - 9 # 9 is reduced prefix length
590
- content_padding = content_area_width - len(f"{diff_marker} {content}")
591
- if content_padding > 0:
592
- content_with_bg = (
593
- f"{Back.RED}{diff_marker} {content}{' ' * content_padding}{Style.RESET_ALL}"
594
- )
595
- line = f"{vertical} {line_num_str} {content_with_bg}"
596
- elif diff_marker == "+":
597
- # Fill the entire content area with green background
598
- content_with_bg = f"{Back.GREEN}{diff_marker} {content}{Style.RESET_ALL}"
599
- # Calculate padding needed for the content area
600
- content_area_width = available_width - 9 # 9 is reduced prefix length
601
- content_padding = content_area_width - len(f"{diff_marker} {content}")
602
- if content_padding > 0:
603
- content_with_bg = (
604
- f"{Back.GREEN}{diff_marker} {content}{' ' * content_padding}{Style.RESET_ALL}"
605
- )
606
- line = f"{vertical} {line_num_str} {content_with_bg}"
607
- else:
608
- line = f"{vertical} {line_num:>4} {diff_marker} {content}"
609
- else:
610
- line = f"{vertical} {line_num_str} {content}"
611
- else:
612
- # Continuation line without number - fill background starting from where symbol would be
613
- if diff_marker and COLORAMA_AVAILABLE:
583
+ if diff_marker:
584
+ if COLORAMA_AVAILABLE:
614
585
  if diff_marker == "-":
615
- # Calculate how much space we need to fill with background
586
+ # Fill the entire content area with red background
587
+ content_with_bg = f"{Back.RED}{diff_marker} {content}{Style.RESET_ALL}"
588
+ # Calculate padding needed for the content area
616
589
  content_area_width = available_width - 9 # 9 is reduced prefix length
617
- content_padding = content_area_width - len(
618
- content
619
- ) # Don't subtract spaces, they're in the background
590
+ content_padding = content_area_width - len(f"{diff_marker} {content}")
620
591
  if content_padding > 0:
621
- line = f"{vertical} {Back.RED} {content}{' ' * content_padding}{Style.RESET_ALL}"
622
- else:
623
- line = f"{vertical} {Back.RED} {content}{Style.RESET_ALL}"
592
+ content_with_bg = f"{Back.RED}{diff_marker} {content}{' ' * content_padding}{Style.RESET_ALL}"
593
+ line = f"{vertical} {line_num_str} {content_with_bg}"
624
594
  elif diff_marker == "+":
625
- # Calculate how much space we need to fill with background
595
+ # Fill the entire content area with green background
596
+ content_with_bg = f"{Back.GREEN}{diff_marker} {content}{Style.RESET_ALL}"
597
+ # Calculate padding needed for the content area
626
598
  content_area_width = available_width - 9 # 9 is reduced prefix length
627
- content_padding = content_area_width - len(
628
- content
629
- ) # Don't subtract spaces, they're in the background
599
+ content_padding = content_area_width - len(f"{diff_marker} {content}")
630
600
  if content_padding > 0:
631
- line = f"{vertical} {Back.GREEN} {content}{' ' * content_padding}{Style.RESET_ALL}"
632
- else:
633
- line = f"{vertical} {Back.GREEN} {content}{Style.RESET_ALL}"
601
+ content_with_bg = (
602
+ f"{Back.GREEN}{diff_marker} {content}{' ' * content_padding}{Style.RESET_ALL}"
603
+ )
604
+ line = f"{vertical} {line_num_str} {content_with_bg}"
634
605
  else:
635
- line = f"{vertical} {content}"
606
+ line = f"{vertical} {line_num:>4} {diff_marker} {content}"
607
+ elif diff_marker and COLORAMA_AVAILABLE:
608
+ # Continuation line without number - fill background starting from where symbol would be
609
+ if diff_marker == "-":
610
+ # Calculate how much space we need to fill with background
611
+ content_area_width = available_width - 9 # 9 is reduced prefix length
612
+ content_padding = content_area_width - len(content) # Don't subtract spaces, they're in the background
613
+ if content_padding > 0:
614
+ line = f"{vertical} {Back.RED} {content}{' ' * content_padding}{Style.RESET_ALL}"
615
+ else:
616
+ line = f"{vertical} {Back.RED} {content}{Style.RESET_ALL}"
617
+ elif diff_marker == "+":
618
+ # Calculate how much space we need to fill with background
619
+ content_area_width = available_width - 9 # 9 is reduced prefix length
620
+ content_padding = content_area_width - len(content) # Don't subtract spaces, they're in the background
621
+ if content_padding > 0:
622
+ line = f"{vertical} {Back.GREEN} {content}{' ' * content_padding}{Style.RESET_ALL}"
623
+ else:
624
+ line = f"{vertical} {Back.GREEN} {content}{Style.RESET_ALL}"
625
+ else:
626
+ line = f"{vertical} {content}"
636
627
 
637
628
  # Pad to terminal width
638
629
  # Need to account for ANSI escape sequences not taking visual space
@@ -102,12 +102,12 @@ def process(
102
102
  build_status.error = build_error
103
103
  build_status.building = False
104
104
  return build_error
105
- else:
106
- if not silent:
107
- if build_result == False: # noqa: E712
108
- click.echo(FeedbackManager.info(message="No changes. Build skipped."))
109
- else:
110
- click.echo(FeedbackManager.success(message=f"\n✓ {rebuild_str} completed in {elapsed_time:.1f}s"))
105
+
106
+ if not silent:
107
+ if build_result == False: # noqa: E712
108
+ click.echo(FeedbackManager.info(message="No changes. Build skipped."))
109
+ else:
110
+ click.echo(FeedbackManager.success(message=f"\n✓ {rebuild_str} completed in {elapsed_time:.1f}s"))
111
111
 
112
112
  return None
113
113
 
@@ -280,17 +280,16 @@ def build_project(
280
280
  )
281
281
  if no_changes:
282
282
  return False
283
- else:
284
- if not silent:
285
- echo_changes(project, new_datasources, ".datasource", "created")
286
- echo_changes(project, changed_datasources, ".datasource", "changed")
287
- echo_changes(project, deleted_datasources, ".datasource", "deleted")
288
- echo_changes(project, new_pipes, ".pipe", "created")
289
- echo_changes(project, changed_pipes, ".pipe", "changed")
290
- echo_changes(project, deleted_pipes, ".pipe", "deleted")
291
- echo_changes(project, new_connections, ".connection", "created")
292
- echo_changes(project, changed_connections, ".connection", "changed")
293
- echo_changes(project, deleted_connections, ".connection", "deleted")
283
+ if not silent:
284
+ echo_changes(project, new_datasources, ".datasource", "created")
285
+ echo_changes(project, changed_datasources, ".datasource", "changed")
286
+ echo_changes(project, deleted_datasources, ".datasource", "deleted")
287
+ echo_changes(project, new_pipes, ".pipe", "created")
288
+ echo_changes(project, changed_pipes, ".pipe", "changed")
289
+ echo_changes(project, deleted_pipes, ".pipe", "deleted")
290
+ echo_changes(project, new_connections, ".connection", "created")
291
+ echo_changes(project, changed_connections, ".connection", "changed")
292
+ echo_changes(project, deleted_connections, ".connection", "deleted")
294
293
  if load_fixtures:
295
294
  try:
296
295
  for filename in project_files:
@@ -116,11 +116,10 @@ def cli(
116
116
  # We need to unpatch for our tests not to break
117
117
  if output != "human":
118
118
  __hide_click_output()
119
+ elif show_tokens or not cloud or ctx.invoked_subcommand == "build":
120
+ __unpatch_click_output()
119
121
  else:
120
- if show_tokens or not cloud or ctx.invoked_subcommand == "build":
121
- __unpatch_click_output()
122
- else:
123
- __patch_click_output()
122
+ __patch_click_output()
124
123
 
125
124
  if getenv_bool("TB_DISABLE_SSL_CHECKS", False):
126
125
  click.echo(FeedbackManager.warning_disabled_ssl_checks())
@@ -2197,18 +2197,17 @@ def ask_for_organization(
2197
2197
  user_token = get_user_token(config, user_token)
2198
2198
  organization = create_organization_and_add_workspaces(config, organization_name, user_token)
2199
2199
  organization_id = organization.get("id")
2200
+ elif len(organizations) == 1:
2201
+ organization_name = organizations[0]["name"]
2202
+ organization_id = organizations[0]["id"]
2200
2203
  else:
2201
- if len(organizations) == 1:
2202
- organization_name = organizations[0]["name"]
2203
- organization_id = organizations[0]["id"]
2204
+ sorted_organizations = sort_organizations_by_user(organizations, user_email=user_email)
2205
+ current_organization = ask_for_organization_interactively(sorted_organizations)
2206
+ if current_organization:
2207
+ organization_id = current_organization.get("id")
2208
+ organization_name = current_organization.get("name")
2204
2209
  else:
2205
- sorted_organizations = sort_organizations_by_user(organizations, user_email=user_email)
2206
- current_organization = ask_for_organization_interactively(sorted_organizations)
2207
- if current_organization:
2208
- organization_id = current_organization.get("id")
2209
- organization_name = current_organization.get("name")
2210
- else:
2211
- return None, None
2210
+ return None, None
2212
2211
  return organization_id, organization_name
2213
2212
 
2214
2213
 
@@ -128,41 +128,33 @@ def folder_build(
128
128
  filename = to_run[name]["filename"]
129
129
  filename = filename.replace(f"{folder}/", "")
130
130
  click.echo(FeedbackManager.info(message=f"✓ {filename}"))
131
- else:
132
- if raise_on_exists:
133
- raise AlreadyExistsException(
134
- FeedbackManager.warning_name_already_exists(
135
- name=name if to_run[name]["version"] is None else f"{name}__v{to_run[name]['version']}"
136
- )
131
+ elif raise_on_exists:
132
+ raise AlreadyExistsException(
133
+ FeedbackManager.warning_name_already_exists(
134
+ name=name if to_run[name]["version"] is None else f"{name}__v{to_run[name]['version']}"
137
135
  )
136
+ )
137
+ elif name_matches_existing_resource(resource, name, tb_client):
138
+ if resource == "pipes":
139
+ click.echo(FeedbackManager.error_pipe_cannot_be_pushed(name=name))
138
140
  else:
139
- if name_matches_existing_resource(resource, name, tb_client):
140
- if resource == "pipes":
141
- click.echo(FeedbackManager.error_pipe_cannot_be_pushed(name=name))
142
- else:
143
- click.echo(FeedbackManager.error_datasource_cannot_be_pushed(name=name))
144
- else:
145
- click.echo(
146
- FeedbackManager.warning_name_already_exists(
147
- name=(
148
- name
149
- if to_run[name]["version"] is None
150
- else f"{name}__v{to_run[name]['version']}"
151
- )
152
- )
153
- )
154
- else:
155
- if should_push_file(name, remote_resource_names, force, run_tests):
156
- extension = "pipe" if resource == "pipes" else "datasource"
157
- click.echo(FeedbackManager.info_building_resource(name=f"{name}.{extension}", version=""))
141
+ click.echo(FeedbackManager.error_datasource_cannot_be_pushed(name=name))
158
142
  else:
159
- if name_matches_existing_resource(resource, name, tb_client):
160
- if resource == "pipes":
161
- click.echo(FeedbackManager.warning_pipe_cannot_be_pushed(name=name))
162
- else:
163
- click.echo(FeedbackManager.warning_datasource_cannot_be_pushed(name=name))
164
- else:
165
- click.echo(FeedbackManager.warning_dry_name_already_exists(name=name))
143
+ click.echo(
144
+ FeedbackManager.warning_name_already_exists(
145
+ name=(name if to_run[name]["version"] is None else f"{name}__v{to_run[name]['version']}")
146
+ )
147
+ )
148
+ elif should_push_file(name, remote_resource_names, force, run_tests):
149
+ extension = "pipe" if resource == "pipes" else "datasource"
150
+ click.echo(FeedbackManager.info_building_resource(name=f"{name}.{extension}", version=""))
151
+ elif name_matches_existing_resource(resource, name, tb_client):
152
+ if resource == "pipes":
153
+ click.echo(FeedbackManager.warning_pipe_cannot_be_pushed(name=name))
154
+ else:
155
+ click.echo(FeedbackManager.warning_datasource_cannot_be_pushed(name=name))
156
+ else:
157
+ click.echo(FeedbackManager.warning_dry_name_already_exists(name=name))
166
158
 
167
159
  def push_files(
168
160
  dependency_graph: GraphDependencies,
@@ -932,11 +924,8 @@ def process_file(
932
924
  raise click.ClickException(FeedbackManager.error_missing_table_arn(datasource=datasource["name"]))
933
925
  if not params.get("import_export_bucket", None):
934
926
  raise click.ClickException(FeedbackManager.error_missing_export_bucket(datasource=datasource["name"]))
935
- else:
936
- if not params.get("import_external_datasource", None):
937
- raise click.ClickException(
938
- FeedbackManager.error_missing_external_datasource(datasource=datasource["name"])
939
- )
927
+ elif not params.get("import_external_datasource", None):
928
+ raise click.ClickException(FeedbackManager.error_missing_external_datasource(datasource=datasource["name"]))
940
929
 
941
930
  return params
942
931
 
@@ -301,32 +301,28 @@ def new_ds(
301
301
  if alter_response and make_changes:
302
302
  # alter operation finished
303
303
  pass
304
+ elif (
305
+ os.getenv("TB_I_KNOW_WHAT_I_AM_DOING")
306
+ and click.prompt(FeedbackManager.info_ask_for_datasource_confirmation()) == ds_name
307
+ ): # TODO move to CLI
308
+ try:
309
+ client.datasource_delete(ds_name)
310
+ click.echo(FeedbackManager.success_delete_datasource(datasource=ds_name))
311
+ except Exception:
312
+ raise click.ClickException(FeedbackManager.error_removing_datasource(datasource=ds_name))
313
+ return
314
+ elif alter_error_message:
315
+ raise click.ClickException(
316
+ FeedbackManager.error_datasource_already_exists_and_alter_failed(
317
+ datasource=ds_name, alter_error_message=alter_error_message
318
+ )
319
+ )
320
+ elif promote_error_message:
321
+ raise click.ClickException(
322
+ FeedbackManager.error_promoting_datasource(datasource=ds_name, error=promote_error_message)
323
+ )
304
324
  else:
305
- # removed replacing by default. When a datasource is removed data is
306
- # removed and all the references needs to be updated
307
- if (
308
- os.getenv("TB_I_KNOW_WHAT_I_AM_DOING")
309
- and click.prompt(FeedbackManager.info_ask_for_datasource_confirmation()) == ds_name
310
- ): # TODO move to CLI
311
- try:
312
- client.datasource_delete(ds_name)
313
- click.echo(FeedbackManager.success_delete_datasource(datasource=ds_name))
314
- except Exception:
315
- raise click.ClickException(FeedbackManager.error_removing_datasource(datasource=ds_name))
316
- return
317
- else:
318
- if alter_error_message:
319
- raise click.ClickException(
320
- FeedbackManager.error_datasource_already_exists_and_alter_failed(
321
- datasource=ds_name, alter_error_message=alter_error_message
322
- )
323
- )
324
- if promote_error_message:
325
- raise click.ClickException(
326
- FeedbackManager.error_promoting_datasource(datasource=ds_name, error=promote_error_message)
327
- )
328
- else:
329
- click.echo(FeedbackManager.warning_datasource_already_exists(datasource=ds_name))
325
+ click.echo(FeedbackManager.warning_datasource_already_exists(datasource=ds_name))
330
326
 
331
327
 
332
328
  def share_and_unshare_datasource(
@@ -162,7 +162,7 @@ def format_pipe(
162
162
  if "." in include_file
163
163
  else eval_var(include_file)
164
164
  )
165
- included_pipe = parse_pipe(include_file, skip_eval=skip_eval).datafile
165
+ included_pipe = parse_pipe(str(include_file), skip_eval=skip_eval).datafile
166
166
  pipe_nodes = doc.nodes.copy()
167
167
  for included_node in included_pipe.nodes.copy():
168
168
  unrolled_included_node = next(
@@ -214,41 +214,34 @@ def folder_playground(
214
214
  error=e,
215
215
  )
216
216
  raise click.ClickException(exception)
217
- else:
218
- if raise_on_exists:
219
- raise AlreadyExistsException(
220
- FeedbackManager.warning_name_already_exists(
221
- name=name if to_run[name]["version"] is None else f"{name}__v{to_run[name]['version']}"
222
- )
217
+ elif raise_on_exists:
218
+ raise AlreadyExistsException(
219
+ FeedbackManager.warning_name_already_exists(
220
+ name=name if to_run[name]["version"] is None else f"{name}__v{to_run[name]['version']}"
223
221
  )
222
+ )
223
+ elif name_matches_existing_resource(resource, name, tb_client):
224
+ if resource == "pipes":
225
+ click.echo(FeedbackManager.error_pipe_cannot_be_pushed(name=name))
224
226
  else:
225
- if name_matches_existing_resource(resource, name, tb_client):
226
- if resource == "pipes":
227
- click.echo(FeedbackManager.error_pipe_cannot_be_pushed(name=name))
228
- else:
229
- click.echo(FeedbackManager.error_datasource_cannot_be_pushed(name=name))
230
- else:
231
- click.echo(
232
- FeedbackManager.warning_name_already_exists(
233
- name=(
234
- name
235
- if to_run[name]["version"] is None
236
- else f"{name}__v{to_run[name]['version']}"
237
- )
238
- )
239
- )
240
- else:
227
+ click.echo(FeedbackManager.error_datasource_cannot_be_pushed(name=name))
228
+ else:
229
+ click.echo(
230
+ FeedbackManager.warning_name_already_exists(
231
+ name=(name if to_run[name]["version"] is None else f"{name}__v{to_run[name]['version']}")
232
+ )
233
+ )
234
+ if dry_run:
241
235
  if should_push_file(name, remote_resource_names, force, run_tests):
242
236
  extension = "pipe" if resource == "pipes" else "datasource"
243
237
  click.echo(FeedbackManager.info_building_resource(name=f"{name}.{extension}", version=""))
244
- else:
245
- if name_matches_existing_resource(resource, name, tb_client):
246
- if resource == "pipes":
247
- click.echo(FeedbackManager.warning_pipe_cannot_be_pushed(name=name))
248
- else:
249
- click.echo(FeedbackManager.warning_datasource_cannot_be_pushed(name=name))
238
+ elif name_matches_existing_resource(resource, name, tb_client):
239
+ if resource == "pipes":
240
+ click.echo(FeedbackManager.warning_pipe_cannot_be_pushed(name=name))
250
241
  else:
251
- click.echo(FeedbackManager.warning_dry_name_already_exists(name=name))
242
+ click.echo(FeedbackManager.warning_datasource_cannot_be_pushed(name=name))
243
+ else:
244
+ click.echo(FeedbackManager.warning_dry_name_already_exists(name=name))
252
245
 
253
246
  def push_files(
254
247
  dependency_graph: GraphDependencies,
@@ -793,44 +786,45 @@ def get_processed(
793
786
  dir_path=dir_path,
794
787
  embedded_datasources=embedded_ds,
795
788
  )
796
- else:
797
- if verbose:
798
- click.echo(FeedbackManager.info_processing_file(filename=filename))
789
+ continue
799
790
 
800
- if ".incl" in filename:
801
- click.echo(FeedbackManager.warning_skipping_include_file(file=filename))
791
+ if verbose:
792
+ click.echo(FeedbackManager.info_processing_file(filename=filename))
802
793
 
803
- if tb_client is None:
804
- raise ValueError("tb_client cannot be None")
794
+ if ".incl" in filename:
795
+ click.echo(FeedbackManager.warning_skipping_include_file(file=filename))
805
796
 
806
- name, warnings = process(
807
- filename=filename,
808
- tb_client=tb_client,
809
- deps=deps_list,
810
- dep_map=dep_map_dict,
811
- to_run=to_run_dict,
812
- vendor_paths=vendor_paths,
813
- skip_connectors=skip_connectors,
814
- current_ws=current_ws,
815
- changed=changed,
816
- fork_downstream=fork_downstream,
817
- is_internal=is_internal,
818
- dir_path=dir_path,
819
- verbose=verbose,
820
- embedded_datasources=embedded_ds,
821
- )
822
- processed_set.add(name)
797
+ if tb_client is None:
798
+ raise ValueError("tb_client cannot be None")
823
799
 
824
- if verbose:
825
- if len(warnings) == 1:
826
- click.echo(FeedbackManager.warning_pipe_restricted_param(word=warnings[0]))
827
- elif len(warnings) > 1:
828
- click.echo(
829
- FeedbackManager.warning_pipe_restricted_params(
830
- words=", ".join(["'{}'".format(param) for param in warnings[:-1]]),
831
- last_word=warnings[-1],
832
- )
800
+ name, warnings = process(
801
+ filename=filename,
802
+ tb_client=tb_client,
803
+ deps=deps_list,
804
+ dep_map=dep_map_dict,
805
+ to_run=to_run_dict,
806
+ vendor_paths=vendor_paths,
807
+ skip_connectors=skip_connectors,
808
+ current_ws=current_ws,
809
+ changed=changed,
810
+ fork_downstream=fork_downstream,
811
+ is_internal=is_internal,
812
+ dir_path=dir_path,
813
+ verbose=verbose,
814
+ embedded_datasources=embedded_ds,
815
+ )
816
+ processed_set.add(name)
817
+
818
+ if verbose:
819
+ if len(warnings) == 1:
820
+ click.echo(FeedbackManager.warning_pipe_restricted_param(word=warnings[0]))
821
+ elif len(warnings) > 1:
822
+ click.echo(
823
+ FeedbackManager.warning_pipe_restricted_params(
824
+ words=", ".join(["'{}'".format(param) for param in warnings[:-1]]),
825
+ last_word=warnings[-1],
833
826
  )
827
+ )
834
828
 
835
829
 
836
830
  def build_graph(
@@ -1082,11 +1076,8 @@ def process_file(
1082
1076
  raise click.ClickException(FeedbackManager.error_missing_table_arn(datasource=datasource["name"]))
1083
1077
  if not params.get("import_export_bucket", None):
1084
1078
  raise click.ClickException(FeedbackManager.error_missing_export_bucket(datasource=datasource["name"]))
1085
- else:
1086
- if not params.get("import_external_datasource", None):
1087
- raise click.ClickException(
1088
- FeedbackManager.error_missing_external_datasource(datasource=datasource["name"])
1089
- )
1079
+ elif not params.get("import_external_datasource", None):
1080
+ raise click.ClickException(FeedbackManager.error_missing_external_datasource(datasource=datasource["name"]))
1090
1081
 
1091
1082
  return params
1092
1083
 
@@ -74,9 +74,8 @@ def folder_pull(
74
74
  if resource_to_write:
75
75
  fd.write(resource_to_write)
76
76
  return f
77
- else:
78
- if verbose:
79
- click.echo(FeedbackManager.info_skip_already_exists())
77
+ elif verbose:
78
+ click.echo(FeedbackManager.info_skip_already_exists())
80
79
  return None
81
80
  except Exception as e:
82
81
  raise click.ClickException(FeedbackManager.error_exception(error=e))
@@ -202,7 +202,7 @@ def discard_deployment(host: Optional[str], headers: dict, wait: bool) -> None:
202
202
  result = api_fetch(TINYBIRD_API_URL, headers)
203
203
 
204
204
  current_deployment = result.get("deployment")
205
- if current_deployment.get("status") == "deleted":
205
+ if current_deployment and current_deployment.get("status") == "deleted":
206
206
  click.echo(FeedbackManager.success(message="Discard process successfully completed"))
207
207
  break
208
208
  time.sleep(5)
@@ -352,6 +352,8 @@ def create_deployment(
352
352
  if not deployment:
353
353
  click.echo(FeedbackManager.error(message="Error parsing deployment from response"))
354
354
  sys_exit("deployment_error", "Error parsing deployment from response")
355
+ return
356
+
355
357
  if deployment.get("status") == "failed":
356
358
  click.echo(FeedbackManager.error(message="Deployment failed"))
357
359
  deploy_errors = deployment.get("errors")
@@ -626,12 +626,11 @@ def infra_init(
626
626
  else:
627
627
  click.echo("Failed to get diff for Kubernetes configuration:")
628
628
  click.echo(diff_result.stderr)
629
+ elif diff_result.stdout:
630
+ click.echo("\nChanges that will be applied:")
631
+ click.echo(diff_result.stdout)
629
632
  else:
630
- if diff_result.stdout:
631
- click.echo("\nChanges that will be applied:")
632
- click.echo(diff_result.stdout)
633
- else:
634
- click.echo("\nNo changes detected or resources don't exist yet.")
633
+ click.echo("\nNo changes detected or resources don't exist yet.")
635
634
 
636
635
  # Now apply the configuration
637
636
  command = f"kubectl --context {selected_context} apply -f {str(yaml_path)}"
@@ -1,9 +1,13 @@
1
+ import platform
2
+ import sys
1
3
  from typing import Optional
2
4
 
3
5
  import click
4
6
 
7
+ from tinybird.tb.config import CURRENT_VERSION
5
8
  from tinybird.tb.modules.cli import cli
6
9
  from tinybird.tb.modules.login_common import login
10
+ from tinybird.tb.modules.telemetry import add_telemetry_event
7
11
 
8
12
 
9
13
  @cli.command("login", help="Authenticate using the browser.")
@@ -37,3 +41,17 @@ from tinybird.tb.modules.login_common import login
37
41
  )
38
42
  def login_cmd(host: Optional[str], auth_host: str, workspace: str, interactive: bool, method: str):
39
43
  login(host, auth_host, workspace, interactive, method)
44
+ # we send a telemetry event manually so we have user and workspace info available
45
+ add_telemetry_event(
46
+ "system_info",
47
+ platform=platform.platform(),
48
+ system=platform.system(),
49
+ arch=platform.machine(),
50
+ processor=platform.processor(),
51
+ python_runtime=platform.python_implementation(),
52
+ python_version=platform.python_version(),
53
+ is_ci=False,
54
+ ci_product=None,
55
+ cli_version=CURRENT_VERSION,
56
+ cli_args=sys.argv[1:] if len(sys.argv) > 1 else [],
57
+ )
@@ -249,9 +249,8 @@ def open_url(url: str, *, new_tab: bool = False) -> bool:
249
249
  if new_tab:
250
250
  if wb.open_new_tab(url):
251
251
  return True
252
- else:
253
- if wb.open(url):
254
- return True
252
+ elif wb.open(url):
253
+ return True
255
254
  except webbrowser.Error:
256
255
  pass # keep going
257
256
 
@@ -284,6 +284,10 @@ def add_telemetry_sysinfo_event() -> None:
284
284
 
285
285
  cli_args = sys.argv[1:] if len(sys.argv) > 1 else []
286
286
 
287
+ # we don't track login commands because we track them explicitly
288
+ if "login" in cli_args:
289
+ return
290
+
287
291
  is_secret_command = "secret" in cli_args
288
292
  if is_secret_command:
289
293
  need_to_obfuscate = "set" in cli_args
@@ -5,7 +5,6 @@ from typing import Any, Dict, Iterable, List, Optional
5
5
  import click
6
6
  import yaml
7
7
  from humanfriendly.tables import format_smart_table
8
- from typing_extensions import override
9
8
 
10
9
  from tinybird.tb.client import TinyB
11
10
  from tinybird.tb.modules.common import CLIException
@@ -118,19 +117,6 @@ class TestResult:
118
117
  return PASS_OVER_TIME
119
118
  return PASS
120
119
 
121
- @override
122
- def __dict__(self):
123
- return {
124
- "name": self.name,
125
- "data": self.data,
126
- "elapsed_time": self.elapsed_time,
127
- "read_bytes": self.read_bytes,
128
- "max_elapsed_time": self.max_elapsed_time,
129
- "max_bytes_read": self.max_bytes_read,
130
- "error": self.error,
131
- "status": self.status.name,
132
- }
133
-
134
120
 
135
121
  @dataclass()
136
122
  class TestSummaryResults:
@@ -3,8 +3,6 @@ from collections import namedtuple
3
3
  from json import JSONEncoder
4
4
  from typing import Optional
5
5
 
6
- from typing_extensions import override
7
-
8
6
 
9
7
  class MyJSONEncoder(JSONEncoder):
10
8
  # def default(self, in_obj):
@@ -56,10 +54,6 @@ class DataUnitTest:
56
54
  def __str__(self):
57
55
  return json.dumps(dict(self), ensure_ascii=False)
58
56
 
59
- @override
60
- def __dict__(self):
61
- return dict(self)
62
-
63
57
  def __repr__(self):
64
58
  return self.__str__()
65
59
 
@@ -289,12 +289,11 @@ class Template:
289
289
  if whitespace is None:
290
290
  if loader and loader.whitespace:
291
291
  whitespace = loader.whitespace
292
- else:
292
+ elif name.endswith((".html", ".js")):
293
293
  # Whitespace defaults by filename.
294
- if name.endswith((".html", ".js")):
295
- whitespace = "single"
296
- else:
297
- whitespace = "all"
294
+ whitespace = "single"
295
+ else:
296
+ whitespace = "all"
298
297
  # Validate the whitespace setting.
299
298
  filter_whitespace(whitespace, "")
300
299
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev303
3
+ Version: 0.0.1.dev304
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
6
6
  Author: Tinybird
@@ -6,11 +6,11 @@ tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
6
6
  tinybird/prompts.py,sha256=HoDv9TxPiP8v2XoGTWYxP133dK9CEbXVv4XE5IT339c,45483
7
7
  tinybird/service_datasources.py,sha256=y36l2QYLxFEYRBEBuYCKtjkPjGu0P2a8Fz_AjOTTNM4,48914
8
8
  tinybird/sql.py,sha256=7pkwQMUVy0CH5zFgLMZyCx1BeaJSQYC05EmOb9vO3Ls,48694
9
- tinybird/sql_template.py,sha256=rNePArEmx5GemxW6GJAiNnln0NRWncGgFe0EbC8G2f4,102463
9
+ tinybird/sql_template.py,sha256=vOpIAgHoLu3D3aFwywgYHJgRmYxtrxvro8sRwYHX-tk,102415
10
10
  tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
11
11
  tinybird/sql_toolset.py,sha256=Y2_fQrbk5GSNoRncAmRS_snpV61XQbiOy4uYkeF6pr4,19767
12
12
  tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
13
- tinybird/tornado_template.py,sha256=qBZgsNruDeKa7G-lX83XLo4WccecusD4xj1rSVcBGVM,41882
13
+ tinybird/tornado_template.py,sha256=p3V4ERIWPRdtQuqkaL1NVjivaFoVXZgPJUxwVPce4nc,41850
14
14
  tinybird/ch_utils/constants.py,sha256=yTNizMzgYNBzUc2EV3moBfdrDIggOe9hiuAgWF7sv2c,4333
15
15
  tinybird/ch_utils/engine.py,sha256=4X1B-iuhdW_mxKnX_m3iCsxgP9RPVgR75g7yH1vsJ6A,40851
16
16
  tinybird/datafile/common.py,sha256=r-kfUPH1feXjYCJR-7xNNzRrA8RZ8y47KAjMgkzhaZo,105654
@@ -18,37 +18,37 @@ tinybird/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1w
18
18
  tinybird/datafile/parse_connection.py,sha256=tRyn2Rpr1TeWet5BXmMoQgaotbGdYep1qiTak_OqC5E,1825
19
19
  tinybird/datafile/parse_datasource.py,sha256=ssW8QeFSgglVFi3sDZj_HgkJiTJ2069v2JgqnH3CkDE,1825
20
20
  tinybird/datafile/parse_pipe.py,sha256=8e9LMecSQVWHC4AXf8cdxoQ1nxUR4fTObYxTctO_EXQ,3816
21
- tinybird/tb/__cli__.py,sha256=JdjKIGe5U9dES4l14SZ9sE_kRHwzvS0kj4dvt70Px1Y,247
21
+ tinybird/tb/__cli__.py,sha256=zKFXL0dY2JM1qGDKRazQWAKaCs3Ex5FQRqD_WLnFa5Q,247
22
22
  tinybird/tb/check_pypi.py,sha256=Gp0HkHHDFMSDL6nxKlOY51z7z1Uv-2LRexNTZSHHGmM,552
23
23
  tinybird/tb/cli.py,sha256=FdDFEIayjmsZEVsVSSvRiVYn_FHOVg_zWQzchnzfWho,1008
24
24
  tinybird/tb/client.py,sha256=Z27O6kXbQ1ZVi_K6qzdUJoS877nt7rqQDRckOycjNmI,53544
25
25
  tinybird/tb/config.py,sha256=XIKju3xxpo40oQ48zDtSv0vgUrBZBHSmHJi4SHksjXE,5447
26
26
  tinybird/tb/modules/build.py,sha256=q3f_CM-_yt7R24VCmQqe4yat1aPdLqmP_hW5WoqdxBg,7907
27
- tinybird/tb/modules/build_common.py,sha256=aBpumDCZ5FYfBErBa1zGbJMsxdInr68Z21K40W7-DLE,20151
27
+ tinybird/tb/modules/build_common.py,sha256=zHqnzEdJvEIlzDGEL5HqcUXInuKLqYG6hPCdB6f6PMA,20064
28
28
  tinybird/tb/modules/cicd.py,sha256=0KLKccha9IP749QvlXBmzdWv1On3mFwMY4DUcJlBxiE,7326
29
- tinybird/tb/modules/cli.py,sha256=geWO5FRlpI9Xuv-sAjfnO-jFwCvaOZ49gAkEvwi-2aY,20503
30
- tinybird/tb/modules/common.py,sha256=1OwsFHjVPDAuxFctzGjXoqhbKzc_jb1HHq96RaPcaeU,83611
29
+ tinybird/tb/modules/cli.py,sha256=dkHnD8oiB7w4YllTDOvmE71BU8wSLDEDvkquKqg4s8Y,20479
30
+ tinybird/tb/modules/common.py,sha256=UkrlPni5jh43w18FOWx3icNbjpAWbB-bgXDWOQPGh3Y,83559
31
31
  tinybird/tb/modules/config.py,sha256=gK7rgaWTDd4ZKCrNEg_Uemr26EQjqWt6TjyQKujxOws,11462
32
32
  tinybird/tb/modules/connection.py,sha256=axp8Fny1_4PSLJGN4UF6WygyRbQtM3Lbt6thxHKTxzw,17790
33
33
  tinybird/tb/modules/copy.py,sha256=dPZkcIDvxjJrlQUIvToO0vsEEEs4EYumbNV77-BzNoU,4404
34
34
  tinybird/tb/modules/create.py,sha256=j0WvO6LxuGW1ZOYVuvR1FxFls2oMmKePYNTRJMSXfuU,20135
35
35
  tinybird/tb/modules/datasource.py,sha256=O-w4qwhAIitD_SLVdxkpknckliRp_xMswdB8n8Ohxo0,42335
36
36
  tinybird/tb/modules/deployment.py,sha256=v0layOmG0IMnuXc3RT39mpGfa5M8yPlrL9F089fJFCo,15964
37
- tinybird/tb/modules/deployment_common.py,sha256=ZX27oUw7u1ld20qiXH69j7m0DImOc5nckABZ37BPAn4,20406
37
+ tinybird/tb/modules/deployment_common.py,sha256=5fAXTaK5HhmZts3fkqJ1W9d57I9fD_q3z9uyySePtJI,20453
38
38
  tinybird/tb/modules/deprecations.py,sha256=rrszC1f_JJeJ8mUxGoCxckQTJFBCR8wREf4XXXN-PRc,4507
39
39
  tinybird/tb/modules/dev_server.py,sha256=57FCKuWpErwYUYgHspYDkLWEm9F4pbvVOtMrFXX1fVU,10129
40
40
  tinybird/tb/modules/endpoint.py,sha256=ksRj6mfDb9Xv63PhTkV_uKSosgysHElqagg3RTt21Do,11958
41
41
  tinybird/tb/modules/exceptions.py,sha256=_1BHy0OixEkeF0fOCu1_1Pj8pJS4BNfUyucqCViJGTw,5958
42
42
  tinybird/tb/modules/feedback_manager.py,sha256=duigLI2UIeMzP5IOa7XUty23NRvNssm2ZAKicuun3Pg,78130
43
43
  tinybird/tb/modules/info.py,sha256=UKlazKWSE3bzEtggTwyDhmkh7WRrWURuBraR36ClbmQ,7177
44
- tinybird/tb/modules/infra.py,sha256=JE9oLIyF4bi_JBoe-BgZ5HhKp_lQgSihuSV1KIS02Qs,32709
44
+ tinybird/tb/modules/infra.py,sha256=J9Noe9aZo5Y9ZKAhqh9jnv8azfivXLLHQ2a9TeMWN9s,32673
45
45
  tinybird/tb/modules/job.py,sha256=wBsnu8UPTOha2rkLvucgmw4xYv73ubmui3eeSIF68ZM,3107
46
46
  tinybird/tb/modules/llm.py,sha256=fPBBCmM3KlCksLlgJkg4joDn6y3H5QjDzE-Pm4YNf7E,1782
47
47
  tinybird/tb/modules/llm_utils.py,sha256=nS9r4FAElJw8yXtmdYrx-rtI2zXR8qXfi1QqUDCfxvg,3469
48
48
  tinybird/tb/modules/local.py,sha256=cez8ZV7Gt9F1siz54dpgtynEw-il3Y9mNcQgEtOVvmw,6512
49
49
  tinybird/tb/modules/local_common.py,sha256=KhALzU0L3AC56vqs3peBe-dqGzw5hWkOg_CfS0skohk,18528
50
- tinybird/tb/modules/login.py,sha256=zerXZqIv15pbFk5XRt746xGcVnp01YmL_403byBf4jQ,1245
51
- tinybird/tb/modules/login_common.py,sha256=CKXD_BjivhGUmBtNbLTJwzQDr6885C72XPZjo0GLLvI,12010
50
+ tinybird/tb/modules/login.py,sha256=q2fc0dy5brwofQSNQppipS1aDcyrxHvVjZZbzIA3b4g,1916
51
+ tinybird/tb/modules/login_common.py,sha256=u1Eh1u6L7V3x8qmxVO-LnWDELHWAnXm3bvb7BNjVXF8,11990
52
52
  tinybird/tb/modules/logout.py,sha256=sniI4JNxpTrVeRCp0oGJuQ3yRerG4hH5uz6oBmjv724,1009
53
53
  tinybird/tb/modules/materialization.py,sha256=8fdbTTxFSk0Sjet3pcEk_x-cs4RGpgl6toN8vrMLXJE,5630
54
54
  tinybird/tb/modules/mock.py,sha256=zxSBvB_Bd3dhVnQUvZEhBREg0tqskzu5dQxF1YldOaw,1479
@@ -62,7 +62,7 @@ tinybird/tb/modules/secret_common.py,sha256=8mEXOdNFrTuVWu7rgZ5-C8v-rB1EAdZQUHIy
62
62
  tinybird/tb/modules/shell.py,sha256=ExOAY2SwywCc5D6X-WCbl7tAV73bYWcGAan4E6u02vI,13605
63
63
  tinybird/tb/modules/sink.py,sha256=dK2s__my0ePIUYrqBzhPSgdWN9rbpvP1G4dT7DJzz80,3865
64
64
  tinybird/tb/modules/table.py,sha256=4XrtjM-N0zfNtxVkbvLDQQazno1EPXnxTyo7llivfXk,11035
65
- tinybird/tb/modules/telemetry.py,sha256=T9gtsQffWqG_4hRBaUJPzOfMkPwz7mH-R6Bn1XRYViA,11482
65
+ tinybird/tb/modules/telemetry.py,sha256=eSpIwy-zwpva7DbAzGCBcBjHi-G6YtgISS9bPK79DZs,11595
66
66
  tinybird/tb/modules/test.py,sha256=NcpRCEDA2itnGRrkao8UNYDZlJ4d35N55OfO_UyJR_U,2229
67
67
  tinybird/tb/modules/test_common.py,sha256=7iaHMUSxWsXd98IRMkYezcTa-x1uNEUmG1T48wQenKk,11185
68
68
  tinybird/tb/modules/token.py,sha256=ZhW_o7XCr90wJRhMN6816vyo_TVfnzPXyIhrhzQ7oZ0,13807
@@ -72,7 +72,7 @@ tinybird/tb/modules/workspace_members.py,sha256=5JdkJgfuEwbq-t6vxkBhYwgsiTDxF790
72
72
  tinybird/tb/modules/agent/__init__.py,sha256=i3oe3vDIWWPaicdCM0zs7D7BJ1W0k7th93ooskHAV00,54
73
73
  tinybird/tb/modules/agent/agent.py,sha256=_PRCkFgpLCzo-5EdUphLKZ0pG8YMmBfCNFuHdTQKKO8,39057
74
74
  tinybird/tb/modules/agent/animations.py,sha256=4WOC5_2BracttmMCrV0H91tXfWcUzQHBUaIJc5FA7tE,3490
75
- tinybird/tb/modules/agent/banner.py,sha256=1_TRj9Bmzcir_pKzoto6VCsMG9laWyT7RfDsUtKMrK0,4087
75
+ tinybird/tb/modules/agent/banner.py,sha256=KNdL78nc1wyhgzgji5tHzlSr8Za7GpFhorKL5zLAbuc,3985
76
76
  tinybird/tb/modules/agent/command_agent.py,sha256=0Z08rQsir59zQAr-kkOvsKIFpIBsBSTGJJ1VgqqF5WA,3654
77
77
  tinybird/tb/modules/agent/compactor.py,sha256=BK5AxZFhrp3xWnsRnYaleiYoIWtVNc-_m650Hsopt8g,13841
78
78
  tinybird/tb/modules/agent/explore_agent.py,sha256=QVMPmX6GDW8bh65_X4yXepvAgJmNRQh1S-YwmvGHkjw,4288
@@ -82,7 +82,7 @@ tinybird/tb/modules/agent/mock_agent.py,sha256=9_w5-MJDC3vp0U5SkM-ucqhxftfpeUM4F
82
82
  tinybird/tb/modules/agent/models.py,sha256=QSTwxz_-U4_iQxXT_t3uJZRzZmIsuxVrdmV4APsr1ms,2346
83
83
  tinybird/tb/modules/agent/prompts.py,sha256=eua-QawthfG5X6Kz1dRzOZSjXU8tj0nr4k7onmvBZnk,45792
84
84
  tinybird/tb/modules/agent/testing_agent.py,sha256=AtwtJViH7805i7djyBgDb7SSUtDyJnw0TWJu6lBFsrg,2953
85
- tinybird/tb/modules/agent/utils.py,sha256=KMSqOGLTOeyUxQfXES1maROMIKle2uz88z45sFAQXAs,31947
85
+ tinybird/tb/modules/agent/utils.py,sha256=haIwgVcYNwo_Or2NtQgdbOpZxxGMXkORgqN6x72MkEA,31523
86
86
  tinybird/tb/modules/agent/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  tinybird/tb/modules/agent/tools/analyze.py,sha256=CR5LXg4fou-zYEksqnjpJ0icvxJVoKnTctoI1NRvqCM,3873
88
88
  tinybird/tb/modules/agent/tools/append.py,sha256=cF-1XYmgTXI3dfMQ_nEpOKo6duJGe2GOg64rXNnS9gw,8284
@@ -91,7 +91,7 @@ tinybird/tb/modules/agent/tools/datafile.py,sha256=kTob7G2TwCwIgwom0rERgXQ13rgPt
91
91
  tinybird/tb/modules/agent/tools/deploy.py,sha256=uIth0nvkCrI-RXrADhWdWV0iGgdoSC-ej3DzJFzNkmk,2029
92
92
  tinybird/tb/modules/agent/tools/deploy_check.py,sha256=pE3d9TPtXVKZjYbU0G6ORAGI86lN5K_4JKUriClERbM,1229
93
93
  tinybird/tb/modules/agent/tools/diff_resource.py,sha256=_9xHcDzCTKk_E1wKQbuktVqV6U9sA0kqYaBxWvtliX0,2613
94
- tinybird/tb/modules/agent/tools/execute_query.py,sha256=ie3TUs1sYv_KK5kL-1hSn9wrPVZqr6q57yBv6fG-hOs,9147
94
+ tinybird/tb/modules/agent/tools/execute_query.py,sha256=hd_1wmhhAHpZ3MU5xKSgXwYGBLE0ii7X1LBfgPWTxwI,9033
95
95
  tinybird/tb/modules/agent/tools/file.py,sha256=_strhF1bnFFui3pVGUi2dFdcKzMyYzOD59lKeSHqG7o,2855
96
96
  tinybird/tb/modules/agent/tools/get_endpoint_stats.py,sha256=r2FrXg1L1s_Llr1tPdJ6k_gu6qw7qLsAXOkbz3eTk1g,2307
97
97
  tinybird/tb/modules/agent/tools/get_openapi_definition.py,sha256=4TIMO2XzHBMhpt9zIWRfjjPZbThT8r_iPS4CVHcItE0,2904
@@ -101,28 +101,28 @@ tinybird/tb/modules/agent/tools/request_endpoint.py,sha256=bsLWrMn-ofJM3nn9vm8j_
101
101
  tinybird/tb/modules/agent/tools/run_command.py,sha256=B0jyXQW7d0vSBi7abCTlhmEsf6nvwWcVEbRpGatLFBo,2464
102
102
  tinybird/tb/modules/agent/tools/secret.py,sha256=8AGTZgHLPg1bxCA2cPMnb-zNutWEwn4emHo7kLjJC5w,4323
103
103
  tinybird/tb/modules/agent/tools/test.py,sha256=4XuEWVHLOTSO51Z9xJ08dTjk0j3IWY_JlPtSBO5aaUs,10373
104
- tinybird/tb/modules/datafile/build.py,sha256=NFKBrusFLU0WJNCXePAFWiEDuTaXpwc0lHlOQWEJ43s,51117
104
+ tinybird/tb/modules/datafile/build.py,sha256=PAqddZmDbHlfRAx2ySmtHTU8_02V1MtkfjB6M_q4lTI,50641
105
105
  tinybird/tb/modules/datafile/build_common.py,sha256=2yNdxe49IMA9wNvl25NemY2Iaz8L66snjOdT64dm1is,4511
106
- tinybird/tb/modules/datafile/build_datasource.py,sha256=Ra8pVQBDafbFRUKlhpgohhTsRyp_ADKZJVG8Gd69idY,17227
106
+ tinybird/tb/modules/datafile/build_datasource.py,sha256=-ti8bCo8-dzf7b1lzzSGNF88jyo00CotKrou9hP4AWQ,16935
107
107
  tinybird/tb/modules/datafile/build_pipe.py,sha256=-mpzYcTEdH313R-FEDYuDOtAbZ5zehynzJwmtsfy16w,11262
108
108
  tinybird/tb/modules/datafile/diff.py,sha256=bwVh15E_lio78QDUFQ4ozAEMF7rfUBm2c77JQkL33ZA,6712
109
109
  tinybird/tb/modules/datafile/fixture.py,sha256=gftYWeweeQDFK3cHgUmSOfltNjZVOuMt8v7WTMLhGBw,1579
110
110
  tinybird/tb/modules/datafile/format_common.py,sha256=5w6GX_8RDFueW9AtDfWpc1OicEu8wWdrjUBdCEidCQk,1951
111
111
  tinybird/tb/modules/datafile/format_datasource.py,sha256=X5N65vDpprFKaWaxkSwFnHaNzYIxVhG1Sya4BARTd2Q,6138
112
- tinybird/tb/modules/datafile/format_pipe.py,sha256=7KDvGDQly7KQv67pO0FS2Xi1vvgX_gt1LmC2qg4gSJ0,7374
112
+ tinybird/tb/modules/datafile/format_pipe.py,sha256=fg9odSXV5TkjX64aTPiPNSE8NhdROQa4rdT9-hr9nws,7379
113
113
  tinybird/tb/modules/datafile/pipe_checker.py,sha256=dxsCQoA6ruxg1fvF6sMLFowpjaqws8lUQcM7XyhgZPE,24609
114
- tinybird/tb/modules/datafile/playground.py,sha256=47q4XcvDhclHWYv7oFNEqmF1T5NXd9GPWkrT6Av2VhY,56343
115
- tinybird/tb/modules/datafile/pull.py,sha256=6mn3xqLxb6KQDcnqq63AaPzku9XsSOpscfcdsHyvvsY,5101
116
- tinybird/tb/modules/tinyunit/tinyunit.py,sha256=sJeBnKDHcUNn8t0sdsKB_M2w8IdzeeQ1PzJuleeQ2-E,11695
117
- tinybird/tb/modules/tinyunit/tinyunit_lib.py,sha256=hGh1ZaXC1af7rKnX7222urkj0QJMhMWclqMy59dOqwE,1922
114
+ tinybird/tb/modules/datafile/playground.py,sha256=-ZvsHeg3c_enX7GNhs-ZyRCQxoBsZb4fUHTEbnG-yLk,55805
115
+ tinybird/tb/modules/datafile/pull.py,sha256=vzJ8_rixPRyuv3x_Ah8v5iHr1cM2LUGrSX54Opg4lGI,5073
116
+ tinybird/tb/modules/tinyunit/tinyunit.py,sha256=TQHcBhZHqhRWVjvB9h-0F_ZgM_Zhwgwy4EGJ61sI1Ao,11259
117
+ tinybird/tb/modules/tinyunit/tinyunit_lib.py,sha256=NHoXcCHPDcKWYLzgP3NViho3Ey-6RV-ynPDzySPrTPE,1817
118
118
  tinybird/tb_cli_modules/cicd.py,sha256=0lMkb6CVOFZl5HOwgY8mK4T4mgI7O8335UngLXtCc-c,13851
119
119
  tinybird/tb_cli_modules/common.py,sha256=VQQjGmbbKR09TWn1lxd_ip4uykqaBcY6UoXB2MlWvgQ,82985
120
120
  tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4ewgA,11546
121
121
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
122
122
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
123
123
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
124
- tinybird-0.0.1.dev303.dist-info/METADATA,sha256=pkCbWHaIqhFLkaXhGSJ1FoqUOeIJce4T0wxS7wXiRR0,1845
125
- tinybird-0.0.1.dev303.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
126
- tinybird-0.0.1.dev303.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
127
- tinybird-0.0.1.dev303.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
128
- tinybird-0.0.1.dev303.dist-info/RECORD,,
124
+ tinybird-0.0.1.dev304.dist-info/METADATA,sha256=lhsEuveQfvJdP9vvlunpZqBKmKtSyhi4V7cy3xfe8nw,1845
125
+ tinybird-0.0.1.dev304.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
126
+ tinybird-0.0.1.dev304.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
127
+ tinybird-0.0.1.dev304.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
128
+ tinybird-0.0.1.dev304.dist-info/RECORD,,