tinybird-cli 5.8.0.dev2__tar.gz → 5.8.1.dev0__tar.gz

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.
Files changed (48) hide show
  1. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/PKG-INFO +5 -12
  2. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/__cli__.py +2 -2
  3. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/client.py +18 -0
  4. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/feedback_manager.py +14 -0
  5. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/sql_template.py +12 -3
  6. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/sql_toolset.py +1 -1
  7. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/datasource.py +62 -0
  8. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird_cli.egg-info/PKG-INFO +5 -12
  9. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/setup.cfg +0 -0
  10. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/ch_utils/constants.py +0 -0
  11. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/ch_utils/engine.py +0 -0
  12. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/check_pypi.py +0 -0
  13. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/config.py +0 -0
  14. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/connectors.py +0 -0
  15. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/context.py +0 -0
  16. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/datafile.py +0 -0
  17. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/datatypes.py +0 -0
  18. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/git_settings.py +0 -0
  19. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/sql.py +0 -0
  20. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/sql_template_fmt.py +0 -0
  21. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/syncasync.py +0 -0
  22. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli.py +0 -0
  23. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/auth.py +0 -0
  24. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/branch.py +0 -0
  25. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/cicd.py +0 -0
  26. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/cli.py +0 -0
  27. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/common.py +0 -0
  28. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/config.py +0 -0
  29. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/connection.py +0 -0
  30. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/exceptions.py +0 -0
  31. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/fmt.py +0 -0
  32. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/job.py +0 -0
  33. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/pipe.py +0 -0
  34. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/regions.py +0 -0
  35. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/tag.py +0 -0
  36. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/telemetry.py +0 -0
  37. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/test.py +0 -0
  38. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
  39. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
  40. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/token.py +0 -0
  41. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/workspace.py +0 -0
  42. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tb_cli_modules/workspace_members.py +0 -0
  43. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird/tornado_template.py +0 -0
  44. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird_cli.egg-info/SOURCES.txt +0 -0
  45. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird_cli.egg-info/dependency_links.txt +0 -0
  46. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird_cli.egg-info/entry_points.txt +0 -0
  47. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird_cli.egg-info/requires.txt +0 -0
  48. {tinybird-cli-5.8.0.dev2 → tinybird-cli-5.8.1.dev0}/tinybird_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tinybird-cli
3
- Version: 5.8.0.dev2
3
+ Version: 5.8.1.dev0
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -18,19 +18,12 @@ The Tinybird command-line tool allows you to use all the Tinybird functionality
18
18
  Changelog
19
19
  ----------
20
20
 
21
- 5.8.0.dev2
22
- ***********
21
+ 5.8.0
22
+ **********
23
23
 
24
+ - `Added` `tb datasource scheduling` commands to manage the scheduling of a Data Source
25
+ - `Added` `tb tag` commands to manage tags from the CLI.
24
26
  - `Added` support to `TAGS` in `tb fmt`.
25
-
26
- 5.8.0.dev1
27
- ***********
28
-
29
- - `Added` new `tb tag` command.
30
-
31
- 5.8.0.dev0
32
- ***********
33
-
34
27
  - `Added` support to `TAGS` in `tb pull` and `tb push`. Allows tagging resources for filtering in the UI.
35
28
 
36
29
  5.7.0
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
4
4
  __url__ = 'https://www.tinybird.co/docs/cli/introduction.html'
5
5
  __author__ = 'Tinybird'
6
6
  __author_email__ = 'support@tinybird.co'
7
- __version__ = '5.8.0.dev2'
8
- __revision__ = 'edc984c'
7
+ __version__ = '5.8.1.dev0'
8
+ __revision__ = 'cee7088'
@@ -474,6 +474,24 @@ class TinyB(object):
474
474
  async def datasource_sync(self, datasource_id: str):
475
475
  return await self._req(f"/v0/datasources/{datasource_id}/scheduling/runs", method="POST", data="")
476
476
 
477
+ async def datasource_scheduling_state(self, datasource_id: str):
478
+ response = await self._req(f"/v0/datasources/{datasource_id}/scheduling/state", method="GET")
479
+ return response["state"]
480
+
481
+ async def datasource_scheduling_pause(self, datasource_id: str):
482
+ return await self._req(
483
+ f"/v0/datasources/{datasource_id}/scheduling/state",
484
+ method="PUT",
485
+ data='{"state": "paused"}',
486
+ )
487
+
488
+ async def datasource_scheduling_resume(self, datasource_id: str):
489
+ return await self._req(
490
+ f"/v0/datasources/{datasource_id}/scheduling/state",
491
+ method="PUT",
492
+ data='{"state": "running"}',
493
+ )
494
+
477
495
  async def datasource_exchange(self, datasource_a: str, datasource_b: str):
478
496
  payload = {"datasource_a": datasource_a, "datasource_b": datasource_b}
479
497
  return await self._req("/v0/datasources/exchange", method="POST", data=payload)
