tinybird 0.0.1.dev135__py3-none-any.whl → 0.0.1.dev136__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/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.dev135'
8
- __revision__ = 'bde3e45'
7
+ __version__ = '0.0.1.dev136'
8
+ __revision__ = 'c7efbae'
@@ -1836,6 +1836,31 @@ async def run_aws_iamrole_connection_flow(
1836
1836
  return role_arn, region, bucket_name
1837
1837
 
1838
1838
 
1839
+ async def run_gcp_svc_account_connection_flow(
1840
+ environment: str,
1841
+ ) -> Tuple[str, str, str]:
1842
+ bucket_name = click.prompt(
1843
+ "📦 Bucket name (specific name recommended, use '*' for unrestricted access in IAM policy)",
1844
+ prompt_suffix="\n> ",
1845
+ )
1846
+ validate_string_connector_param("Bucket", bucket_name)
1847
+
1848
+ click.echo(FeedbackManager.prompt_gcs_svc_account_login_gcp())
1849
+ click.echo(FeedbackManager.click_enter_to_continue())
1850
+ input()
1851
+
1852
+ # Display message and wait for user to press Enter
1853
+ click.echo(FeedbackManager.prompt_gcs_service_account_creation_flow(environment=environment))
1854
+ click.echo(FeedbackManager.click_enter_to_continue())
1855
+ input()
1856
+
1857
+ click.echo(FeedbackManager.prompt_gcs_service_account_key_creation())
1858
+ click.echo(FeedbackManager.click_enter_to_continue())
1859
+ input()
1860
+
1861
+ return bucket_name
1862
+
1863
+
1839
1864
  async def production_aws_iamrole_only(
1840
1865
  prod_client: TinyB,
1841
1866
  service: str,
@@ -1916,12 +1941,20 @@ async def get_aws_iamrole_policies(
1916
1941
 
1917
1942
 
1918
1943
  def get_s3_connection_name(project_folder: str) -> str:
1944
+ return get_connection_name(project_folder=project_folder, connection_type="S3")
1945
+
1946
+
1947
+ def get_gcs_connection_name(project_folder) -> str:
1948
+ return get_connection_name(project_folder=project_folder, connection_type="GCS")
1949
+
1950
+
1951
+ def get_connection_name(project_folder: str, connection_type: str) -> str:
1919
1952
  connection_name = None
1920
1953
  valid_pattern = r"^[a-zA-Z][a-zA-Z0-9_]*$"
1921
1954
 
1922
1955
  while not connection_name:
1923
1956
  connection_name = click.prompt(
1924
- "🔗 Enter a name for your new Tinybird S3 connection (use alphanumeric characters, and underscores)",
1957
+ f"🔗 Enter a name for your new Tinybird {connection_type} connection (use alphanumeric characters, and underscores)",
1925
1958
  prompt_suffix="\n> ",
1926
1959
  show_default=True,
1927
1960
  )
@@ -1947,6 +1980,20 @@ def get_s3_connection_name(project_folder: str) -> str:
1947
1980
  return connection_name
1948
1981
 
1949
1982
 
1983
+ def get_gcs_svc_account_creds() -> str:
1984
+ creds = None
1985
+
1986
+ while not creds:
1987
+ creds = click.edit(
1988
+ "🔗 IMPORTANT: THIS LINE MUST BE DELETED. Enter your GCP credentials (JSON):", extension=".json"
1989
+ )
1990
+
1991
+ assert isinstance(creds, str)
1992
+ creds_without_new_lines = creds.replace("\n", "")
1993
+
1994
+ return creds_without_new_lines
1995
+
1996
+
1950
1997
  class DataConnectorType(str, Enum):
1951
1998
  KAFKA = "kafka"
1952
1999
  GCLOUD_SCHEDULER = "gcscheduler"
@@ -16,12 +16,19 @@ from tinybird.tb.modules.common import (
16
16
  _get_setting_value,
17
17
  coro,
18
18
  echo_safe_humanfriendly_tables_format_smart_table,
19
+ get_gcs_connection_name,
20
+ get_gcs_svc_account_creds,
19
21
  get_s3_connection_name,
20
22
  production_aws_iamrole_only,
21
23
  run_aws_iamrole_connection_flow,
24
+ run_gcp_svc_account_connection_flow,
25
+ )
26
+ from tinybird.tb.modules.create import (
27
+ generate_aws_iamrole_connection_file_with_secret,
28
+ generate_gcs_connection_file_with_secrets,
22
29
  )
23
- from tinybird.tb.modules.create import generate_aws_iamrole_connection_file_with_secret
24
30
  from tinybird.tb.modules.feedback_manager import FeedbackManager
31
+ from tinybird.tb.modules.local_common import get_tinybird_local_client
25
32
  from tinybird.tb.modules.project import Project
26
33
 
27
34
  DATA_CONNECTOR_SETTINGS: Dict[DataConnectorType, List[str]] = {
@@ -150,6 +157,7 @@ async def connection_create_s3(ctx: Context) -> None:
150
157
  project: Project = ctx.ensure_object(dict)["project"]
151
158
  obj: Dict[str, Any] = ctx.ensure_object(dict)
152
159
  client: TinyB = obj["client"]
160
+ build_client = await get_tinybird_local_client(obj["config"], True)
153
161
 
154
162
  if obj["env"] == "local" and not await client.check_aws_credentials():
155
163
  click.echo(
@@ -172,9 +180,10 @@ async def connection_create_s3(ctx: Context) -> None:
172
180
  unique_suffix = uuid.uuid4().hex[:8] # Use first 8 chars of a UUID for brevity
173
181
  secret_name = f"s3_role_arn_{connection_name}_{unique_suffix}"
174
182
  await client.create_secret(name=secret_name, value=role_arn)
183
+ await build_client.create_secret(name=secret_name, value=role_arn)
175
184
 
176
185
  create_in_cloud = (
177
- click.confirm(FeedbackManager.prompt_s3_iamrole_success_cloud(), default=True)
186
+ click.confirm(FeedbackManager.prompt_connection_in_cloud_confirmation(), default=True)
178
187
  if obj["env"] == "local"
179
188
  else False
180
189
  )
@@ -212,3 +221,62 @@ async def connection_create_s3(ctx: Context) -> None:
212
221
  connection_path=str(connection_file_path),
213
222
  )
214
223
  )
224
+
225
+
226
+ @connection_create.command(name="gcs", short_help="Creates a Google Cloud Storage connection.")
227
+ @click.pass_context
228
+ @coro
229
+ async def connection_create_gcs(ctx: Context) -> None:
230
+ """
231
+ Creates a Google Cloud Storage connection.
232
+
233
+ \b
234
+ $ tb connection create gcs
235
+ """
236
+ project: Project = ctx.ensure_object(dict)["project"]
237
+ obj: Dict[str, Any] = ctx.ensure_object(dict)
238
+ client: TinyB = obj["client"]
239
+ build_client = await get_tinybird_local_client(obj["config"], True)
240
+
241
+ service = DataConnectorType.GCLOUD_STORAGE
242
+ click.echo(FeedbackManager.prompt_gcs_connection_header())
243
+ connection_name = get_gcs_connection_name(project.folder)
244
+ _ = await run_gcp_svc_account_connection_flow(environment=obj["env"])
245
+ creds_json = get_gcs_svc_account_creds()
246
+ unique_suffix = uuid.uuid4().hex[:8] # Use first 8 chars of a UUID for brevity
247
+ secret_name = f"gcs_svc_account_creds_{connection_name}_{unique_suffix}"
248
+ await client.create_secret(name=secret_name, value=creds_json)
249
+ await build_client.create_secret(name=secret_name, value=creds_json)
250
+
251
+ connection_path = await generate_gcs_connection_file_with_secrets(
252
+ name=connection_name,
253
+ service=service,
254
+ svc_account_creds=secret_name,
255
+ folder=project.folder,
256
+ )
257
+
258
+ create_in_cloud = (
259
+ click.confirm(FeedbackManager.prompt_connection_in_cloud_confirmation(), default=True)
260
+ if obj["env"] == "local"
261
+ else False
262
+ )
263
+
264
+ if create_in_cloud:
265
+ prod_config = obj["config"]
266
+ host = prod_config["host"]
267
+ token = prod_config["token"]
268
+ prod_client = TinyB(
269
+ token=token,
270
+ host=host,
271
+ staging=False,
272
+ )
273
+ creds_json = get_gcs_svc_account_creds()
274
+ secret_name = f"gcs_svc_account_creds_{connection_name}_{unique_suffix}"
275
+ await prod_client.create_secret(name=secret_name, value=creds_json)
276
+
277
+ click.echo(
278
+ FeedbackManager.prompt_gcs_success(
279
+ connection_name=connection_name,
280
+ connection_path=connection_path,
281
+ )
282
+ )
@@ -380,6 +380,16 @@ S3_REGION {region}
380
380
  return file_path
381
381
 
382
382
 
383
+ async def generate_gcs_connection_file_with_secrets(
384
+ name: str, service: str, svc_account_creds: str, folder: str
385
+ ) -> Path:
386
+ content = f"""TYPE {service}
387
+ GCS_SERVICE_ACCOUNT_CREDENTIALS_JSON {{{{ tb_secret("{svc_account_creds}") }}}}
388
+ """
389
+ file_path = generate_connection_file(name, content, folder, skip_feedback=True)
390
+ return file_path
391
+
392
+
383
393
  def create_rules(folder: str, source: str, agent: str):
384
394
  if agent == "cursor":
385
395
  extension = ".cursorrules"
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import functools
4
4
  import glob
5
5
  import itertools
6
+ import json
6
7
  import os
7
8
  import os.path
8
9
  import pprint
@@ -191,13 +192,13 @@ REQUIRED_KAFKA_PARAMS = {
191
192
 
192
193
  KAFKA_PARAMS = REQUIRED_KAFKA_PARAMS
193
194
 
194
- REQUIRED_S3_PARAMS = {
195
+ REQUIRED_BLOB_STORAGE_PARAMS = {
195
196
  "import_connection_name",
196
197
  "import_schedule",
197
198
  "import_bucket_uri",
198
199
  }
199
200
 
200
- S3_PARAMS = REQUIRED_S3_PARAMS.union({"import_from_timestamp"})
201
+ BLOB_STORAGE_PARAMS = REQUIRED_BLOB_STORAGE_PARAMS.union({"import_from_timestamp"})
201
202
 
202
203
 
203
204
  class Datafile:
@@ -293,10 +294,12 @@ class Datafile:
293
294
  f"Some Kafka params have been provided, but the following required ones are missing: {missing}"
294
295
  )
295
296
  # Validate S3 params
296
- if any(param in node for param in S3_PARAMS) and not all(param in node for param in REQUIRED_S3_PARAMS):
297
- missing = [param for param in REQUIRED_S3_PARAMS if param not in node]
297
+ if any(param in node for param in BLOB_STORAGE_PARAMS) and not all(
298
+ param in node for param in REQUIRED_BLOB_STORAGE_PARAMS
299
+ ):
300
+ missing = [param for param in REQUIRED_BLOB_STORAGE_PARAMS if param not in node]
298
301
  raise DatafileValidationError(
299
- f"Some S3 params have been provided, but the following required ones are missing: {missing}"
302
+ f"Some connection params have been provided, but the following required ones are missing: {missing}"
300
303
  )
301
304
  else:
302
305
  # We cannot validate a datafile whose kind is unknown
@@ -1310,6 +1313,16 @@ def parse(
1310
1313
 
1311
1314
  return _f
1312
1315
 
1316
+ def assign_var_json(v: str) -> Callable[[VarArg(str), KwArg(Any)], None]:
1317
+ @multiline_not_supported
1318
+ def _f(*args: str, **kwargs: Any):
1319
+ s = _unquote((" ".join(args)).strip())
1320
+ tmp = eval_var(s, skip=skip_eval)
1321
+ struct = json.loads(tmp)
1322
+ parser_state.current_node[v.lower()] = struct
1323
+
1324
+ return _f
1325
+
1313
1326
  def kafka_key_avro_deserialization(*args: str, **kwargs: Any):
1314
1327
  raise DatafileSyntaxError(
1315
1328
  f'{kwargs["cmd"].upper()} has been deprecated. Use "KAFKA_KEY_FORMAT avro" instead',
@@ -1536,7 +1549,7 @@ def parse(
1536
1549
  "kafka_store_headers": assign_var("kafka_store_headers"),
1537
1550
  "kafka_store_binary_headers": assign_var("kafka_store_binary_headers"),
1538
1551
  "kafka_key_format": assign_var("kafka_key_format"),
1539
- "kafka_value_format": assign_var("kafka_key_format"),
1552
+ "kafka_value_format": assign_var("kafka_value_format"),
1540
1553
  "kafka_key_avro_deserialization": kafka_key_avro_deserialization,
1541
1554
  "kafka_ssl_ca_pem": assign_var("kafka_ssl_ca_pem"),
1542
1555
  "kafka_security_protocol": assign_var("kafka_security_protocol"),
@@ -1546,6 +1559,7 @@ def parse(
1546
1559
  "s3_arn": assign_var("s3_arn"),
1547
1560
  "s3_access_key": assign_var("s3_access_key"),
1548
1561
  "s3_secret": assign_var("s3_secret"),
1562
+ "gcs_service_account_credentials_json": assign_var_json("gcs_service_account_credentials_json"),
1549
1563
  "import_connection_name": assign_var("import_connection_name"),
1550
1564
  "import_schedule": assign_var("import_schedule"),
1551
1565
  "import_strategy": assign_var("import_strategy"),
@@ -454,3 +454,24 @@ async def datasource_export(
454
454
 
455
455
  except Exception as e:
456
456
  raise CLIDatasourceException(FeedbackManager.error(message=str(e)))
457
+
458
+
459
+ @datasource.command(name="sync")
460
+ @click.argument("datasource_name")
461
+ @click.option("--yes", is_flag=True, default=False, help="Do not ask for confirmation")
462
+ @click.pass_context
463
+ @coro
464
+ async def datasource_sync(ctx: Context, datasource_name: str, yes: bool):
465
+ try:
466
+ client: TinyB = ctx.obj["client"]
467
+ ds = await client.get_datasource(datasource_name)
468
+
469
+ warning_message = FeedbackManager.warning_datasource_sync_bucket(datasource=datasource_name)
470
+
471
+ if yes or click.confirm(warning_message):
472
+ await client.datasource_sync(ds["id"])
473
+ click.echo(FeedbackManager.success_sync_datasource(datasource=datasource_name))
474
+ except AuthNoTokenException:
475
+ raise
476
+ except Exception as e:
477
+ raise CLIDatasourceException(FeedbackManager.error_syncing_datasource(datasource=datasource_name, error=str(e)))
@@ -566,7 +566,7 @@ STEP {step}: CREATE IAM ROLE FOR {environment} ENVIRONMENT
566
566
  Please enter the ARN of the role you just created"""
567
567
  )
568
568
 
569
- prompt_s3_iamrole_success_cloud = prompt_message(
569
+ prompt_connection_in_cloud_confirmation = prompt_message(
570
570
  "Would you like to create this connection in the cloud environment as well?"
571
571
  )
572
572
 
@@ -597,6 +597,56 @@ Please enter the ARN of the role you just created"""
597
597
  • \033]8;;https://www.tinybird.co/docs/forward/get-data-in/connectors/s3\033\\Learn more about our S3 Connector\033]8;;\033\\
598
598
  """)
599
599
 
600
+ # S3 IAM Role Connection Messages
601
+ prompt_gcs_connection_header = info_highlight_message("""
602
+ ──────────────────────────────────────────────────────────────
603
+ GCS CONNECTION SETUP
604
+ ──────────────────────────────────────────────────────────────""")
605
+
606
+ prompt_gcs_svc_account_login_gcp = prompt_message("""
607
+ ──────────────────────────────────────────────────────────────
608
+ STEP 1: GCP AUTHENTICATION
609
+ ──────────────────────────────────────────────────────────────
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.
612
+
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
+
615
+ prompt_gcs_service_account_creation_flow = prompt_message(
616
+ """
617
+ ──────────────────────────────────────────────────────────────
618
+ STEP 2: CREATE GCP SERVICE ACCOUNT
619
+ ──────────────────────────────────────────────────────────────
620
+
621
+ 1. Go to \033]8;https://console.cloud.google.com/iam-admin/serviceaccounts/create\033\\Service Accounts > + Create service account\033]8;;\033\\
622
+ 2. Provide a service account name. Name the service account something meaningful (e.g., TinybirdGCS-{environment}-svc-account)
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\\)
625
+ 5. Click "Done"
626
+ """
627
+ )
628
+
629
+ prompt_gcs_service_account_key_creation = prompt_message(
630
+ """
631
+ ──────────────────────────────────────────────────────────────
632
+ STEP 3: ADD KEY TO SERVICE ACCOUNT
633
+ ──────────────────────────────────────────────────────────────
634
+
635
+ 1. Go to Keys
636
+ 2. Click the "Add key" drop down menu and select "Create new key"
637
+ 3. Select "JSON" and click "Create". This should have downloaded a .json file.
638
+ 4. Copy the whole json and paste it here. This will create a tinybird secret, so there is no need to have that credentials file in the project.
639
+ """
640
+ )
641
+
642
+ prompt_gcs_success = success_message("""
643
+ ✅ GCS CONNECTION CONFIGURED SUCCESSFULLY
644
+
645
+ • File created at: {connection_path}
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\\
648
+ """)
649
+
600
650
  prompt_init_git_release_pull = prompt_message(
601
651
  "❓ Download the Data Project to continue, otherwise you can't initialize Workspace with Git. Execute '{pull_command}'?"
602
652
  )
@@ -715,7 +765,7 @@ Please enter the ARN of the role you just created"""
715
765
  )
716
766
  warning_datasource_sync = warning_message("** Warning: Do you want to sync the Data Source {datasource}?")
717
767
  warning_datasource_sync_bucket = warning_message(
718
- "** Warning: Do you want to ingest all the selected files (new and previous) from the {datasource} bucket? Be aware that data might be duplicated if you have previously ingested those files.\n"
768
+ "** Warning: Files from the {datasource} bucket will be updated from the last time synced. Do you want to continue?\n"
719
769
  )
720
770
  warning_users_dont_exist = warning_message(
721
771
  "** Warning: The following users do not exist in the workspace {workspace}: {users}"
@@ -100,6 +100,12 @@ async def pipe_populate(
100
100
  wait: bool,
101
101
  ):
102
102
  """Populate the result of a Materialized Node into the target materialized view"""
103
+
104
+ click.echo(
105
+ "Populating a materialized view on-demand is not supported yet. You can backfill data sources via Deployments."
106
+ )
107
+ return
108
+
103
109
  cl: TinyB = ctx.ensure_object(dict)["client"]
104
110
 
105
111
  pipe = await cl.pipe(pipe_name)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev135
3
+ Version: 0.0.1.dev136
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -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=Sv56aDmMPIxanN-B7Nt0rBkTsZFUjbU4DYKqfQU9C5A,252
15
+ tinybird/tb/__cli__.py,sha256=M0pSXz42qigJM-2E3dS0gV12H9C1ZSDJxBr_WwVLrag,252
16
16
  tinybird/tb/cli.py,sha256=Xw5EhwCQu6Xx55DzoJsZJODdi7tkA391mii-xgGnpEU,1066
17
17
  tinybird/tb/client.py,sha256=aaPKq5C77e72kR7IMv9WrvnvNki8mKMOTi9EsCp0eUc,55962
18
18
  tinybird/tb/config.py,sha256=HLMHbJg6BjeGZ2KiJA-BCCVnk8w959xsSaDEEePakZg,3981
@@ -20,16 +20,16 @@ tinybird/tb/modules/auth.py,sha256=_OeYnmTH83lnqCgQEdS6K0bx1KBUeRmZk2M7JnRmWpk,9
20
20
  tinybird/tb/modules/build.py,sha256=ohHiYwygJtldWsina-2QpvIt-g2hIqOkm5BEnh4JhdA,17187
21
21
  tinybird/tb/modules/cicd.py,sha256=Ug7LijuHDIqKR6rm8OLZispWp75Zv6TyonAme8K9jaI,7114
22
22
  tinybird/tb/modules/cli.py,sha256=Y_5hu9xwyTIZw4bQoe0MYLnRIzmR7hUjql_oZBxd4Qg,13407
23
- tinybird/tb/modules/common.py,sha256=Uad-hW9VDYYQsqMYVTqysOTFoBMuVCwQqPhzVj99Nh0,84182
23
+ tinybird/tb/modules/common.py,sha256=jThkqkIJ_blXXUZ2-3HdjG1dpLKOCE_TjXA0jSesIx0,85712
24
24
  tinybird/tb/modules/config.py,sha256=ziqW_t_mRVvWOd85VoB4vKyvgMkEfpXDf9H4v38p2xc,11422
25
- tinybird/tb/modules/connection.py,sha256=7qJGhTG0U__ZhY2HBWP8F1Z6tXrxwgAU-eOup6pXhhU,6905
25
+ tinybird/tb/modules/connection.py,sha256=bFolBbKjGMEs9CS_S74KLy-x-IlrhU0HNEmAeMywU00,9373
26
26
  tinybird/tb/modules/copy.py,sha256=2Mm4FWKehOG7CoOhiF1m9UZJgJn0W1_cMolqju8ONYg,5805
27
- tinybird/tb/modules/create.py,sha256=hgfnV0zMOYDdXZ1nEK_eEQK66TBFM8XBHvHi_Y9R7z8,16439
28
- tinybird/tb/modules/datasource.py,sha256=XvY7iTRefG9iEBLQkqBSF47bK-CrLu2AzDnigGI2mSc,16925
27
+ tinybird/tb/modules/create.py,sha256=VMX8b5ukgQm0VDUbBX91TsIsxqQid2UXRwlKekQp3M4,16792
28
+ tinybird/tb/modules/datasource.py,sha256=V314rkpdVxVMjsp5qcSCTqDlmp4Vu--qM07BoWh-aqs,17783
29
29
  tinybird/tb/modules/deployment.py,sha256=M3NPFQXIEsDh9-J-pzPLuHF9k4SIZVvgUnHp05KOf-E,20448
30
30
  tinybird/tb/modules/endpoint.py,sha256=XySDt3pk66vxOZ0egUfz4bY8bEk3BjOXkv-L0OIJ3sc,12083
31
31
  tinybird/tb/modules/exceptions.py,sha256=5jK91w1LPmtqIUfDpHe_Op5OxGz8-p1BPgtLREMIni0,5217
32
- tinybird/tb/modules/feedback_manager.py,sha256=8I6n5JFPS4xP-Pfb9iu7hqx5VX773uGDXH2E5QeANeg,74179
32
+ tinybird/tb/modules/feedback_manager.py,sha256=YrKz1qHLmCKYVNvW2SDobmI6ozMjf2eZL-AnFowSfm8,77664
33
33
  tinybird/tb/modules/infra.py,sha256=eX0StUipaXaxIhMxO82cnAnFKTCa7EPOt-e8pWoSLX0,33206
34
34
  tinybird/tb/modules/job.py,sha256=n4dSSBgnA8NqD7srGahf2xRj6wxkmX9Vl0J-QJ_a2w0,2966
35
35
  tinybird/tb/modules/llm.py,sha256=KfsCYmKeW1VQz0iDZhGKCRkQv_Y3kTHh6JuxvofOguE,1076
@@ -38,7 +38,7 @@ tinybird/tb/modules/local.py,sha256=-oXIeVXjzdfxVPQaXw68YyQOb48EFQZeUys8_U0xePs,
38
38
  tinybird/tb/modules/local_common.py,sha256=lyJ8vIFsDcVGYbfoCEBNgkwROsF5YJovxME1CRykEj8,3321
39
39
  tinybird/tb/modules/login.py,sha256=8oybH3rwTqNrHx0gN2zG-9MGSYsKwLuD2hKZsKJtrQA,7152
40
40
  tinybird/tb/modules/logout.py,sha256=ULooy1cDBD02-r7voZmhV7udA0ML5tVuflJyShrh56Y,1022
41
- tinybird/tb/modules/materialization.py,sha256=GvnItYXzBKRZjcuOIuOEwtdM4LxYbTH4M5vGZR233Hc,5323
41
+ tinybird/tb/modules/materialization.py,sha256=QJX5kCPhhm6IXBO1JsalVfbQdypCe_eOUDZ_WHJZWS8,5478
42
42
  tinybird/tb/modules/mock.py,sha256=tyhs6izqVGmDzMHdW5yHiprNPjeJDa2I-cLwrLRDC_U,4816
43
43
  tinybird/tb/modules/open.py,sha256=OuctINN77oexpSjth9uoIZPCelKO4Li-yyVxeSnk1io,1371
44
44
  tinybird/tb/modules/pipe.py,sha256=AQKEDagO6e3psPVjJkS_MDbn8aK-apAiLp26k7jgAV0,2432
@@ -58,7 +58,7 @@ tinybird/tb/modules/datafile/build.py,sha256=d_h3pRFDPFrDKGhpFx2iejY25GuB2k8yfNo
58
58
  tinybird/tb/modules/datafile/build_common.py,sha256=LU24kAQmxDJIyoIapDaYG-SU3P4FrMG9UBf8m9PgVSI,4565
59
59
  tinybird/tb/modules/datafile/build_datasource.py,sha256=nXEQ0qHdq2ai7jJTv8H2d7eeDPBYzLn8VY7zMtOYb8M,17382
60
60
  tinybird/tb/modules/datafile/build_pipe.py,sha256=6Cwjf3BKEF3-oQ9PipsQfK-Z43nSwtA4qJAUoysI7Uc,11385
61
- tinybird/tb/modules/datafile/common.py,sha256=pmomEsAb6qzIfub86ZSvLJnVDcmpSg4M4kOocjVtqpQ,85602
61
+ tinybird/tb/modules/datafile/common.py,sha256=p3EyhmO-zp5ZzdJcG6H5S60TTahhQn1fjK_ovXCk2J8,86185
62
62
  tinybird/tb/modules/datafile/diff.py,sha256=MTmj53RYjER4neLgWVjabn-FKVFgh8h8uYiBo55lFQg,6757
63
63
  tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
64
64
  tinybird/tb/modules/datafile/fixture.py,sha256=DrRWivcvo_1rn7LlVUnHcXccdgx9yVj63mzBkUwCzk8,1420
@@ -78,8 +78,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
78
78
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
79
79
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
80
80
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
81
- tinybird-0.0.1.dev135.dist-info/METADATA,sha256=wsn6Nt_nggLsKgKmvnM1E9PYRNz38DHGGt0exMJ-3DI,1612
82
- tinybird-0.0.1.dev135.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
83
- tinybird-0.0.1.dev135.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
84
- tinybird-0.0.1.dev135.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
85
- tinybird-0.0.1.dev135.dist-info/RECORD,,
81
+ tinybird-0.0.1.dev136.dist-info/METADATA,sha256=9bqpPb2SgYfpKY9CL3Y4z9dv6vJDqFYhX3M9DAvnKNs,1612
82
+ tinybird-0.0.1.dev136.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
83
+ tinybird-0.0.1.dev136.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
84
+ tinybird-0.0.1.dev136.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
85
+ tinybird-0.0.1.dev136.dist-info/RECORD,,