tinybird 0.0.1.dev147__py3-none-any.whl → 0.0.1.dev149__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/prompts.py CHANGED
@@ -401,7 +401,7 @@ Follow the instructions and generate the following response with no additional t
401
401
  def create_prompt(existing_resources: str, feedback: str = "", history: str = "") -> str:
402
402
  feedback_history = ""
403
403
  if feedback and history:
404
- feedback_history = f"""In case the <feedback> and <history> tags are present and not empty,
404
+ feedback_history = f"""In case the <feedback> and <history> tags are present and not empty,
405
405
  it means there was a previous attempt to generate the resources and the user provided feedback and history about previous responses.
406
406
  Use the following feedback and history to regenerate the response:
407
407
  Feedback to improve the response:
@@ -420,7 +420,9 @@ You are a Tinybird expert. You will be given a prompt to generate new or update
420
420
  {copy_pipe_instructions}
421
421
  {materialized_pipe_instructions}
422
422
  {connection_instructions}
423
- {connection_example}
423
+ {kafka_connection_example}
424
+ {gcs_connection_example}
425
+ {s3_connection_example}
424
426
 
425
427
  {feedback_history}
426
428
 
@@ -443,14 +445,16 @@ Use the following format to generate the response and do not wrap it in any othe
443
445
  copy_pipe_instructions=copy_pipe_instructions,
444
446
  materialized_pipe_instructions=materialized_pipe_instructions,
445
447
  connection_instructions=connection_instructions,
446
- connection_example=connection_example,
448
+ kafka_connection_example=kafka_connection_example,
449
+ gcs_connection_example=gcs_connection_example,
450
+ s3_connection_example=s3_connection_example,
447
451
  feedback_history=feedback_history,
448
452
  )
449
453
 
450
454
 
451
455
  def mock_prompt(rows: int, feedback: str = "") -> str:
452
456
  if feedback:
453
- feedback = f"""In case the <feedback> tag is present and not empty,
457
+ feedback = f"""In case the <feedback> tag is present and not empty,
454
458
  it means there was a previous attempt to generate the resources and the system provided feedback about the previous response.
455
459
  Use the following feedback to regenerate the response:
456
460
  <feedback>{feedback}</feedback>
@@ -515,7 +519,7 @@ SCHEMA >
515
519
  `customer_id` UInt64 `json:$.customer_id`,
516
520
  `order_date` DateTime `json:$.order_date`,
517
521
  `total_amount` Float64 `json:$.total_amount`,
518
- `items` Array(String) `json:$.items[:]` // This is an array field
522
+ `items` Array(String) `json:$.items[:]` // This is an array field
519
523
 
520
524
  ### Desired final output of the query:
521
525
  {{
@@ -680,19 +684,34 @@ connection_instructions = """
680
684
  - Content cannot be empty.
681
685
  - The connection names must be unique.
682
686
  - No indentation is allowed for property names
683
- - We only support kafka connections for now
687
+ - We support kafka, gcs and s3 connections for now
684
688
  </connection_file_instructions>
685
689
  """
686
690
 
687
- connection_example = """
688
- <connection_content>
691
+ kafka_connection_example = """
692
+ <kafka_connection_content>
689
693
  TYPE kafka
690
694
  KAFKA_BOOTSTRAP_SERVERS {{ tb_secret("PRODUCTION_KAFKA_SERVERS", "localhost:9092") }}
691
695
  KAFKA_SECURITY_PROTOCOL SASL_SSL
692
696
  KAFKA_SASL_MECHANISM PLAIN
693
697
  KAFKA_KEY {{ tb_secret("PRODUCTION_KAFKA_USERNAME", "") }}
694
698
  KAFKA_SECRET {{ tb_secret("PRODUCTION_KAFKA_PASSWORD", "") }}
695
- </connection_content>
699
+ </kafka_connection_content>
700
+ """
701
+
702
+ gcs_connection_example = """
703
+ <gcs_connection_content>
704
+ TYPE gcs
705
+ GCS_SERVICE_ACCOUNT_CREDENTIALS_JSON {{ tb_secret("PRODUCTION_GCS_SERVICE_ACCOUNT_CREDENTIALS_JSON", "") }}
706
+ </gcs_connection_content>
707
+ """
708
+
709
+ s3_connection_example = """
710
+ <s3_connection_content>
711
+ TYPE s3
712
+ S3_REGION {{ tb_secret("PRODUCTION_S3_REGION", "") }}
713
+ S3_ARN {{ tb_secret("PRODUCTION_S3_ARN", "") }}
714
+ </s3_connection_content>
696
715
  """
697
716
 
698
717
  datasource_instructions = """
@@ -703,6 +722,7 @@ datasource_instructions = """
703
722
  - Use MergeTree engine by default.
704
723
  - Use AggregatingMergeTree engine when the datasource is the target of a materialized pipe.
705
724
  - Use always json paths to define the schema. Example: `user_id` String `json:$.user_id`,
725
+ - If the datasource is using an S3 or GCS connection, they need to set IMPORT_CONNECTION_NAME, IMPORT_BUCKET_URI and IMPORT_SCHEDULE (GCS @on-demand only, S3 supports @auto too)
706
726
  </datasource_file_instructions>
707
727
  """
708
728
 
@@ -775,7 +795,7 @@ sql_instructions = """
775
795
  {{%if not defined(end_date)%}}
776
796
  AND now()
777
797
  {{%else%}}
778
- AND {{{{DateTime(end_date)}}}}
798
+ AND {{{{DateTime(end_date)}}}}
779
799
  {{%end%}}
780
800
  </valid_condition_without_now>
781
801
  - Parameters must not be quoted.
@@ -862,7 +882,9 @@ Follow these instructions when creating or updating .pipe files:
862
882
  {copy_pipe_instructions}
863
883
  {materialized_pipe_instructions}
864
884
  {connection_instructions}
865
- {connection_example}
885
+ {kafka_connection_example}
886
+ {gcs_connection_example}
887
+ {s3_connection_example}
866
888
  </pipe_file_instructions>
867
889
  <test_file_instructions>
868
890
  Follow these instructions when creating or updating .yaml files for tests:
@@ -884,7 +906,9 @@ Follow these instructions when evolving a datasource schema:
884
906
  test_instructions=test_instructions,
885
907
  deployment_instructions=deployment_instructions,
886
908
  connection_instructions=connection_instructions,
887
- connection_example=connection_example,
909
+ kafka_connection_example=kafka_connection_example,
910
+ gcs_connection_example=gcs_connection_example,
911
+ s3_connection_example=s3_connection_example,
888
912
  )
889
913
 
890
914
 
@@ -950,7 +974,7 @@ SCHEMA >
950
974
  `payload` String `json:$.payload`
951
975
 
952
976
  FORWARD_QUERY >
953
- select timestamp, toUUID(session_id) as session_id, action, version, payload
977
+ select timestamp, toUUID(session_id) as session_id, action, version, payload
954
978
  </forward_query_example>
955
979
  </deployment_instruction>
956
980
  """
@@ -968,7 +992,7 @@ Current README.md file:
968
992
  - If it is not present in the current readme, generate a new ## Tinybird section with the following content:
969
993
  - ### Overview section:
970
994
  - Explaining the purpose of the project.
971
- - ### Data sources section:
995
+ - ### Data sources section:
972
996
  - Explaining the purpose of each datasource.
973
997
  - Add a snippet of how to ingest data into each datasource like the following (where the payload example matches the datasource schema respecting non-nullable types):
974
998
  curl -X POST "{host}/v0/events?name=events" \
tinybird/tb/__cli__.py CHANGED
@@ -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__ = '0.0.1.dev147'
8
- __revision__ = 'c9f089b'
7
+ __version__ = '0.0.1.dev149'
8
+ __revision__ = '2838b1f'
@@ -317,13 +317,13 @@ def __unpatch_click_output():
317
317
 
318
318
 
319
319
  async def create_ctx_client(ctx: Context, config: Dict[str, Any], cloud: bool, staging: bool):
320
- commands_without_ctx_client = ["auth", "check", "local", "login", "logout", "update", "upgrade"]
320
+ commands_without_ctx_client = ["auth", "check", "local", "login", "logout", "update", "upgrade", "create"]
321
321
  command = ctx.invoked_subcommand
322
322
  if command in commands_without_ctx_client:
323
323
  return None
324
324
 
325
325
  commands_always_cloud = ["pull", "infra"]
326
- commands_always_local = ["build", "test", "dev", "create"]
326
+ commands_always_local = ["build", "test", "dev"]
327
327
  if (cloud or command in commands_always_cloud) and command not in commands_always_local:
328
328
  click.echo(
329
329
  FeedbackManager.gray(message=f"Running against Tinybird Cloud: Workspace {config.get('name', 'default')}")
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import re
3
3
  from pathlib import Path
4
- from typing import Optional, Tuple
4
+ from typing import Any, Dict, Optional, Tuple
5
5
 
6
6
  import click
7
7
 
@@ -16,6 +16,7 @@ from tinybird.tb.modules.exceptions import CLICreateException
16
16
  from tinybird.tb.modules.feedback_manager import FeedbackManager
17
17
  from tinybird.tb.modules.llm import LLM
18
18
  from tinybird.tb.modules.llm_utils import extract_xml, parse_xml
19
+ from tinybird.tb.modules.local_common import get_tinybird_local_client
19
20
  from tinybird.tb.modules.project import Project
20
21
 
21
22
 
@@ -24,13 +25,13 @@ from tinybird.tb.modules.project import Project
24
25
  "--data",
25
26
  type=click.Path(exists=True),
26
27
  default=None,
27
- help="Initial data to be used to create the project",
28
+ help="Initial data to be used to create the project. Tinybird Local and authentication are required.",
28
29
  )
29
30
  @click.option(
30
31
  "--prompt",
31
32
  type=str,
32
33
  default=None,
33
- help="Prompt to be used to create the project",
34
+ help="Prompt to be used to create the project. Tinybird Local and authentication are required.",
34
35
  )
35
36
  @click.option("--rows", type=int, default=10, help="Number of events to send")
36
37
  @click.option("--folder", type=str, default=None, help="Folder to create the project in")
@@ -41,7 +42,6 @@ async def create(
41
42
  ctx: click.Context, data: Optional[str], prompt: Optional[str], rows: int, folder: Optional[str], agent: str
42
43
  ) -> None:
43
44
  """Initialize a new project."""
44
- local_client: TinyB = ctx.ensure_object(dict)["client"]
45
45
  project: Project = ctx.ensure_object(dict)["project"]
46
46
  config = CLIConfig.get_project_config()
47
47
  ctx_config = ctx.ensure_object(dict)["config"]
@@ -83,9 +83,7 @@ async def create(
83
83
 
84
84
  if data or (prompt and user_token):
85
85
  click.echo(FeedbackManager.highlight(message="\n» Creating resources..."))
86
- result, created_something = await create_resources(
87
- local_client, tb_client, user_token, data, prompt, folder
88
- )
86
+ result, created_something = await create_resources(tb_client, user_token, data, prompt, folder, ctx_config)
89
87
  click.echo(FeedbackManager.success(message="✓ Done!\n"))
90
88
  if prompt:
91
89
  readme_path = Path(root_folder) / "README.md"
@@ -146,7 +144,7 @@ async def create(
146
144
  response = llm.ask(system_prompt=mock_prompt(rows), prompt=prompt)
147
145
  sql = extract_xml(response, "sql")
148
146
  sql = sql.split("FORMAT")[0]
149
- query_result = await local_client.query(f"{sql} FORMAT JSON")
147
+ query_result = await tb_client.query(f"{sql} FORMAT JSON")
150
148
  data = query_result.get("data", [])
151
149
  if data:
152
150
  persist_fixture(datasource_name, data, folder, format="ndjson")
@@ -202,17 +200,18 @@ def create_project_structure(folder: str):
202
200
 
203
201
 
204
202
  async def create_resources(
205
- local_client: TinyB,
206
203
  tb_client: TinyB,
207
204
  user_token: Optional[str],
208
205
  data: Optional[str],
209
206
  prompt: Optional[str],
210
207
  folder: str,
208
+ config: Dict[str, Any],
211
209
  ) -> Tuple[str, bool]:
212
210
  result = ""
213
211
  created_any_resource = False
214
212
  folder_path = Path(folder)
215
213
  if data:
214
+ local_client = await get_tinybird_local_client(config)
216
215
  path = folder_path / data
217
216
  format = path.suffix.lstrip(".")
218
217
  await _generate_datafile(str(path), local_client, format=format, force=True)
@@ -241,6 +240,11 @@ TYPE ENDPOINT
241
240
  pipes_paths = [
242
241
  Path(folder) / "endpoints" / f for f in os.listdir(Path(folder) / "endpoints") if f.endswith(".pipe")
243
242
  ]
243
+ connections_paths = [
244
+ Path(folder) / "connections" / f
245
+ for f in os.listdir(Path(folder) / "connections")
246
+ if f.endswith(".connection")
247
+ ]
244
248
  resources_xml = "\n".join(
245
249
  [
246
250
  f"<resource><type>{resource_type}</type><name>{resource_name}</name><content>{resource_content}</content></resource>"
@@ -255,6 +259,14 @@ TYPE ENDPOINT
255
259
  )
256
260
  for pipe in pipes_paths
257
261
  ]
262
+ + [
263
+ (
264
+ "connection",
265
+ conn.stem,
266
+ conn.read_text(),
267
+ )
268
+ for conn in connections_paths
269
+ ]
258
270
  ]
259
271
  )
260
272
  llm = LLM(user_token=user_token, host=tb_client.host)
@@ -846,6 +846,15 @@ def _parse_table_structure(schema: str) -> List[Dict[str, Any]]:
846
846
  lineno=line,
847
847
  pos=pos,
848
848
  )
849
+ if detected_type in ("Int", "UInt"):
850
+ t = detected_type
851
+ raise SchemaSyntaxError(
852
+ message=f"Precision is mandatory for {t} types",
853
+ hint=f"Hint: use one of {t}8, {t}16, {t}32, {t}64, {t}128, {t}256",
854
+ lineno=line,
855
+ pos=pos - len(t),
856
+ )
857
+
849
858
  try:
850
859
  # Imported in the body to be compatible with the CLI
851
860
  from chtoolset.query import check_compatible_types
@@ -19,6 +19,82 @@ from tinybird.tb.modules.feedback_manager import FeedbackManager
19
19
  from tinybird.tb.modules.project import Project
20
20
 
21
21
 
22
+ def download_github_contents(api_url: str, target_dir: Path) -> None:
23
+ """
24
+ Recursively downloads contents from GitHub API URL to target directory.
25
+
26
+ Args:
27
+ api_url: str - GitHub API URL to fetch contents from
28
+ target_dir: Path - Directory to save downloaded files to
29
+ """
30
+ response = requests.get(api_url)
31
+ if response.status_code != 200:
32
+ click.echo(
33
+ FeedbackManager.error(message=f"Failed to fetch contents from GitHub: {response.json().get('message', '')}")
34
+ )
35
+ return
36
+
37
+ contents = response.json()
38
+ if not isinstance(contents, list):
39
+ click.echo(FeedbackManager.error(message="Invalid response from GitHub API"))
40
+ return
41
+
42
+ for item in contents:
43
+ item_path = target_dir / item["name"]
44
+
45
+ if item["type"] == "dir":
46
+ # Create directory and recursively download its contents
47
+ item_path.mkdir(parents=True, exist_ok=True)
48
+ download_github_contents(item["url"], item_path)
49
+ elif item["type"] == "file":
50
+ # Download file
51
+ file_response = requests.get(item["download_url"])
52
+ if file_response.status_code == 200:
53
+ item_path.write_bytes(file_response.content)
54
+ click.echo(FeedbackManager.info(message=f"Downloaded {item['path']}"))
55
+ else:
56
+ click.echo(FeedbackManager.warning(message=f"Failed to download {item['path']}"))
57
+
58
+
59
+ def download_github_template(url: str) -> Optional[Path]:
60
+ """
61
+ Downloads a template from a GitHub URL and returns the path to the downloaded files.
62
+
63
+ Args:
64
+ url: str - GitHub URL in the format https://github.com/owner/repo/tree/branch/path
65
+
66
+ Returns:
67
+ Optional[Path] - Path to the downloaded template or None if download fails
68
+ """
69
+ # Parse GitHub URL components
70
+ # From: https://github.com/owner/repo/tree/branch/path
71
+ # To: api.github.com/repos/owner/repo/contents/path?ref=branch
72
+ parts = url.replace("https://github.com/", "").split("/")
73
+ if len(parts) < 5 or "tree" not in parts:
74
+ click.echo(
75
+ FeedbackManager.error(
76
+ message="Invalid GitHub URL format. Expected: https://github.com/owner/repo/tree/branch/path"
77
+ )
78
+ )
79
+ return None
80
+
81
+ owner = parts[0]
82
+ repo = parts[1]
83
+ branch = parts[parts.index("tree") + 1]
84
+ path = "/".join(parts[parts.index("tree") + 2 :])
85
+
86
+ api_url = f"https://api.github.com/repos/{owner}/{repo}/contents/{path}?ref={branch}"
87
+
88
+ # Create temporary directory for template
89
+
90
+ dir = Path(".")
91
+
92
+ # Recursively download all files
93
+ download_github_contents(api_url, dir)
94
+
95
+ return dir
96
+
97
+
22
98
  # TODO(eclbg): This should eventually end up in client.py, but we're not using it here yet.
23
99
  def api_fetch(url: str, headers: dict) -> dict:
24
100
  r = requests.get(url, headers=headers)
@@ -215,14 +291,19 @@ def deployment_group() -> None:
215
291
  default=False,
216
292
  help="Allow removing datasources. Disabled by default.",
217
293
  )