@@ -157,6 +157,15 @@ class FeedbackManager:
157
157
  error_creating_copy_job = error_message("Failed creating copy job: {error}")
158
158
  error_pausing_copy_pipe = error_message("Failed pausing copy pipe: {error}")
159
159
  error_resuming_copy_pipe = error_message("Failed resuming copy pipe: {error}")
160
+ error_pausing_datasource_scheduling = error_message(
161
+ "Failed pausing scheduling for Data Source '{datasource}': {error}"
162
+ )
163
+ error_resuming_datasource_scheduling = error_message(
164
+ "Failed resuming scheduling for Data Source '{datasource}': {error}"
165
+ )
166
+ error_datasource_scheduling_state = error_message(
167
+ "Failed requesting scheduling state for Data Source '{datasource}': {error}"
168
+ )
160
169
  error_creating_pipe = error_message("Failed creating pipe {error}")
161
170
  error_creating_sink_job = error_message("Failed creating sink job: {error}")
162
171
  error_running_on_demand_sink_job = error_message("Failed running on-demand sink job: {error}")
@@ -681,6 +690,9 @@ Ready? """
681
690
  info_datasource_title = print_message("** {title}", bcolors.BOLD)
682
691
  info_datasource_row = info_message("{row}")
683
692
  info_datasource_delete_rows_job_url = info_message("** Delete rows job url {url}")
693
+ info_datasource_scheduling_state = info_message("** Scheduling state for Data Source '{datasource}': {state}")
694
+ info_datasource_scheduling_pause = info_message("** Pausing scheduling...")
695
+ info_datasource_scheduling_resume = info_message("** Resuming scheduling...")
684
696
  info_pipes = info_message("** Pipes:")
685
697
  info_pipe_name = info_message("** - {pipe}")
686
698
  info_using_node = print_message("** Using last node {node} as endpoint")
@@ -933,6 +945,8 @@ Ready? """
933
945
  success_datasource_unshared = success_message(
934
946
  "** The Data Source {datasource} has been correctly unshared from {workspace}"
935
947
  )
948
+ success_datasource_scheduling_resumed = success_message("""** Scheduling resumed for Data Source '{datasource}'""")
949
+ success_datasource_scheduling_paused = success_message("""** Scheduling paused for Data Source '{datasource}'""")
936
950
  success_connection_created = success_message("** Connection {id} created successfully!")
937
951
 
938
952
  # TODO: Update the message when the .env feature is implemented
@@ -386,14 +386,14 @@ def array_type(types): # noqa: C901
386
386
  for i, t in enumerate(list_values):
387
387
  if _type in testers:
388
388
  if testers[_type](str(t)):
389
- values.append(expression_wrapper(types[_type](t), f"{x}[{i}]"))
389
+ values.append(expression_wrapper(types[_type](t), str(t)))
390
390
  else:
391
391
  raise SQLTemplateException(
392
392
  f"Error validating {x}[{i}]({t}) to type {_type}",
393
393
  documentation="/cli/advanced-templates.html",
394
394
  )
395
395
  else:
396
- values.append(expression_wrapper(types.get(_type, lambda x: x)(t), f"{x}[{i}]"))
396
+ values.append(expression_wrapper(types.get(_type, lambda x: x)(t), str(t)))
397
397
  return Expression(f"[{','.join(map(str, values))}]")
398
398
  except AttributeError as e:
399
399
  logging.warning(f"AttributeError on Array: {e}")
@@ -1314,8 +1314,9 @@ def expression_wrapper(x, name, escape_arrays: bool = False):
1314
1314
  elif isinstance(x, Comment):
1315
1315
  return "-- {x} \n"
1316
1316
  if x is None:
1317
+ truncated_name = name[:20] + "..." if len(name) > 20 else name
1317
1318
  raise SQLTemplateException(
1318
- f'expression "{name}" evaluated to null', documentation="/cli/advanced-templates.html"
1319
+ f'expression "{truncated_name}" evaluated to null', documentation="/cli/advanced-templates.html"
1319
1320
  )
1320
1321
  if isinstance(x, list) and escape_arrays:
1321
1322
  logging.warning(f"expression_wrapper -> list :{x}:")
