tinybird 0.0.1.dev69__tar.gz → 0.0.1.dev70__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.

Potentially problematic release.


This version of tinybird might be problematic. Click here for more details.

Files changed (101) hide show
  1. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/PKG-INFO +1 -1
  2. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/__cli__.py +2 -2
  3. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/build.py +12 -1
  4. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/cli.py +10 -1
  5. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/fixture.py +7 -0
  6. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datasource.py +63 -0
  7. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/deployment.py +18 -4
  8. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/mock.py +26 -18
  9. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/watch.py +1 -1
  10. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird.egg-info/PKG-INFO +1 -1
  11. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/setup.cfg +0 -0
  12. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/__cli__.py +0 -0
  13. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/ch_utils/constants.py +0 -0
  14. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/ch_utils/engine.py +0 -0
  15. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/check_pypi.py +0 -0
  16. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/client.py +0 -0
  17. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/config.py +0 -0
  18. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/connectors.py +0 -0
  19. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/context.py +0 -0
  20. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/datafile.py +0 -0
  21. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/datatypes.py +0 -0
  22. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/feedback_manager.py +0 -0
  23. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/git_settings.py +0 -0
  24. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/prompts.py +0 -0
  25. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/sql.py +0 -0
  26. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/sql_template.py +0 -0
  27. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/sql_template_fmt.py +0 -0
  28. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/sql_toolset.py +0 -0
  29. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/syncasync.py +0 -0
  30. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/cli.py +0 -0
  31. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/auth.py +0 -0
  32. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/cicd.py +0 -0
  33. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/common.py +0 -0
  34. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/config.py +0 -0
  35. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/copy.py +0 -0
  36. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/create.py +0 -0
  37. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/build.py +0 -0
  38. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/build_common.py +0 -0
  39. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/build_datasource.py +0 -0
  40. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/build_pipe.py +0 -0
  41. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/common.py +0 -0
  42. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/diff.py +0 -0
  43. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/exceptions.py +0 -0
  44. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/format_common.py +0 -0
  45. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/format_datasource.py +0 -0
  46. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/format_pipe.py +0 -0
  47. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/parse_datasource.py +0 -0
  48. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/parse_pipe.py +0 -0
  49. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/pipe_checker.py +0 -0
  50. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/datafile/pull.py +0 -0
  51. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/endpoint.py +0 -0
  52. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/exceptions.py +0 -0
  53. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/feedback_manager.py +0 -0
  54. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/fmt.py +0 -0
  55. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/job.py +0 -0
  56. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/llm.py +0 -0
  57. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/llm_utils.py +0 -0
  58. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/local.py +0 -0
  59. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/local_common.py +0 -0
  60. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/login.py +0 -0
  61. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/materialization.py +0 -0
  62. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/pipe.py +0 -0
  63. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/project.py +0 -0
  64. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/regions.py +0 -0
  65. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/shell.py +0 -0
  66. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/table.py +0 -0
  67. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/tag.py +0 -0
  68. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/telemetry.py +0 -0
  69. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/test.py +0 -0
  70. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/tinyunit/tinyunit.py +0 -0
  71. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/tinyunit/tinyunit_lib.py +0 -0
  72. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/token.py +0 -0
  73. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/workspace.py +0 -0
  74. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb/modules/workspace_members.py +0 -0
  75. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli.py +0 -0
  76. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/auth.py +0 -0
  77. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/branch.py +0 -0
  78. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/cicd.py +0 -0
  79. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/cli.py +0 -0
  80. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/common.py +0 -0
  81. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/config.py +0 -0
  82. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/connection.py +0 -0
  83. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/datasource.py +0 -0
  84. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/exceptions.py +0 -0
  85. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/fmt.py +0 -0
  86. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/job.py +0 -0
  87. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/pipe.py +0 -0
  88. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/regions.py +0 -0
  89. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/tag.py +0 -0
  90. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/telemetry.py +0 -0
  91. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/test.py +0 -0
  92. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
  93. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
  94. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/workspace.py +0 -0
  95. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tb_cli_modules/workspace_members.py +0 -0
  96. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird/tornado_template.py +0 -0
  97. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird.egg-info/SOURCES.txt +0 -0
  98. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird.egg-info/dependency_links.txt +0 -0
  99. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird.egg-info/entry_points.txt +0 -0
  100. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird.egg-info/requires.txt +0 -0
  101. {tinybird-0.0.1.dev69 → tinybird-0.0.1.dev70}/tinybird.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev69
3
+ Version: 0.0.1.dev70
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -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.dev69'
8
- __revision__ = 'f90d907'
7
+ __version__ = '0.0.1.dev70'
8
+ __revision__ = 'f8064d4'
@@ -15,7 +15,7 @@ from tinybird.client import TinyB
15
15
  from tinybird.tb.modules.cli import cli
16
16
  from tinybird.tb.modules.common import push_data
17
17
  from tinybird.tb.modules.datafile.build import folder_build