294
+ @click.option(
295
+ "--template",
296
+ default=None,
297
+ help="URL of the template to use for the deployment. Example: https://github.com/tinybirdco/web-analytics-starter-kit/tree/main/tinybird",
298
+ )
218
299
  @click.pass_context
219
300
  def deployment_create(
220
- ctx: click.Context, wait: bool, auto: bool, check: bool, allow_destructive_operations: bool
301
+ ctx: click.Context, wait: bool, auto: bool, check: bool, allow_destructive_operations: bool, template: Optional[str]
221
302
  ) -> None:
222
303
  """
223
304
  Validate and deploy the project server side.
224
305
  """
225
- create_deployment(ctx, wait, auto, check, allow_destructive_operations)
306
+ create_deployment_cmd(ctx, wait, auto, check, allow_destructive_operations, template)
226
307
 
227
308
 
228
309
  @deployment_group.command(name="ls")
@@ -330,11 +411,38 @@ def deployment_discard(ctx: click.Context, wait: bool) -> None:
330
411
  default=False,
331
412
  help="Allow removing datasources. Disabled by default.",
332
413
  )
414
+ @click.option(
415
+ "--template",
416
+ default=None,
417
+ help="URL of the template to use for the deployment. Example: https://github.com/tinybirdco/web-analytics-starter-kit/tree/main/tinybird",
418
+ )
333
419
  @click.pass_context