@@ -1992,6 +1993,14 @@ def render_sql_template(
1992
1993
  Traceback (most recent call last):
1993
1994
  ...
1994
1995
  tinybird.sql_template.SQLTemplateException: Template Syntax Error: expression "test" evaluated to null
1996
+ >>> render_sql_template("SELECT {{testisasuperlongthingandwedontwanttoreturnthefullthing}}", {'token':'testing'})
1997
+ Traceback (most recent call last):
1998
+ ...
1999
+ tinybird.sql_template.SQLTemplateException: Template Syntax Error: expression "testisasuperlongthin..." evaluated to null
2000
+ >>> render_sql_template("SELECT {{ Array(embedding, 'Float32') }}", {'token':'testing', 'embedding': '1,2,3,4, null'})
2001
+ Traceback (most recent call last):
2002
+ ...
2003
+ tinybird.sql_template.SQLTemplateException: Template Syntax Error: Error validating 1,2,3,4, null[4]( null) to type Float32
1995
2004
  >>> render_sql_template('{% if test %}SELECT 1{% else %} select 2 {% end %}')
1996
2005
  (' select 2 ', {}, [])
1997
2006
  >>> render_sql_template('{% if Int32(test, 1) %}SELECT 1{% else %} select 2 {% end %}')
@@ -293,7 +293,7 @@ def replace_tables(
293
293
  and is_invalid_resource(r, database, default_database, _replaced_with, valid_tables)
294
294
  ):
295
295
  logging.info(
296
- "Resource not found in replace_tables: %s",
296
+ "Resource not found in replace_tables in sql_toolset: %s",
297
297
  {
298
298
  "r": r,
299
299
  "default_database": default_database,
@@ -805,3 +805,65 @@ async def datasource_copy_from_main(
805
805
  if wait:
806
806
  base_msg = "Copy from Main Workspace" if sql_from_main else f"Copy from {sql}"
807
807
  await wait_job(client, job_id, job_url, f"{base_msg} to {datasource_name}")
808
+
809
+
810
+ @datasource.group(name="scheduling")
811
+ @click.pass_context
812
+ def datasource_scheduling(ctx: Context) -> None:
813
+ """Data Source scheduling commands."""
814
+
815
+
816
+ @datasource_scheduling.command(name="state")
817
+ @click.argument("datasource_name")
818
+ @click.pass_context
819
+ @coro
820
+ async def datasource_scheduling_state(ctx: Context, datasource_name: str) -> None:
821
+ """Get the scheduling state of a Data Source."""
822
+ client: TinyB = ctx.obj["client"]
823
+ try:
824
+ state = await client.datasource_scheduling_state(datasource_name)
825
+ click.echo(FeedbackManager.info_datasource_scheduling_state(datasource=datasource_name, state=state))
826
+ except Exception as e:
827
+ raise CLIDatasourceException(
828
+ FeedbackManager.error_datasource_scheduling_state(datasource=datasource_name, error=e)
829
+ )
830
+
831
+
832
+ @datasource_scheduling.command(name="pause")
833
+ @click.argument("datasource_name")
834
+ @click.pass_context
835
+ @coro
836
+ async def datasource_scheduling_pause(ctx: Context, datasource_name: str) -> None:
837
+ """Pause the scheduling of a Data Source."""
838
+
839
+ click.echo(FeedbackManager.info_datasource_scheduling_pause())
840
+ client: TinyB = ctx.ensure_object(dict)["client"]
841
+
842
+ try:
843
+ await client.datasource_scheduling_pause(datasource_name)
844
+ click.echo(FeedbackManager.success_datasource_scheduling_paused(datasource=datasource_name))
845
+
846
+ except Exception as e:
847
+ raise CLIDatasourceException(
848
+ FeedbackManager.error_pausing_datasource_scheduling(datasource=datasource_name, error=e)
849
+ )
850
+
851
+
852
+ @datasource_scheduling.command(name="resume")
853
+ @click.argument("datasource_name")
854
+ @click.pass_context
855
+ @coro
856
+ async def datasource_scheduling_resume(ctx: Context, datasource_name: str) -> None:
857
+ """Resume the scheduling of a Data Source."""
858
+
859
+ click.echo(FeedbackManager.info_datasource_scheduling_resume())
860
+ client: TinyB = ctx.ensure_object(dict)["client"]
861
+
862
+ try:
863
+ await client.datasource_scheduling_resume(datasource_name)
864
+ click.echo(FeedbackManager.success_datasource_scheduling_resumed(datasource=datasource_name))
865
+
866
+ except Exception as e:
867
+ raise CLIDatasourceException(
868
+ FeedbackManager.error_resuming_datasource_scheduling(datasource=datasource_name, error=e)
869
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tinybird-cli
3
- Version: 5.8.0.dev2
3
+ Version: 5.8.1.dev0
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -18,19 +18,12 @@ The Tinybird command-line tool allows you to use all the Tinybird functionality
18
18
  Changelog
19
19
  ----------
20
20
 
21
- 5.8.0.dev2
22
- ***********
21
+ 5.8.0
22
+ **********
23
23
 
24
+ - `Added` `tb datasource scheduling` commands to manage the scheduling of a Data Source
25
+ - `Added` `tb tag` commands to manage tags from the CLI.
24
26
  - `Added` support to `TAGS` in `tb fmt`.
25
-
26
- 5.8.0.dev1
27
- ***********
28
-
29
- - `Added` new `tb tag` command.
30
-
31
- 5.8.0.dev0
32
- ***********
33
-
34
27
  - `Added` support to `TAGS` in `tb pull` and `tb push`. Allows tagging resources for filtering in the UI.
35
28
 
36
29
  5.7.0