18
- from tinybird.tb.modules.datafile.fixture import get_fixture_dir
18
+ from tinybird.tb.modules.datafile.fixture import get_fixture_dir, persist_fixture
19
19
  from tinybird.tb.modules.feedback_manager import FeedbackManager
20
20
  from tinybird.tb.modules.project import Project
21
21
  from tinybird.tb.modules.shell import Shell, print_table_formatted
@@ -210,6 +210,8 @@ def process(
210
210
  build_failed = False
211
211
  if file_changed and file_changed.endswith(".ndjson"):
212
212
  rebuild_fixture(project, tb_client, file_changed)
213
+ elif file_changed and file_changed.endswith(".sql"):
214
+ rebuild_fixture_sql(project, tb_client, file_changed)
213
215
  else:
214
216
  try:
215
217
  build_project(project, tb_client, file_changed)
@@ -247,3 +249,12 @@ def run_watch(
247
249
  )
248
250
  watcher_thread.start()
249
251
  shell.run()
252
+
253
+
254
+ def rebuild_fixture_sql(project: Project, tb_client: TinyB, sql_file: str) -> None:
255
+ sql_path = Path(sql_file)
256
+ datasource_name = sql_path.stem
257
+ sql = sql_path.read_text()
258
+ result = asyncio.run(tb_client.query(f"{sql} FORMAT JSON"))
259
+ data = result.get("data", [])
260
+ persist_fixture(datasource_name, data, project.folder)
@@ -127,6 +127,7 @@ async def cli(
127
127
  ctx.ensure_object(dict)["client"] = client
128
128
 
129
129
  ctx.ensure_object(dict)["project"] = project
130
+ ctx.ensure_object(dict)["env"] = get_target_env(cloud, build)
130
131
 
131
132
 
132
133
  @cli.command(hidden=True)
@@ -393,7 +394,7 @@ async def create_ctx_client(ctx: Context, config: Dict[str, Any], cloud: bool, b
393
394
 
394
395
  commands_always_cloud = ["pull"]
395
396
  commands_always_build = ["build", "test", "dev"]
396
- commands_always_local = ["create", "mock"]
397
+ commands_always_local = ["create"]
397
398
  if (
398
399
  (cloud or command in commands_always_cloud)
399
400
  and command not in commands_always_build
@@ -407,3 +408,11 @@ async def create_ctx_client(ctx: Context, config: Dict[str, Any], cloud: bool, b
407
408
  if not build and command not in commands_always_local and command not in commands_always_build:
408
409
  click.echo(FeedbackManager.gray(message="Running against Tinybird Local\n"))
409
410
  return await get_tinybird_local_client(config, build=build)
411
+
412
+
413
+ def get_target_env(cloud: bool, build: bool) -> str:
414
+ if cloud:
415
+ return "cloud"
416
+ if build:
417
+ return "build"
418
+ return "local"
@@ -8,6 +8,13 @@ def get_fixture_dir(folder: str) -> Path:
8
8
  return Path(folder) / "fixtures"
9
9
 
10
10
 
11
+ def persist_fixture_sql(fixture_name: str, sql: str, folder: str) -> Path:
12
+ fixture_dir = get_fixture_dir(folder)
13
+ fixture_file = fixture_dir / f"{fixture_name}.sql"
14
+ fixture_file.write_text(sql)
15
+ return fixture_file
16
+
17
+
11
18
  def persist_fixture(fixture_name: str, data: Union[List[Dict[str, Any]], str], folder: str, format="ndjson") -> Path:
12
19
  fixture_dir = get_fixture_dir(folder)
13
20
  fixture_file = fixture_dir / f"{fixture_name}.{format}"
@@ -5,6 +5,7 @@
5
5
 
6
6
  import asyncio
7
7
  import json
8
+ import os
8
9
  import re
9
10
  from typing import Optional
10
11
 
@@ -23,8 +24,10 @@ from tinybird.tb.modules.common import (
23
24
  push_data,
24
25
  )
25
26
  from tinybird.tb.modules.datafile.common import get_name_version
27
+ from tinybird.tb.modules.datafile.fixture import persist_fixture
26
28
  from tinybird.tb.modules.exceptions import CLIDatasourceException
27
29
  from tinybird.tb.modules.feedback_manager import FeedbackManager
30
+ from tinybird.tb.modules.project import Project
28
31
 
29
32
 
30
33
  @cli.group()
@@ -391,3 +394,63 @@ async def datasource_data(ctx: Context, datasource: str, limit: int):
391
394
  echo_safe_humanfriendly_tables_format_smart_table(
392
395
  data=[d.values() for d in res["data"]], column_names=res["data"][0].keys()
393
396
  )
397
+
398
+
399
+ @datasource.command(name="export")
400
+ @click.argument("datasource")
401
+ @click.option(
402
+ "--format",
403
+ "format_",
404
+ type=click.Choice(["csv", "ndjson"], case_sensitive=False),
405
+ default="ndjson",
406
+ help="Output format (csv or ndjson)",
407
+ )
408
+ @click.option("--rows", type=int, default=100, help="Number of rows to export (default: 100)")
409
+ @click.option("--where", type=str, default=None, help="Condition to filter data")
410
+ @click.option("--target", type=str, help="Target file path (default: datasource_name.{format})")
411
+ @click.pass_context
412
+ @coro
413
+ async def datasource_export(
414
+ ctx: Context,
415
+ datasource: str,
416
+ format_: str,
417
+ rows: int,
418
+ where: Optional[str],
419
+ target: Optional[str],
420
+ ):
421
+ """Export data from a datasource to a file in CSV or NDJSON format
422
+
423
+ Example usage:
424
+ - Export all rows as CSV: tb datasource export my_datasource
425
+ - Export 1000 rows as NDJSON: tb datasource export my_datasource --format ndjson --rows 1000
426
+ - Export to specific file: tb datasource export my_datasource --output ./data/export.csv
427
+ """
428
+ client: TinyB = ctx.ensure_object(dict)["client"]
429
+ project: Project = ctx.ensure_object(dict)["project"]
430
+
431
+ # Determine output filename if not provided
432
+ if not target:
433
+ target = f"{datasource}.{format_}"
434
+
435
+ # Build query with optional row limit
436
+ query = f"SELECT * FROM {datasource} WHERE {where or 1} LIMIT {rows}"
437
+
438
+ click.echo(FeedbackManager.highlight(message=f"\n» Exporting {datasource} to {target}"))
439
+
440
+ try:
441
+ if format_ == "csv":
442
+ query += " FORMAT CSVWithNames"
443
+ else:
444
+ query += " FORMAT JSONEachRow"
445
+
446
+ res = await client.query(query)
447
+
448
+ fixture_path = persist_fixture(datasource, res, project.folder)
449
+ file_size = os.path.getsize(fixture_path)
450
+
451
+ click.echo(
452
+ FeedbackManager.success(message=f"✓ Exported data to {target} ({humanfriendly.format_size(file_size)})")
453
+ )
454
+
455
+ except Exception as e:
456
+ raise CLIDatasourceException(FeedbackManager.error(message=str(e)))
@@ -266,13 +266,13 @@ def deployment_rollback(ctx: click.Context, wait: bool) -> None:
266
266
  @click.option(
267
267
  "--wait/--no-wait",
268
268
  is_flag=True,
269
- default=False,
269
+ default=True,
270
270
  help="Wait for deploy to finish. Disabled by default.",
271
271
  )
272
272
  @click.option(
273
273
  "--auto/--no-auto",
274
274
  is_flag=True,
275
- default=False,
275
+ default=True,
276
276
  help="Auto-promote the deployment. Only works if --wait is enabled. Disabled by default.",
277
277
  )
278
278
  @click.option(
@@ -311,6 +311,7 @@ def create_deployment(
311
311
  }
312
312
  project: Project = ctx.ensure_object(dict)["project"]
313
313
  client = ctx.ensure_object(dict)["client"]
314
+ config = ctx.ensure_object(dict)["config"]
314
315
  TINYBIRD_API_URL = f"{client.host}/v1/deploy"
315
316
  TINYBIRD_API_KEY = client.token
316
317
 
@@ -357,8 +358,21 @@ def create_deployment(
357
358
  deploy_result = result.get("result")
358
359
  if deploy_result == "success":
359
360
  print_changes(result, project)
360
- click.echo(FeedbackManager.success(message="Deployment submitted successfully"))
361
- deployment = result.get("deployment")
361
+ deployment = result.get("deployment", {})
362
+ # We show the url in the case of region is public
363
+ if client.host == "https://api.europe-west2.gcp.tinybird.co":
364
+ click.echo(
365
+ FeedbackManager.gray(message="Deployment URL: ")
366
+ + FeedbackManager.info(
367
+ message=f"https://cloud.tinybird.co/gcp/europe-west2/{config.get('name')}/deployments/{deployment.get('id')}"
368
+ )
369
+ )
370
+
371
+ if wait:
372
+ click.echo(FeedbackManager.info(message="\n✓ Deployment submitted successfully"))
373
+ else:
374
+ click.echo(FeedbackManager.success(message="\n✓ Deployment submitted successfully"))
375
+
362
376
  feedback = deployment.get("feedback", [])
363
377
  for f in feedback:
364
378
  click.echo(
@@ -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,21 +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
73
  response = llm.ask(system_prompt=mock_prompt(rows), prompt=prompt)
84
74
  sql = extract_xml(response, "sql")
85
75
  result = await tb_client.query(f"{sql} FORMAT JSON")
86
76
  data = result.get("data", [])[:rows]
87
- persist_fixture(datasource_name, data, folder)
88
- 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)
89
81
 
90
- if os.environ.get("TB_DEBUG", "") != "":
91
- 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))
92
85
 
93
86
  click.echo(FeedbackManager.success(message=f"✓ Sample data for {datasource_name} created with {rows} rows"))
94
87
 
95
88
  except Exception as e:
96
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
+ )
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev69
3
+ Version: 0.0.1.dev70
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
File without changes