334
- def deploy(ctx: click.Context, wait: bool, auto: bool, check: bool, allow_destructive_operations: bool) -> None:
420
+ def deploy(
421
+ ctx: click.Context, wait: bool, auto: bool, check: bool, allow_destructive_operations: bool, template: Optional[str]
422
+ ) -> None:
335
423
  """
336
424
  Deploy the project.
337
425
  """
426
+ create_deployment_cmd(ctx, wait, auto, check, allow_destructive_operations, template)
427
+
428
+
429
+ def create_deployment_cmd(
430
+ ctx: click.Context,
431
+ wait: bool,
432
+ auto: bool,
433
+ check: Optional[bool] = None,
434
+ allow_destructive_operations: Optional[bool] = None,
435
+ template: Optional[str] = None,
436
+ ) -> None:
437
+ if template:
438
+ click.echo(FeedbackManager.info(message="» Downloading template..."))
439
+ try:
440
+ download_github_template(template)
441
+ except Exception as e:
442
+ click.echo(FeedbackManager.error(message=f"Error downloading template: {str(e)}"))
443
+ sys_exit("deployment_error", f"Failed to download template {template}")
444
+ click.echo(FeedbackManager.success(message="Template downloaded successfully"))
445
+
338
446
  create_deployment(ctx, wait, auto, check, allow_destructive_operations)
