tinybird 0.0.1.dev68__py3-none-any.whl → 0.0.1.dev70__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.

Files changed (36) hide show
  1. tinybird/ch_utils/engine.py +2 -4
  2. tinybird/context.py +0 -1
  3. tinybird/sql_template.py +1 -3
  4. tinybird/sql_toolset.py +3 -3
  5. tinybird/tb/__cli__.py +2 -2
  6. tinybird/tb/modules/auth.py +1 -1
  7. tinybird/tb/modules/build.py +12 -1
  8. tinybird/tb/modules/cli.py +15 -6
  9. tinybird/tb/modules/common.py +9 -9
  10. tinybird/tb/modules/datafile/build_common.py +1 -1
  11. tinybird/tb/modules/datafile/build_datasource.py +1 -1
  12. tinybird/tb/modules/datafile/common.py +18 -1
  13. tinybird/tb/modules/datafile/fixture.py +7 -0
  14. tinybird/tb/modules/datafile/pipe_checker.py +1 -1
  15. tinybird/tb/modules/datasource.py +65 -2
  16. tinybird/tb/modules/deployment.py +31 -5
  17. tinybird/tb/modules/endpoint.py +1 -1
  18. tinybird/tb/modules/fmt.py +1 -1
  19. tinybird/tb/modules/materialization.py +5 -5
  20. tinybird/tb/modules/mock.py +26 -19
  21. tinybird/tb/modules/pipe.py +1 -1
  22. tinybird/tb/modules/project.py +3 -3
  23. tinybird/tb/modules/shell.py +13 -21
  24. tinybird/tb/modules/test.py +1 -1
  25. tinybird/tb/modules/token.py +4 -4
  26. tinybird/tb/modules/watch.py +1 -1
  27. tinybird/tb/modules/workspace.py +6 -6
  28. tinybird/tb/modules/workspace_members.py +6 -6
  29. tinybird/tb_cli_modules/common.py +2 -2
  30. tinybird/tornado_template.py +2 -1
  31. tinybird-0.0.1.dev70.dist-info/METADATA +73 -0
  32. {tinybird-0.0.1.dev68.dist-info → tinybird-0.0.1.dev70.dist-info}/RECORD +35 -35
  33. {tinybird-0.0.1.dev68.dist-info → tinybird-0.0.1.dev70.dist-info}/WHEEL +1 -1
  34. tinybird-0.0.1.dev68.dist-info/METADATA +0 -64
  35. {tinybird-0.0.1.dev68.dist-info → tinybird-0.0.1.dev70.dist-info}/entry_points.txt +0 -0
  36. {tinybird-0.0.1.dev68.dist-info → tinybird-0.0.1.dev70.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
1
1
  import glob
2
- import logging
3
- import os
4
2
  from pathlib import Path
5
3
 
6
4
  import click
@@ -8,9 +6,9 @@ import click
8
6
  from tinybird.client import TinyB
9
7
  from tinybird.prompts import mock_prompt
10
8
  from tinybird.tb.modules.cli import cli
11
- from tinybird.tb.modules.common import CLIException, check_user_token_with_client, coro
9
+ from tinybird.tb.modules.common import CLIException, check_user_token_with_client, coro, push_data
12
10
  from tinybird.tb.modules.config import CLIConfig
13
- from tinybird.tb.modules.datafile.fixture import persist_fixture
11
+ from tinybird.tb.modules.datafile.fixture import persist_fixture, persist_fixture_sql
14
12
  from tinybird.tb.modules.feedback_manager import FeedbackManager
15
13
  from tinybird.tb.modules.llm import LLM
16
14
  from tinybird.tb.modules.llm_utils import extract_xml
@@ -41,11 +39,11 @@ async def mock(ctx: click.Context, datasource: str, rows: int, prompt: str) -> N
41
39
  try:
42
40
  tb_client: TinyB = ctx.ensure_object(dict)["client"]
43
41
  project: Project = ctx.ensure_object(dict)["project"]
42
+ env = ctx.ensure_object(dict)["env"]
44
43
  datasource_path = Path(datasource)
45
44
  datasource_name = datasource
46
45
  folder = project.folder
47
46
  click.echo(FeedbackManager.highlight(message=f"\n» Creating fixture for {datasource_name}..."))
48
-
49
47
  if datasource_path.suffix == ".datasource":
50
48
  datasource_name = datasource_path.stem
51
49
  else:
@@ -56,14 +54,6 @@ async def mock(ctx: click.Context, datasource: str, rows: int, prompt: str) -> N
56
54
  if not datasource_path.exists():
57
55
  raise CLIException(f"Datasource '{datasource_path.stem}' not found")
58
56
 
59
- prompt_path = Path(folder) / "fixtures" / f"{datasource_name}.prompt"
60
- if not prompt or prompt == "Use the datasource schema to generate sample data":
61
- # load the prompt from the fixture.prompt file if it exists
62
- if prompt_path.exists():
63
- prompt = prompt_path.read_text()
64
- else:
65
- prompt_path.write_text(prompt)
66
-
67
57
  datasource_content = datasource_path.read_text()
68
58
  config = CLIConfig.get_project_config()
69
59
  user_client = config.get_client()
@@ -76,22 +66,39 @@ async def mock(ctx: click.Context, datasource: str, rows: int, prompt: str) -> N
76
66
  except Exception:
77
67
  click.echo(FeedbackManager.error(message="This action requires authentication. Run 'tb login' first."))
78
68
  return
69
+
79
70
  llm = LLM(user_token=user_token, host=user_client.host)
80
71
  prompt = f"<datasource_schema>{datasource_content}</datasource_schema>\n<user_input>{prompt}</user_input>"
81
72
  sql = ""
82
-
83
- click.echo(FeedbackManager.highlight(message=f"\n» Creating fixture for {datasource_name}..."))
84
73
  response = llm.ask(system_prompt=mock_prompt(rows), prompt=prompt)
85
74
  sql = extract_xml(response, "sql")
86
75
  result = await tb_client.query(f"{sql} FORMAT JSON")
87
76
  data = result.get("data", [])[:rows]
88
- persist_fixture(datasource_name, data, folder)
89
- click.echo(FeedbackManager.info(message=f"✓ /fixtures/{datasource_name}.ndjson created"))
77
+ if env == "build":
78
+ persist_fixture_sql(datasource_name, sql, folder)
79
+
80
+ fixture_path = persist_fixture(datasource_name, data, folder)
90
81
 
91
- if os.environ.get("TB_DEBUG", "") != "":
92
- logging.debug(sql)
82
+ click.echo(FeedbackManager.info(message=f" /fixtures/{datasource_name}.ndjson created"))
83
+ if env == "cloud":
84
+ await append_fixture(tb_client, datasource_name, str(fixture_path))
93
85
 
94
86
  click.echo(FeedbackManager.success(message=f"✓ Sample data for {datasource_name} created with {rows} rows"))
95
87
 
96
88
  except Exception as e:
97
89
  click.echo(FeedbackManager.error_exception(error=f"Error: {e}"))
90
+
91
+
92
+ async def append_fixture(
93
+ tb_client: TinyB,
94
+ datasource_name: str,
95
+ url: str,
96
+ ):
97
+ await push_data(
98
+ tb_client,
99
+ datasource_name,
100
+ url,
101
+ mode="append",
102
+ concurrency=1,
103
+ silent=True,
104
+ )
@@ -27,7 +27,7 @@ def pipe(ctx):
27
27
 
28
28
 
29
29
  @pipe.command(name="ls")
30
- @click.option("--match", default=None, help="Retrieve any resourcing matching the pattern. eg --match _test")
30
+ @click.option("--match", default=None, help="Retrieve any resourcing matching the pattern. For example, --match _test")
31
31
  @click.option(
32
32
  "--format",
33
33
  "format_",
@@ -40,17 +40,17 @@ class Project:
40
40
 
41
41
  def get_vendor_files(self) -> List[str]:
42
42
  vendor_files: List[str] = []
43
- for project_file in glob.glob(f"{self.vendor_path}/**/*.datasource", recursive=True):
43
+ for project_file in glob.glob(f"{self.vendor_path}/**/*.datasource", recursive=False):
44
44
  vendor_files.append(project_file)
45
45
  return vendor_files
46
46
 
47
47
  @property
48
48
  def datasources(self) -> List[str]:
49
- return sorted([Path(f).stem for f in glob.glob(f"{self.path}/**/*.datasource", recursive=True)])
49
+ return sorted([Path(f).stem for f in glob.glob(f"{self.path}/**/*.datasource", recursive=False)])
50
50
 
51
51
  @property
52
52
  def pipes(self) -> List[str]:
53
- return sorted([Path(f).stem for f in glob.glob(f"{self.path}/**/*.pipe", recursive=True)])
53
+ return sorted([Path(f).stem for f in glob.glob(f"{self.path}/**/*.pipe", recursive=False)])
54
54
 
55
55
  def get_pipe_datafile(self, filename: str) -> Optional[Datafile]:
56
56
  try:
@@ -24,10 +24,17 @@ from tinybird.tb.modules.table import format_table
24
24
  class DynamicCompleter(Completer):
25
25
  def __init__(self, project: Project):
26
26
  self.project = project
27
- self.static_commands = ["create", "mock", "test", "select"]
27
+ self.static_commands = [
28
+ "create",
29
+ "mock",
30
+ "test",
31
+ "select",
32
+ "datasource",
33
+ "pipe",
34
+ "endpoint",
35
+ "copy",
36
+ ]
28
37
  self.test_commands = ["create", "run", "update"]
29
- self.mock_flags = ["--prompt", "--rows"]
30
- self.common_rows = ["10", "50", "100", "500", "1000"]
31
38
  self.sql_keywords = ["select", "from", "where", "group by", "order by", "limit"]
32
39
 
33
40
  def get_completions(self, document, complete_event):
@@ -114,20 +121,6 @@ class DynamicCompleter(Completer):
114
121
  )
115
122
  return
116
123
 
117
- if len(words) == 3 or len(words) == 4:
118
- # After datasource or after a flag value, show available flags
119
- available_flags = [f for f in self.mock_flags if f not in words]
120
- for flag in available_flags:
121
- yield Completion(flag, start_position=0, display=flag, style="class:completion.cmd")
122
- return
123
-
124
- last_word = words[-1]
125
- if last_word == "--prompt":
126
- yield Completion('""', start_position=0, display='"Enter your prompt..."', style="class:completion.cmd")
127
- elif last_word == "--rows":
128
- for rows in self.common_rows:
129
- yield Completion(rows, start_position=0, display=rows, style="class:completion.cmd")
130
-
131
124
  def _handle_test_completions(self, words: List[str]):
132
125
  if len(words) == 1:
133
126
  for cmd in self.test_commands:
@@ -206,7 +199,6 @@ class Shell:
206
199
  self.project = project
207
200
  self.tb_client = tb_client
208
201
  self.prompt_message = "\ntb > "
209
- self.commands = ["create", "mock", "test", "tb", "select"]
210
202
  self.session: PromptSession = PromptSession(
211
203
  completer=DynamicCompleter(project),
212
204
  complete_style=CompleteStyle.COLUMN,
@@ -274,7 +266,7 @@ class Shell:
274
266
  def handle_mock(self, arg):
275
267
  if "mock" in arg.strip().lower():
276
268
  arg = arg.replace("mock", "")
277
- subprocess.run(f"tb --build mock {arg} --skip", shell=True, text=True)
269
+ subprocess.run(f"tb --build mock {arg}", shell=True, text=True)
278
270
 
279
271
  def handle_tb(self, argline):
280
272
  click.echo("")
@@ -290,7 +282,7 @@ class Shell:
290
282
  else:
291
283
  need_skip = ("mock", "test create", "create")
292
284
  if any(arg.startswith(cmd) for cmd in need_skip):
293
- argline = f"{argline} --skip"
285
+ argline = f"{argline}"
294
286
  subprocess.run(f"tb --build {argline}", shell=True, text=True)
295
287
 
296
288
  def default(self, argline):
@@ -305,7 +297,7 @@ class Shell:
305
297
  else:
306
298
  need_skip = ("mock", "test create", "create")
307
299
  if any(arg.startswith(cmd) for cmd in need_skip):
308
- argline = f"{argline} --skip"
300
+ argline = f"{argline}"
309
301
  subprocess.run(f"tb --build {argline}", shell=True, text=True)
310
302
 
311
303
  def run_sql(self, query, rows_limit=20):
@@ -207,7 +207,7 @@ async def test_update(ctx: click.Context, pipe: str) -> None:
207
207
 
208
208
  @test.command(
209
209
  name="run",
210
- help="Run the test suite, a file, or a test.",
210
+ help="Run the test suite, a file, or a test",
211
211
  )
212
212
  @click.argument("name", nargs=-1)
213
213
  @click.pass_context
@@ -24,7 +24,7 @@ def token(ctx: Context) -> None:
24
24
 
25
25
 
26
26
  @token.command(name="ls")
27
- @click.option("--match", default=None, help="Retrieve any token matching the pattern. eg --match _test")
27
+ @click.option("--match", default=None, help="Retrieve any token matching the pattern. For example, --match _test")
28
28
  @click.pass_context
29
29
  @coro
30
30
  async def token_ls(
@@ -52,7 +52,7 @@ async def token_ls(
52
52
 
53
53
  @token.command(name="rm")
54
54
  @click.argument("token_id")
55
- @click.option("--yes", is_flag=True, default=False, help="Do not ask for confirmation")
55
+ @click.option("--yes", is_flag=True, default=False, help="Don't ask for confirmation")
56
56
  @click.pass_context
57
57
  @coro
58
58
  async def token_rm(ctx: Context, token_id: str, yes: bool) -> None:
@@ -74,7 +74,7 @@ async def token_rm(ctx: Context, token_id: str, yes: bool) -> None:
74
74
 
75
75
  @token.command(name="refresh")
76
76
  @click.argument("token_id")
77
- @click.option("--yes", is_flag=True, default=False, help="Do not ask for confirmation")
77
+ @click.option("--yes", is_flag=True, default=False, help="Don't ask for confirmation")
78
78
  @click.pass_context
79
79
  @coro
80
80
  async def token_refresh(ctx: Context, token_id: str, yes: bool) -> None:
@@ -347,4 +347,4 @@ async def create_static_token(ctx, name: str):
347
347
  except Exception as e:
348
348
  raise CLITokenException(FeedbackManager.error_exception(error=e))
349
349
 
350
- click.echo("The token has been generated successfully.")
350
+ click.echo("Token has been generated successfully.")
@@ -29,7 +29,7 @@ class WatchProjectHandler(FileSystemEventHandler):
29
29
  if event.is_directory:
30
30
  return None
31
31
 
32
- valid_extensions = [".datasource", ".pipe", ".ndjson"]
32
+ valid_extensions = [".datasource", ".pipe", ".ndjson", ".sql"]
33
33
 
34
34
  if not any(event.src_path.endswith(ext) for ext in valid_extensions):
35
35
  return None
@@ -91,12 +91,12 @@ async def workspace_current():
91
91
  @click.argument("workspace_name", required=False)
92
92
  @click.option("--starter_kit", "starter_kit", type=str, required=False, help="Use a Tinybird starter kit as a template")
93
93
  @click.option("--starter-kit", "starter_kit", hidden=True)
94
- @click.option("--user_token", is_flag=False, default=None, help="When passed, we won't prompt asking for it")
94
+ @click.option("--user_token", is_flag=False, default=None, help="When passed, tb won't prompt asking for the token")
95
95
  @click.option(
96
96
  "--fork",
97
97
  is_flag=True,
98
98
  default=False,
99
- help="When enabled, we will share all datasource from the current workspace to the new created one",
99
+ help="When enabled, tb will share all data sources from the current workspace with the new one",
100
100
  )
101
101
  @click.pass_context
102
102
  @coro
@@ -123,16 +123,16 @@ async def create_workspace(
123
123
  await create_workspace_interactive(ctx, workspace_name, starter_kit, user_token, fork)
124
124
 
125
125
 
126
- @workspace.command(name="delete", short_help="Delete a Workspace for your Tinybird user")
126
+ @workspace.command(name="delete", short_help="Delete a workspace for your Tinybird user")
127
127
  @click.argument("workspace_name_or_id")
128
- @click.option("--user_token", is_flag=False, default=None, help="When passed, we won't prompt asking for it")
128
+ @click.option("--user_token", is_flag=False, default=None, help="When passed, tb won't prompt asking for the token")
129
129
  @click.option(
130
130
  "--confirm_hard_delete",
131
131
  default=None,
132
- help="Introduce the name of the workspace in order to confirm you want to run a hard delete over the workspace",
132
+ help="Enter the name of the workspace to confirm you want to run a hard delete over the workspace",
133
133
  hidden=True,
134
134
  )
135
- @click.option("--yes", is_flag=True, default=False, help="Do not ask for confirmation")
135
+ @click.option("--yes", is_flag=True, default=False, help="Don't ask for confirmation")
136
136
  @click.pass_context
137
137
  @coro
138
138
  async def delete_workspace(
@@ -60,10 +60,10 @@ def members(ctx: Context) -> None:
60
60
  """Workspace members management commands."""
61
61
 
62
62
 
63
- @members.command(name="add", short_help="Adds members to the current Workspace")
63
+ @members.command(name="add", short_help="Adds members to the current workspace")
64
64
  @click.argument("members_emails")
65
65
  @click.option("--role", is_flag=False, default=None, help="Role for the members being added", type=click.Choice(ROLES))
66
- @click.option("--user_token", is_flag=False, default=None, help="When passed, we won't prompt asking for it")
66
+ @click.option("--user_token", is_flag=False, default=None, help="When passed, tb won't prompt asking for it")
67
67
  @click.pass_context
68
68
  @coro
69
69
  async def add_members_to_workspace(
@@ -111,13 +111,13 @@ async def list_members_in_workspace(ctx: Context) -> None:
111
111
  echo_safe_humanfriendly_tables_format_smart_table(users, column_names=["email"])
112
112
 
113
113
 
114
- @members.command(name="rm", short_help="Removes members from the current Workspace")
114
+ @members.command(name="rm", short_help="Removes members from the current workspace")
115
115
  @click.argument("members_emails")
116
- @click.option("--user_token", is_flag=False, default=None, help="When passed, we won't prompt asking for it")
116
+ @click.option("--user_token", is_flag=False, default=None, help="When passed, tb won't prompt asking for it")
117
117
  @click.pass_context
118
118
  @coro
119
119
  async def remove_members_from_workspace(ctx: Context, members_emails: str, user_token: Optional[str]) -> None:
120
- """Removes members from the current Workspace."""
120
+ """Removes members from the current workspace."""
121
121
 
122
122
  cmd_ctx = await get_command_context(ctx)
123
123
 
@@ -163,7 +163,7 @@ async def remove_members_from_workspace(ctx: Context, members_emails: str, user_
163
163
  @members.command(name="set-role", short_help="Sets the role for existing workspace members")
164
164
  @click.argument("role", required=True, type=click.Choice(ROLES))
165
165
  @click.argument("members_emails", required=True, type=str)
166
- @click.option("--user_token", is_flag=False, default=None, help="When passed, we won't prompt asking for it")
166
+ @click.option("--user_token", is_flag=False, default=None, help="When passed, tb won't prompt asking for it")
167
167
  @click.pass_context
168
168
  @coro
169
169
  async def set_workspace_member_role(ctx: Context, role: str, members_emails: str, user_token: Optional[str]) -> None:
@@ -637,7 +637,7 @@ async def check_user_token(ctx: Context, token: str):
637
637
  if not is_authenticated.get("is_valid", False):
638
638
  raise CLIWorkspaceException(
639
639
  FeedbackManager.error_exception(
640
- error='Invalid token. Please, be sure you are using the "user token" instead of the "admin your@email" token.'
640
+ error='Invalid token. Make sure you are using the "user token" instead of the "admin your@email" token.'
641
641
  )
642
642
  )
643
643
  if is_authenticated.get("is_valid") and not is_authenticated.get("is_user", False):
@@ -1183,7 +1183,7 @@ async def sync_data(ctx, datasource_name: str, yes: bool):
1183
1183
  client: TinyB = ctx.obj["client"]
1184
1184
  datasource = await client.get_datasource(datasource_name)
1185
1185
 
1186
- VALID_DATASOURCES = ["bigquery", "snowflake", "s3", "gcs"]
1186
+ VALID_DATASOURCES = ["bigquery", "snowflake", "s3", "s3_iamrole", "gcs"]
1187
1187
  if datasource["type"] not in VALID_DATASOURCES:
1188
1188
  raise CLIException(FeedbackManager.error_sync_not_supported(valid_datasources=VALID_DATASOURCES))
1189
1189
 
@@ -1161,7 +1161,8 @@ def check_valid_expr(expr):
1161
1161
  elif isinstance(expr, ast.Subscript):
1162
1162
  check_valid_expr(expr.value)
1163
1163
  if isinstance(expr.slice, ast.Index):
1164
- check_valid_expr(expr.slice.value)
1164
+ # TODO: Slice does not seems to have a value attribute
1165
+ check_valid_expr(expr.slice.value) # type: ignore[attr-defined]
1165
1166
  elif isinstance(expr.slice, ast.Slice):
1166
1167
  if expr.slice.lower is not None:
1167
1168
  check_valid_expr(expr.slice.lower)
@@ -0,0 +1,73 @@
1
+ Metadata-Version: 2.2
2
+ Name: tinybird
3
+ Version: 0.0.1.dev70
4
+ Summary: Tinybird Command Line Tool
5
+ Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
+ Author: Tinybird
7
+ Author-email: support@tinybird.co
8
+ Requires-Python: >=3.9, <3.13
9
+ Description-Content-Type: text/x-rst
10
+ Requires-Dist: aiofiles==24.1.0
11
+ Requires-Dist: anthropic==0.42.0
12
+ Requires-Dist: click<8.2,>=8.1.6
13
+ Requires-Dist: clickhouse-toolset==0.33.dev0
14
+ Requires-Dist: colorama==0.4.6
15
+ Requires-Dist: cryptography~=41.0.0
16
+ Requires-Dist: croniter==1.3.8
17
+ Requires-Dist: docker==7.1.0
18
+ Requires-Dist: GitPython~=3.1.32
19
+ Requires-Dist: humanfriendly~=8.2
20
+ Requires-Dist: prompt_toolkit==3.0.48
21
+ Requires-Dist: pydantic~=2.8.0
22
+ Requires-Dist: pyperclip==1.8.2
23
+ Requires-Dist: pyyaml<6.1,>=6.0
24
+ Requires-Dist: requests<3,>=2.28.1
25
+ Requires-Dist: shandy-sqlfmt==0.11.1
26
+ Requires-Dist: shandy-sqlfmt[jinjafmt]==0.11.1
27
+ Requires-Dist: toposort==1.10
28
+ Requires-Dist: tornado~=6.0.0
29
+ Requires-Dist: urllib3<2,>=1.26.14
30
+ Requires-Dist: watchdog==6.0.0
31
+ Requires-Dist: wheel
32
+ Requires-Dist: packaging<24,>=23.1
33
+ Requires-Dist: llm>=0.19
34
+ Requires-Dist: thefuzz==0.22.1
35
+ Provides-Extra: bigquery
36
+ Requires-Dist: gsutil==4.58; extra == "bigquery"
37
+ Requires-Dist: google-api-python-client==2.0.2; extra == "bigquery"
38
+ Requires-Dist: google-auth==1.27.1; extra == "bigquery"
39
+ Requires-Dist: google-auth-httplib2==0.1.0; extra == "bigquery"
40
+ Requires-Dist: google-cloud-storage==2.4.0; extra == "bigquery"
41
+ Requires-Dist: google-cloud-bigquery==2.11.0; extra == "bigquery"
42
+ Provides-Extra: snowflake
43
+ Requires-Dist: snowflake-connector-python~=3.12.3; extra == "snowflake"
44
+ Requires-Dist: gsutil==4.58; extra == "snowflake"
45
+ Requires-Dist: google-api-python-client==2.0.2; extra == "snowflake"
46
+ Requires-Dist: google-auth==1.27.1; extra == "snowflake"
47
+ Requires-Dist: google-auth-httplib2==0.1.0; extra == "snowflake"
48
+ Requires-Dist: google-cloud-storage==2.4.0; extra == "snowflake"
49
+ Requires-Dist: oauth2client==3.0.0; extra == "snowflake"
50
+ Requires-Dist: chardet<4,>=3.0.2; extra == "snowflake"
51
+ Requires-Dist: pyOpenSSL<20.0.0,>=16.2.0; extra == "snowflake"
52
+ Dynamic: author
53
+ Dynamic: author-email
54
+ Dynamic: description
55
+ Dynamic: description-content-type
56
+ Dynamic: home-page
57
+ Dynamic: provides-extra
58
+ Dynamic: requires-dist
59
+ Dynamic: requires-python
60
+ Dynamic: summary
61
+
62
+ Tinybird CLI
63
+ =============
64
+
65
+ The Tinybird command-line tool allows you to use all the Tinybird functionality directly from the command line. Additionally, it includes several functions to create and manage data projects easily.
66
+
67
+ Changelog
68
+ ----------
69
+
70
+ 0.0.1dev1
71
+ ***********
72
+
73
+ * Initial release of the Tinybird CLI
@@ -2,80 +2,80 @@ tinybird/__cli__.py,sha256=esPl5QDTzuQgHe5FuxWLm-fURFigGGwjnYLh9GuWUw4,232
2
2
  tinybird/client.py,sha256=W5Xttnz0bzwqqVGNJJs-4Ca2AbtCMh3URuQYPJ5APsE,52013
3
3
  tinybird/config.py,sha256=cd_RH7ZjqGjpWwu0efPkhS8VxD9K6Jix4QY2W3w1Pvs,5811
4
4
  tinybird/connectors.py,sha256=7Gjms7b5MAaBFGi3xytsJurCylprONpFcYrzp4Fw2Rc,15241
5
- tinybird/context.py,sha256=A3GBApac9xO6hrAMJ1s9dMrI_ou9aKF84CdEjtPddMk,1417
5
+ tinybird/context.py,sha256=VaMhyHruH-uyMypPDfxtuo4scS18b7rxCCdeUVm6ysg,1301
6
6
  tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
7
7
  tinybird/feedback_manager.py,sha256=ADuy1yC3fCFM_ii_Haphg8Gdzapa5pX9dlRTVbuUqxs,67990
8
8
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
9
9
  tinybird/prompts.py,sha256=LQfE0ruY9A7z1iqtt6xTkW-1NlHbXl7LbKqzfdOsPxA,30612
10
10
  tinybird/sql.py,sha256=LBi74GxhNAYTb6m2-KNGpAkguSKh7rcvBbERbE7nalA,46195
11
- tinybird/sql_template.py,sha256=GmMLAI10MTqjQo9qztuQHLRWs67teozsWDxUBdvkAn4,93668
11
+ tinybird/sql_template.py,sha256=zUK-fsrvKISNsTquEFL40iD6-fMoL0RF3vxHn4PZYvw,93500
12
12
  tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
13
- tinybird/sql_toolset.py,sha256=NEUj8Ro5x9XlfVLlGr6nWt9o7OLWVxlqs6TIpgumUNs,14678
13
+ tinybird/sql_toolset.py,sha256=32SNvxRFKQYWTvYPMJ_u3ukcd1hKZyEqx8T2cv2412w,14697
14
14
  tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
15
- tinybird/tornado_template.py,sha256=FL85SMPq2dH4JqKovmSbaolGdEzwOO91NqOzqXo2Qr0,41863
15
+ tinybird/tornado_template.py,sha256=fUKIFrZLe0WyMFmV-mkjIdCSeFcZMBL3Uet4eHcids0,41960
16
16
  tinybird/ch_utils/constants.py,sha256=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj0,3890
17
- tinybird/ch_utils/engine.py,sha256=OXkBhlzGjZotjD0vaT-rFIbSGV4tpiHxE8qO_ip0SyQ,40454
18
- tinybird/tb/__cli__.py,sha256=Ccq13PAaFIf4jhPqKWAcmtpsBFgPc30-vB_7SboquMU,251
17
+ tinybird/ch_utils/engine.py,sha256=AUAww-KjGOZg9h0IBlKA3FeacJYB4rOtqcTGJhFM-g8,40392
18
+ tinybird/tb/__cli__.py,sha256=53NC2V-YpRXEwQyuGwM0-hJrMfoKVMQVHdHn44o-QYI,251
19
19
  tinybird/tb/cli.py,sha256=FD1pfbzu9YHJHEG6Vtn_EwPLTYhwqw-I6AxXeTaRHU8,926
20
- tinybird/tb/modules/auth.py,sha256=EzRWFmwRkXNhUmRaruEVFLdkbUg8xMSix0cAWl5D4Jg,9029
21
- tinybird/tb/modules/build.py,sha256=UN1d7EZ93VOlPCrtsay-KLgZnzxn2NCBDY3wvrUSP1Q,9198
20
+ tinybird/tb/modules/auth.py,sha256=vBA-KsrjAp77kFunGSM-4o7AFdfO7ac4dnrHKrx0alI,9020
21
+ tinybird/tb/modules/build.py,sha256=GIXpIAHxulB-PgJ2jeZnwIXPbL7anp3rPi5a6DxfWuQ,9674
22
22
  tinybird/tb/modules/cicd.py,sha256=xxXwy-QekJcG14kkJeGNl7LkHduhZXfvBZE8WrU6-t4,5351
23
- tinybird/tb/modules/cli.py,sha256=D5E5nUMyDzj3tkvkKZdI9LHO9EGFuA1zt4GjI7NKLk0,15921
24
- tinybird/tb/modules/common.py,sha256=QjH9rugFYKkmGNd7bPBKXjrmROoRhHUtr4MA_X6n-wA,73238
23
+ tinybird/tb/modules/cli.py,sha256=MJ4N0BUW6yhlo3zGf_N_qqBQWPyCD-aMrkI7u7azHW4,16125
24
+ tinybird/tb/modules/common.py,sha256=XZY0nWkK68vgh2Vml5JzyQuEWIyf2igq7IrAu0n94Lo,73203
25
25
  tinybird/tb/modules/config.py,sha256=mie3oMVTf5YOUFEiLs88P16U4LkJafJjSpjwyAkFHog,10979
26
26
  tinybird/tb/modules/copy.py,sha256=Aq6wh_wjRiyLQtEOKF9pKLPgJhSvbGTFWIw_LJB0t0U,5801
27
27
  tinybird/tb/modules/create.py,sha256=I01JDENOyGKK0Umd2_1Om_nFGP8Uk9vxaOw7PygK02o,12302
28
- tinybird/tb/modules/datasource.py,sha256=TQ4wSag3CCw34d54FEXPJFGLQNYyNqv2nQbU6QT9uAE,14725
29
- tinybird/tb/modules/deployment.py,sha256=pVEdRWY31E4Blu9A9nVvnRj9zA4nZujBx77dRxP1sog,15706
30
- tinybird/tb/modules/endpoint.py,sha256=7pOF4eLZ41vA5H6bKMCFZnOyKQKfdyytgwTO2Fcxtso,11907
28
+ tinybird/tb/modules/datasource.py,sha256=aOvjTVH9EdGNAw_lqhtZdJQhYnMOTGIqD3Pe4GtakFw,16905
29
+ tinybird/tb/modules/deployment.py,sha256=qGkFwPR1TGtcbqUcKkhsfzK--sNzXo6JV8Ny8HrlSfo,16873
30
+ tinybird/tb/modules/endpoint.py,sha256=zQJgJXTzMB3hPO-3Xnppi0Pv8byZunBNhbbmMgKtijE,11915
31
31
  tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
32
32
  tinybird/tb/modules/feedback_manager.py,sha256=mrw5tdYycfvg6WLXlM0KIjfJardm_aNpnJkUg2vH0cA,68463
33
- tinybird/tb/modules/fmt.py,sha256=poh6_cwVGSf-sBu6LKWuO2TANL_J8Sgm25sPpwxa3Aw,3558
33
+ tinybird/tb/modules/fmt.py,sha256=j6W0X_h88oxfFppakJgZ8ubAUwwrCGsfVjKw4gg8e5s,3551
34
34
  tinybird/tb/modules/job.py,sha256=956Pj8BEEsiD2GZsV9RKKVM3I_CveOLgS82lykO5ukk,2963
35
35
  tinybird/tb/modules/llm.py,sha256=AC0VSphTOM2t-v1_3NLvNN_FIbgMo4dTyMqIv5nniPo,835
36
36
  tinybird/tb/modules/llm_utils.py,sha256=nS9r4FAElJw8yXtmdYrx-rtI2zXR8qXfi1QqUDCfxvg,3469
37
37
  tinybird/tb/modules/local.py,sha256=_PIa-1M-72bv9rhLwqaNthJM1ZhvcjWXFChZAfEPXRs,5658
38
38
  tinybird/tb/modules/local_common.py,sha256=W1fEnB1vBQ4YC5U1PdA0w0g3cTV78bQ5R-lRxdDj5-Y,2868
39
39
  tinybird/tb/modules/login.py,sha256=EGxwVRmMX1Y7ZeCRyA8fqaCWpYYk7NvnZ3x_1g0NlYA,6063
40
- tinybird/tb/modules/materialization.py,sha256=HQKRTH6lkcYiDQJihbFqF_in58ezXG4ggZ_7Ywp_nUM,5738
41
- tinybird/tb/modules/mock.py,sha256=FLFPQi68PhcKfjiaFXCjQUTqYsDTtsr4z5WQPn5XAa0,3929
42
- tinybird/tb/modules/pipe.py,sha256=pH2KwgH6Xbvl3kT8vMelpKvT6bcyB4EKFDvGfOsxXbg,2418
43
- tinybird/tb/modules/project.py,sha256=RkejMzY6OLWlJMckziZiZFJLnjFxSeQjagklXAYCzoQ,2945
40
+ tinybird/tb/modules/materialization.py,sha256=dESybok66Fn7XLzQQr-fBCDNf5xQL8wkRiD2QBr5lOg,5748
41
+ tinybird/tb/modules/mock.py,sha256=7alBqLfQLb7JSZJth9JDXGUOvABWXr8Gx23edgyrW8w,3869
42
+ tinybird/tb/modules/pipe.py,sha256=PbCM31q9lVB9xPWvPBhlpW53MGFGvzVv81trxC06kDY,2428
43
+ tinybird/tb/modules/project.py,sha256=QdOG65Hcc6r_eQ938CfZeIXyp38RkiTYNPupgqy2gP0,2948
44
44
  tinybird/tb/modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
45
- tinybird/tb/modules/shell.py,sha256=6N5M08A0_xllfdZKAvKxrgGrG2CcS6EVtjXNDx6wuBE,14602
45
+ tinybird/tb/modules/shell.py,sha256=qWpZ9TwDSDq3YsBxueNtezsslp3N7pwUPRF8HIlTjOo,13828
46
46
  tinybird/tb/modules/table.py,sha256=4XrtjM-N0zfNtxVkbvLDQQazno1EPXnxTyo7llivfXk,11035
47
47
  tinybird/tb/modules/tag.py,sha256=anPmMUBc-TbFovlpFi8GPkKA18y7Y0GczMsMms5TZsU,3502
48
48
  tinybird/tb/modules/telemetry.py,sha256=iEGnMuCuNhvF6ln__j6X9MSTwL_0Hm-GgFHHHvhfknk,10466
49
- tinybird/tb/modules/test.py,sha256=6R433tzlunNLlKdmkcfskAjBPj_v9ZvTaHFQNblay2E,11529
50
- tinybird/tb/modules/token.py,sha256=A2I5wTUUmo0KfTI1BH6M6pqCQOd5dE4w2-Xaa1yM5PE,12810
51
- tinybird/tb/modules/watch.py,sha256=90FUrSD6cYfOi7GsEHfq_oTI6kap7uc8CbG0t3j_Tus,4953
52
- tinybird/tb/modules/workspace.py,sha256=sfT9QkoeFlN7ndUXxyImp4a7EFEHjY9MlGlldOViz0Y,6404
53
- tinybird/tb/modules/workspace_members.py,sha256=Ai6iCOzXX1zQ8q9iXIFSFHsBJlT-8Q28DaG5Ie-UweY,8726
49
+ tinybird/tb/modules/test.py,sha256=tY7_FJRSL6EdztypWlvDJi5QpXDLS5dpO0i_dpGuzkI,11528
50
+ tinybird/tb/modules/token.py,sha256=WEB2xqRgOierJ_S7TrZLEpLpQ9mkXcYLH2-xipjoGDc,12814
51
+ tinybird/tb/modules/watch.py,sha256=IIahyfmVNNu_EY2dVKZ_zjdSEFocwsmpvvgki4EmU-w,4961
52
+ tinybird/tb/modules/workspace.py,sha256=7gOgt10j9emleqQ43BA6jU0CZjJxw7L5gDZhCxGafI4,6400
53
+ tinybird/tb/modules/workspace_members.py,sha256=Vb5XEaKmkfONyfg2MS5EcpwolMvv7GLwFS5m2EuobT8,8726
54
54
  tinybird/tb/modules/datafile/build.py,sha256=seGFSvmgyRrAM1-icsKBkuog3WccfGUYFTPT-xoA5W8,50940
55
- tinybird/tb/modules/datafile/build_common.py,sha256=IXl-Z51zUi1dypV7meNenX0iu2UmowNeqgG6WHyMHlk,4562
56
- tinybird/tb/modules/datafile/build_datasource.py,sha256=4aP8_DYCRGghXntZSeWDNJxjps1QRVa7WHoYCzQwQts,17355
55
+ tinybird/tb/modules/datafile/build_common.py,sha256=rT7VJ5mnQ68R_8US91DAtkusfvjWuG_NObOzNgtN_ko,4562
56
+ tinybird/tb/modules/datafile/build_datasource.py,sha256=VjxaKKLZhPYt3XHOyMmfoqEAWAPI5D78T-8FOaN77MY,17355
57
57
  tinybird/tb/modules/datafile/build_pipe.py,sha256=Jgv3YKIvMfjPiSIdw1k2mpaoDdAWMiMRaSHwRgyI97E,28258
58
- tinybird/tb/modules/datafile/common.py,sha256=LyVd_VtVoGEW_fal1G5yOpJu0cA9ZKraw1pPW-1ijI0,78364
58
+ tinybird/tb/modules/datafile/common.py,sha256=1sKkQnyKOaFARQzORncpL6cRVpV9GDOD4oC36daX-Hk,79343
59
59
  tinybird/tb/modules/datafile/diff.py,sha256=-0J7PsBO64T7LOZSkZ4ZFHHCPvT7cKItnJkbz2PkndU,6754
60
60
  tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
61
- tinybird/tb/modules/datafile/fixture.py,sha256=XQpbppUQ4cow7dMzHs7OZBYBXA2PI5AOCmNdMDClbKo,833
61
+ tinybird/tb/modules/datafile/fixture.py,sha256=si-9LB-LdKQSWDtVW82xDrHtFfko5bgBG1cvjqqrcPU,1064
62
62
  tinybird/tb/modules/datafile/format_common.py,sha256=WaNV4tXrQU5gjV6MJP-5TGqg_Bre6ilNS8emvFl-X3c,1967
63
63
  tinybird/tb/modules/datafile/format_datasource.py,sha256=gpRsGnDEMxEo0pIlEHXKvyuwKIpqJJUCN9JRSiDYs_4,6156
64
64
  tinybird/tb/modules/datafile/format_pipe.py,sha256=58iSTrJ5lg-IsbpX8TQumQTuZ6UIotMsCIkNJd1M-pM,7418
65
65
  tinybird/tb/modules/datafile/parse_datasource.py,sha256=kk35PzesoJOd0LKjYp4kOyCwq4Qo4TiZnoI9qcXjB4k,1519
66
66
  tinybird/tb/modules/datafile/parse_pipe.py,sha256=snoy8Ac_Sat7LIXLAKzxjJSl2-TKg9FaZTooxrx6muE,3420
67
- tinybird/tb/modules/datafile/pipe_checker.py,sha256=SAXxGyHXB_p7ngQ7M0sUIUmx8yKooCdPXWHk4RzTanE,24665
67
+ tinybird/tb/modules/datafile/pipe_checker.py,sha256=LnDLGIHLJ3N7qHb2ptEbPr8CoczNfGwpjOY8EMdxfHQ,24649
68
68
  tinybird/tb/modules/datafile/pull.py,sha256=vcjMUbjnZ9XQMGmL33J3ElpbXBTat8Yzp-haeDggZd4,5967
69
69
  tinybird/tb/modules/tinyunit/tinyunit.py,sha256=LZGrsvIAUy5O2bZtGbi9O80QGIfXe_Du8c0PDNxeQcc,11727
70
70
  tinybird/tb/modules/tinyunit/tinyunit_lib.py,sha256=hGh1ZaXC1af7rKnX7222urkj0QJMhMWclqMy59dOqwE,1922
71
71
  tinybird/tb_cli_modules/cicd.py,sha256=0lMkb6CVOFZl5HOwgY8mK4T4mgI7O8335UngLXtCc-c,13851
72
- tinybird/tb_cli_modules/common.py,sha256=bnzDXWXHCgdOf8EK3sEmJcIAVm7EmpGgkc4jsqr4tXI,78718
72
+ tinybird/tb_cli_modules/common.py,sha256=NpR56fwwj6u--gLdTIZodvMe4LsWAtnphX-kw4hoKGs,78726
73
73
  tinybird/tb_cli_modules/config.py,sha256=6u6B5QCdiQLbJkCkwtnKGs9H3nP-KXXhC75mF7B-1DQ,11464
74
74
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
75
75
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
76
76
  tinybird/tb_cli_modules/telemetry.py,sha256=iEGnMuCuNhvF6ln__j6X9MSTwL_0Hm-GgFHHHvhfknk,10466
77
- tinybird-0.0.1.dev68.dist-info/METADATA,sha256=a9e8W_Cvpv2Itow-3_PLhvfYLzxj5d-jBTwbTAtfASY,2516
78
- tinybird-0.0.1.dev68.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
79
- tinybird-0.0.1.dev68.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
80
- tinybird-0.0.1.dev68.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
81
- tinybird-0.0.1.dev68.dist-info/RECORD,,
77
+ tinybird-0.0.1.dev70.dist-info/METADATA,sha256=5bMC_6zO0z9FVkj9F0oQ7tdexUZnSoPaEpaHG3EtqVs,2585
78
+ tinybird-0.0.1.dev70.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
79
+ tinybird-0.0.1.dev70.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
80
+ tinybird-0.0.1.dev70.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
81
+ tinybird-0.0.1.dev70.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.37.1)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,64 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: tinybird
3
- Version: 0.0.1.dev68
4
- Summary: Tinybird Command Line Tool
5
- Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
- Author: Tinybird
7
- Author-email: support@tinybird.co
8
- Requires-Python: >=3.9, <3.13
9
- Description-Content-Type: text/x-rst
10
- Requires-Dist: aiofiles (==24.1.0)
11
- Requires-Dist: anthropic (==0.42.0)
12
- Requires-Dist: click (<8.2,>=8.1.6)
13
- Requires-Dist: clickhouse-toolset (==0.33.dev0)
14
- Requires-Dist: colorama (==0.4.6)
15
- Requires-Dist: cryptography (~=41.0.0)
16
- Requires-Dist: croniter (==1.3.8)
17
- Requires-Dist: docker (==7.1.0)
18
- Requires-Dist: GitPython (~=3.1.32)
19
- Requires-Dist: humanfriendly (~=8.2)
20
- Requires-Dist: prompt-toolkit (==3.0.48)
21
- Requires-Dist: pydantic (~=2.8.0)
22
- Requires-Dist: pyperclip (==1.8.2)
23
- Requires-Dist: pyyaml (<6.1,>=6.0)
24
- Requires-Dist: requests (<3,>=2.28.1)
25
- Requires-Dist: shandy-sqlfmt (==0.11.1)
26
- Requires-Dist: shandy-sqlfmt[jinjafmt] (==0.11.1)
27
- Requires-Dist: toposort (==1.10)
28
- Requires-Dist: tornado (~=6.0.0)
29
- Requires-Dist: urllib3 (<2,>=1.26.14)
30
- Requires-Dist: watchdog (==6.0.0)
31
- Requires-Dist: wheel
32
- Requires-Dist: packaging (<24,>=23.1)
33
- Requires-Dist: llm (>=0.19)
34
- Requires-Dist: thefuzz (==0.22.1)
35
- Provides-Extra: bigquery
36
- Requires-Dist: gsutil (==4.58) ; extra == 'bigquery'
37
- Requires-Dist: google-api-python-client (==2.0.2) ; extra == 'bigquery'
38
- Requires-Dist: google-auth (==1.27.1) ; extra == 'bigquery'
39
- Requires-Dist: google-auth-httplib2 (==0.1.0) ; extra == 'bigquery'
40
- Requires-Dist: google-cloud-storage (==2.4.0) ; extra == 'bigquery'
41
- Requires-Dist: google-cloud-bigquery (==2.11.0) ; extra == 'bigquery'
42
- Provides-Extra: snowflake
43
- Requires-Dist: snowflake-connector-python (~=3.12.3) ; extra == 'snowflake'
44
- Requires-Dist: gsutil (==4.58) ; extra == 'snowflake'
45
- Requires-Dist: google-api-python-client (==2.0.2) ; extra == 'snowflake'
46
- Requires-Dist: google-auth (==1.27.1) ; extra == 'snowflake'
47
- Requires-Dist: google-auth-httplib2 (==0.1.0) ; extra == 'snowflake'
48
- Requires-Dist: google-cloud-storage (==2.4.0) ; extra == 'snowflake'
49
- Requires-Dist: oauth2client (==3.0.0) ; extra == 'snowflake'
50
- Requires-Dist: chardet (<4,>=3.0.2) ; extra == 'snowflake'
51
- Requires-Dist: pyOpenSSL (<20.0.0,>=16.2.0) ; extra == 'snowflake'
52
-
53
- Tinybird CLI
54
- =============
55
-
56
- The Tinybird command-line tool allows you to use all the Tinybird functionality directly from the command line. Additionally, it includes several functions to create and manage data projects easily.
57
-
58
- Changelog
59
- ----------
60
-
61
- 0.0.1dev1
62
- ***********
63
-
64
- * Initial release of the Tinybird CLI