339
447
 
340
448
 
@@ -15,10 +15,14 @@ def branch(args) -> None:
15
15
  """
16
16
  `tb branch` is deprecated. You should rely on your version control system to manage branches.
17
17
  """
18
- click.echo(FeedbackManager.warning(
19
- message="This command is deprecated. You should rely on your version control system to manage branches."
20
- ))
21
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
18
+ click.echo(
19
+ FeedbackManager.warning(
20
+ message="This command is deprecated. You should rely on your version control system to manage branches."
21
+ )
22
+ )
23
+ click.echo(
24
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
25
+ )
22
26
 
23
27
 
24
28
  @cli.command(
@@ -32,10 +36,10 @@ def check(args) -> None:
32
36
  """
33
37
  `tb check` is deprecated.
34
38
  """
35
- click.echo(FeedbackManager.warning(
36
- message="This command is deprecated."
37
- ))
38
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
39
+ click.echo(FeedbackManager.warning(message="This command is deprecated."))
40
+ click.echo(
41
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
42
+ )
39
43
 
40
44
 
41
45
  @cli.command(
@@ -49,10 +53,10 @@ def diff(args) -> None:
49
53
  """
50
54
  `tb diff` is deprecated.
51
55
  """
52
- click.echo(FeedbackManager.warning(
53
- message="This command is deprecated."
54
- ))
55
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
56
+ click.echo(FeedbackManager.warning(message="This command is deprecated."))
57
+ click.echo(
58
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
59
+ )
56
60
 
57
61
 
58
62
  @cli.command(
@@ -66,10 +70,10 @@ def fmt(args) -> None:
66
70
  """
67
71
  `tb fmt` is deprecated.
68
72
  """
69
- click.echo(FeedbackManager.warning(
70
- message="This command is deprecated."
71
- ))
72
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
73
+ click.echo(FeedbackManager.warning(message="This command is deprecated."))
74
+ click.echo(
75
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
76
+ )
73
77
 
74
78
 
75
79
  @cli.command(
@@ -83,11 +87,10 @@ def init(args) -> None:
83
87
  """
84
88
  `tb init` is deprecated. Use `tb create` instead.
85
89
  """
86
- click.echo(FeedbackManager.warning(
87
- message="This command is deprecated. Use `tb create` instead."
88
- ))
89
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
90
-
90
+ click.echo(FeedbackManager.warning(message="This command is deprecated. Use `tb create` instead."))
91
+ click.echo(
92
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
93
+ )
91
94
 
92
95
 
93
96
  @cli.command(
@@ -101,11 +104,10 @@ def push(args) -> None:
101
104
  """
102
105
  `tb push` is deprecated. Use `tb deploy` instead.
103
106
  """
104
- click.echo(FeedbackManager.warning(
105
- message="This command is deprecated. Use `tb deploy` instead."
106
- ))
107
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
108
-
107
+ click.echo(FeedbackManager.warning(message="This command is deprecated. Use `tb deploy` instead."))
108
+ click.echo(
109
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
110
+ )
109
111
 
110
112
 
111
113
  @cli.command(
@@ -119,9 +121,7 @@ def tag(args) -> None:
119
121
  """
120
122
  `tb tag` is deprecated
121
123
  """
122
- click.echo(FeedbackManager.warning(
123
- message="This command is deprecated."
124
- ))
125
- click.echo("You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward")
126
-
127
-
124
+ click.echo(FeedbackManager.warning(message="This command is deprecated."))
125
+ click.echo(
126
+ "You are using Tinybird Forward CLI.\nYou can find more information in the docs at https://www.tinybird.co/docs/forward"
127
+ )
@@ -508,7 +508,7 @@ Ready? """
508
508
  STEP 1: AWS AUTHENTICATION
509
509
  ──────────────────────────────────────────────────────────────
510
510
 
511
- Please log into your \033]8;;https://console.aws.amazon.com/\033\\AWS Console\033]8;;\033\\. We'll guide you through creating the necessary permissions.
511
+ Please log into your AWS Console. We'll guide you through creating the necessary permissions: https://console.aws.amazon.com/
512
512
 
513
513
  You'll be creating a single IAM Policy and Roles (you will need one per environment, Local and Cloud) to access your S3 data. Using IAM Roles improves security by providing temporary credentials and following least privilege principles.""")
514
514
 
@@ -518,7 +518,7 @@ You'll be creating a single IAM Policy and Roles (you will need one per environm
518
518
  STEP 2: CREATE IAM POLICY
519
519
  ──────────────────────────────────────────────────────────────
520
520
 
521
- 1. Go to \033]8;;https://console.aws.amazon.com/iamv2/home?region={aws_region}#/policies/create\033\\AWS IAM > Create Policy\033]8;;\033\\
521
+ 1. Go to AWS IAM > Create Policy: https://console.aws.amazon.com/iamv2/home?region={aws_region}#/policies/create
522
522
  2. Select the JSON tab
523
523
  3. Paste the following policy (already copied to clipboard):
524
524
 
@@ -536,7 +536,7 @@ STEP 2: CREATE IAM POLICY
536
536
  STEP 2: CREATE IAM POLICY
537
537
  ──────────────────────────────────────────────────────────────
538
538
 
539
- 1. Go to \033]8;;https://console.aws.amazon.com/iamv2/home?region={aws_region}#/policies/create\033\\AWS IAM > Create Policy\033]8;;\033\\
539
+ 1. Go to AWS IAM > Create Policy: https://console.aws.amazon.com/iamv2/home?region={aws_region}#/policies/create
540
540
  2. Select the JSON tab
541
541
  3. Copy and paste the following policy (replace <bucket> with your bucket name):
542
542
 
@@ -553,7 +553,7 @@ STEP 2: CREATE IAM POLICY
553
553
  STEP {step}: CREATE IAM ROLE FOR {environment} ENVIRONMENT
554
554
  ──────────────────────────────────────────────────────────────
555
555
 
556
- 1. Go to \033]8;;https://console.aws.amazon.com/iamv2/home?region={aws_region}#/roles/create\033\\AWS IAM > Create Role\033]8;;\033\\
556
+ 1. Go to AWS IAM > Create Role: https://console.aws.amazon.com/iamv2/home?region={aws_region}#/roles/create
557
557
  2. Choose "Custom trust policy" and paste the following (already copied to clipboard):
558
558
 
559
559
  {trust_policy}
@@ -576,7 +576,7 @@ Please enter the ARN of the role you just created"""
576
576
  STEP {step}: CREATE IAM ROLE FOR {environment} ENVIRONMENT
577
577
  ──────────────────────────────────────────────────────────────
578
578
 
579
- 1. Go to \033]8;;https://console.aws.amazon.com/iamv2/home?region={aws_region}#/roles/create\033\\AWS IAM > Create Role\033]8;;\033\\
579
+ 1. Go to AWS IAM > Create Role: https://console.aws.amazon.com/iamv2/home?region={aws_region}#/roles/create
580
580
  2. Choose "Custom trust policy" and paste the following:
581
581
 
582
582
  {trust_policy}
@@ -594,7 +594,7 @@ Please enter the ARN of the role you just created"""
594
594
 
595
595
  • File created at: {connection_path}
596
596
  • You can now use this connection in your Data Sources with: IMPORT_CONNECTION_NAME '{connection_name}'
597
- \033]8;;https://www.tinybird.co/docs/forward/get-data-in/connectors/s3\033\\Learn more about our S3 Connector\033]8;;\033\\
597
+ Learn more about our S3 Connector: https://www.tinybird.co/docs/forward/get-data-in/connectors/s3
598
598
  """)
599
599
 
600
600
  # S3 IAM Role Connection Messages
@@ -608,7 +608,7 @@ Please enter the ARN of the role you just created"""
608
608
  STEP 1: GCP AUTHENTICATION
609
609
  ──────────────────────────────────────────────────────────────
610
610
 
611
- Please log into your \033]8;;https://console.cloud.google.com/\033\\GCP Console\033]8;;\033\\. We'll guide you through creating the necessary permissions.
611
+ Please log into your GCP Console. We'll guide you through creating the necessary permissions: https://console.cloud.google.com/
612
612
 
613
613
  You'll be creating a Google Service Account and you will grant it access to you GCS data. Using Google Service Accounts is the Google recommended solution for this use case.""")
614
614
 
@@ -618,10 +618,10 @@ You'll be creating a Google Service Account and you will grant it access to you
618
618
  STEP 2: CREATE GCP SERVICE ACCOUNT
619
619
  ──────────────────────────────────────────────────────────────
620
620
 
621
- 1. Go to \033]8;https://console.cloud.google.com/iam-admin/serviceaccounts/create\033\\IAM & Admin > Service Accounts > + Create Service Account\033]8;;\033\\
621
+ 1. Go to IAM & Admin > Service Accounts > + Create Service Account: https://console.cloud.google.com/iam-admin/serviceaccounts/create
622
622
  2. Provide a service account name. Name the service account something meaningful (e.g., TinybirdGCS-{environment}-svc-account)
623
623
  3. Click "Create and continue"
624
- 4. Click the "Select a role" drop down menu and select "Storage Object Viewer" (You can add IAM condition to provide access to selected buckets. More info in \033]8;;https://www.tinybird.co/docs/forward/get-data-in/connectors/gcs\033\\IAM Conditions\033]8;;\033\\)
624
+ 4. Click the "Select a role" drop down menu and select "Storage Object Viewer" (You can add IAM condition to provide access to selected buckets. More info in IAM Conditions: https://www.tinybird.co/docs/forward/get-data-in/connectors/gcs)
625
625
  5. Click "Done"
626
626
  """
627
627
  )
@@ -644,7 +644,7 @@ STEP 3: ADD KEY TO SERVICE ACCOUNT
644
644
 
645
645
  • File created at: {connection_path}
646
646
  • You can now use this connection in your Data Sources with: IMPORT_CONNECTION_NAME '{connection_name}'
647
- \033]8;;https://www.tinybird.co/docs/forward/get-data-in/connectors/s3\033\\Learn more about our GCS Connector\033]8;;\033\\
647
+ Learn more about our GCS Connector: https://www.tinybird.co/docs/forward/get-data-in/connectors/gcs
648
648
  """)
649
649
 
650
650
  prompt_init_git_release_pull = prompt_message(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev147
3
+ Version: 0.0.1.dev149
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -3,7 +3,7 @@ tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
3
3
  tinybird/datatypes.py,sha256=r4WCvspmrXTJHiPjjyOTiZyZl31FO3Ynkwq4LQsYm6E,11059
4
4
  tinybird/feedback_manager.py,sha256=a_ZhFX2zcB7vRknIcmHKMdQbb0c7TqlTBQ_5hPuWh88,69267
5
5
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
6
- tinybird/prompts.py,sha256=6J-dE0gOSOaIwdEwJUhEQS1Ztllz_qZnpnrv-tDoJWA,35511
6
+ tinybird/prompts.py,sha256=yLXzHB7_P0zjriIvI9UsfnIRwmcwLSEA1tcJMzYJqjw,36456
7
7
  tinybird/sql.py,sha256=C_B81wwv3BsqyXGhF5oTk9DcTUkrp7NwIFqSzd3Dmjc,47854
8
8
  tinybird/sql_template.py,sha256=mK0yeRFctbXTAu0VNMjIzoFBJoh9PoniAVgEatA5SG4,99832
9
9
  tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
@@ -12,7 +12,7 @@ tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
12
12
  tinybird/tornado_template.py,sha256=jjNVDMnkYFWXflmT8KU_Ssbo5vR8KQq3EJMk5vYgXRw,41959
13
13
  tinybird/ch_utils/constants.py,sha256=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj0,3890
14
14
  tinybird/ch_utils/engine.py,sha256=BZuPM7MFS7vaEKK5tOMR2bwSAgJudPrJt27uVEwZmTY,40512
15
- tinybird/tb/__cli__.py,sha256=y5e2Tv-AjplQMyc8awKNZamGGJ7WtoK-0TMjVOUziXs,252
15
+ tinybird/tb/__cli__.py,sha256=2G-RDbE_4TcARe_SbLxYFGFpjAsTqiJonlzf8czYWCI,252
16
16
  tinybird/tb/check_pypi.py,sha256=rW4QmDRbtgKdUUwJCnBkVjmTjZSZGN-XgZhx7vMkC0w,1009
17
17
  tinybird/tb/cli.py,sha256=uPV6pvi4aYVfaiGs0DQO-eoi1g9dHlrgvhutkXkdJko,1075
18
18
  tinybird/tb/client.py,sha256=aaPKq5C77e72kR7IMv9WrvnvNki8mKMOTi9EsCp0eUc,55962
@@ -20,18 +20,18 @@ tinybird/tb/config.py,sha256=jT9xndpeCY_g0HdB5qE2EquC0TFRRnkPnQFWZWd04jo,3998
20
20
  tinybird/tb/modules/auth.py,sha256=_OeYnmTH83lnqCgQEdS6K0bx1KBUeRmZk2M7JnRmWpk,9037
21
21
  tinybird/tb/modules/build.py,sha256=5SX59ssq0KaRrgzk21KmYUnB6xOdQ_O59n7rxFBQQ1Y,17393
22
22
  tinybird/tb/modules/cicd.py,sha256=Cn1DyE28w2maQgIJF4IjZU7J7ULPvMG11DjN2OH-cqE,7161
23
- tinybird/tb/modules/cli.py,sha256=V8fC0GLt5HWtOTk6TOZM5xUAY9PoH05kyJxE6Zu4MT4,14075
23
+ tinybird/tb/modules/cli.py,sha256=uXGkK0lrbUMzLRtRuE77khwl0nmfnE6TQuuQFVy8Ug0,14075
24
24
  tinybird/tb/modules/common.py,sha256=WzF_zRtAl3FKqbzK6yi_IjeeGIjQNu6SKnP-PX-o3Kk,85196
25
25
  tinybird/tb/modules/config.py,sha256=ziqW_t_mRVvWOd85VoB4vKyvgMkEfpXDf9H4v38p2xc,11422
26
26
  tinybird/tb/modules/connection.py,sha256=7oOR7x4PhBcm1ETFFCH2YJ_3oeGXjAbmx1cnZX9_L70,9014
27
27
  tinybird/tb/modules/copy.py,sha256=2Mm4FWKehOG7CoOhiF1m9UZJgJn0W1_cMolqju8ONYg,5805
28
- tinybird/tb/modules/create.py,sha256=VMX8b5ukgQm0VDUbBX91TsIsxqQid2UXRwlKekQp3M4,16792
28
+ tinybird/tb/modules/create.py,sha256=H06HmD-4CCYVMvM6doUvvKF3wU_6bBjefkwXW4ZVhE8,17378
29
29
  tinybird/tb/modules/datasource.py,sha256=V314rkpdVxVMjsp5qcSCTqDlmp4Vu--qM07BoWh-aqs,17783
30
- tinybird/tb/modules/deployment.py,sha256=M3NPFQXIEsDh9-J-pzPLuHF9k4SIZVvgUnHp05KOf-E,20448
31
- tinybird/tb/modules/deprecations.py,sha256=vDf9RgCM8FoSGrFMJLMdNhfvmtMw5t30W-fsOJq3FzI,3607
30
+ tinybird/tb/modules/deployment.py,sha256=T0lwhAT8FwZZcRnA-JDMfPUrj5MOXcQ8blxYIK2igbc,24363
31
+ tinybird/tb/modules/deprecations.py,sha256=kugrWKWLnUL0qHXghObmzEvNIPs5F5O-kTXtYHjaSrI,3632
32
32
  tinybird/tb/modules/endpoint.py,sha256=XySDt3pk66vxOZ0egUfz4bY8bEk3BjOXkv-L0OIJ3sc,12083
33
33
  tinybird/tb/modules/exceptions.py,sha256=5jK91w1LPmtqIUfDpHe_Op5OxGz8-p1BPgtLREMIni0,5217
34
- tinybird/tb/modules/feedback_manager.py,sha256=NjnSVKkxoEkfR1TEhLaQAxKAX7wDZvVp3c32XkXftTE,77707
34
+ tinybird/tb/modules/feedback_manager.py,sha256=NoflMdTcUs6JF2IUZS8TatItxWDNCfwaIJnKtbY8e3w,77447
35
35
  tinybird/tb/modules/infra.py,sha256=fve30Gj3mG9zbquGxS2e4ipcOYOxviWQCpNFfEzJN_Q,33195
36
36
  tinybird/tb/modules/job.py,sha256=n4dSSBgnA8NqD7srGahf2xRj6wxkmX9Vl0J-QJ_a2w0,2966
37
37
  tinybird/tb/modules/llm.py,sha256=KfsCYmKeW1VQz0iDZhGKCRkQv_Y3kTHh6JuxvofOguE,1076
@@ -59,7 +59,7 @@ tinybird/tb/modules/datafile/build.py,sha256=d_h3pRFDPFrDKGhpFx2iejY25GuB2k8yfNo
59
59
  tinybird/tb/modules/datafile/build_common.py,sha256=LU24kAQmxDJIyoIapDaYG-SU3P4FrMG9UBf8m9PgVSI,4565
60
60
  tinybird/tb/modules/datafile/build_datasource.py,sha256=nXEQ0qHdq2ai7jJTv8H2d7eeDPBYzLn8VY7zMtOYb8M,17382
61
61
  tinybird/tb/modules/datafile/build_pipe.py,sha256=6Cwjf3BKEF3-oQ9PipsQfK-Z43nSwtA4qJAUoysI7Uc,11385
62
- tinybird/tb/modules/datafile/common.py,sha256=NIqXpsj7u8uaeSKcUZM-85Kxg35pd08DVAdbVuHmvTU,89400
62
+ tinybird/tb/modules/datafile/common.py,sha256=1xM8R2NVmk8uQpU910Iqp_YGM1SHYoXaLZgjBYIJl54,89771
63
63
  tinybird/tb/modules/datafile/diff.py,sha256=MTmj53RYjER4neLgWVjabn-FKVFgh8h8uYiBo55lFQg,6757
64
64
  tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
65
65
  tinybird/tb/modules/datafile/fixture.py,sha256=DrRWivcvo_1rn7LlVUnHcXccdgx9yVj63mzBkUwCzk8,1420
@@ -79,8 +79,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
79
79
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
80
80
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
81
81
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
82
- tinybird-0.0.1.dev147.dist-info/METADATA,sha256=-TJHZrxsIFnBCl47t7WdjGLoOHyNmH0Mz2zwbTR8tV4,1612
83
- tinybird-0.0.1.dev147.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
84
- tinybird-0.0.1.dev147.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
85
- tinybird-0.0.1.dev147.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
86
- tinybird-0.0.1.dev147.dist-info/RECORD,,
82
+ tinybird-0.0.1.dev149.dist-info/METADATA,sha256=pdkjsJVql6s7oNV86BGCBFOVxFzX3VDviMMeFmiq9cI,1612
83
+ tinybird-0.0.1.dev149.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
84
+ tinybird-0.0.1.dev149.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
85
+ tinybird-0.0.1.dev149.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
86
+ tinybird-0.0.1.dev149.dist-info/RECORD,,