tinybird 0.0.1.dev228__py3-none-any.whl → 0.0.1.dev229__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.

@@ -122,7 +122,12 @@ VALID_PIPE_NODE_TYPES = {
122
122
  PipeNodeTypes.STREAM,
123
123
  PipeNodeTypes.DATA_SINK,
124
124
  }
125
- VISIBLE_PIPE_NODE_TYPES = {PipeNodeTypes.MATERIALIZED, PipeNodeTypes.COPY, PipeNodeTypes.ENDPOINT}
125
+ VISIBLE_PIPE_NODE_TYPES = {
126
+ PipeNodeTypes.MATERIALIZED,
127
+ PipeNodeTypes.COPY,
128
+ PipeNodeTypes.ENDPOINT,
129
+ PipeNodeTypes.DATA_SINK,
130
+ }
126
131
 
127
132
 
128
133
  class DataFileExtensions:
@@ -182,6 +187,22 @@ class MaterializedParameters(Parameters):
182
187
  ACCEPTED_ATTRIBUTES = PipeParameters.ACCEPTED_ATTRIBUTES.union(MANDATORY_ATTRIBUTES)
183
188
 
184
189
 
190
+ class SinkParameters(Parameters):
191
+ # For Kafka sinks
192
+ KAFKA_MANDATORY_ATTRIBUTES = PipeParameters.MANDATORY_ATTRIBUTES.union(
193
+ {"export_connection_name", "export_kafka_topic", "export_schedule"}
194
+ )
195
+ KAFKA_ACCEPTED_ATTRIBUTES = PipeParameters.ACCEPTED_ATTRIBUTES.union(KAFKA_MANDATORY_ATTRIBUTES)
196
+
197
+ # For S3/GCS sinks
198
+ BLOB_MANDATORY_ATTRIBUTES = PipeParameters.MANDATORY_ATTRIBUTES.union(
199
+ {"export_connection_name", "export_schedule", "export_bucket_uri", "export_file_template"}
200
+ )
201
+ BLOB_ACCEPTED_ATTRIBUTES = PipeParameters.ACCEPTED_ATTRIBUTES.union(BLOB_MANDATORY_ATTRIBUTES).union(
202
+ {"export_format", "export_compression", "export_write_strategy", "export_strategy"}
203
+ )
204
+
205
+
185
206
  DATAFILE_NEW_LINE = "\n"
186
207
  DATAFILE_INDENT = " " * 4
187
208
 
@@ -305,6 +326,90 @@ class Datafile:
305
326
  f"Materialized node {repr(node['name'])} has an invalid attribute ({MaterializedParameters.canonical_name(key)})"
306
327
  )
307
328
 
329
+ def validate_sink_node(self, node: Dict[str, Any]):
330
+ export_connection_name = node.get("export_connection_name")
331
+
332
+ if not export_connection_name:
333
+ raise DatafileValidationError(
334
+ f"Sink node {repr(node['name'])} is missing required parameter 'export_connection_name'"
335
+ )
336
+
337
+ # Determine connection type to validate appropriate parameters
338
+ # First, try to determine from presence of Kafka-specific parameters
339
+ has_kafka_topic = "export_kafka_topic" in node
340
+ has_s3_gcs_params = any(param in node for param in ["export_bucket_uri", "export_file_template"])
341
+
342
+ # If both types of parameters are present, that's an error
343
+ if has_kafka_topic and has_s3_gcs_params:
344
+ raise DatafileValidationError(
345
+ f"Sink node {repr(node['name'])} has mixed Kafka and S3/GCS parameters. Use either Kafka parameters (export_kafka_topic) or S3/GCS parameters (export_bucket_uri, export_file_template), not both."
346
+ )
347
+
348
+ # If we have Kafka-specific parameters, treat as Kafka sink
349
+ if has_kafka_topic:
350
+ # Kafka sink validation
351
+ if missing := [param for param in SinkParameters.KAFKA_MANDATORY_ATTRIBUTES if param not in node]:
352
+ raise DatafileValidationError(
353
+ f"Kafka sink node {repr(node['name'])} is missing required parameters: {missing}"
354
+ )
355
+
356
+ # For Kafka sinks, only specific parameters should be present
357
+ kafka_specific_params = (
358
+ {"export_kafka_topic", "export_schedule", "export_connection_name"}
359
+ | PipeParameters.MANDATORY_ATTRIBUTES
360
+ | PipeParameters.ACCEPTED_ATTRIBUTES
361
+ )
362
+ for key in node.keys():
363
+ if key not in kafka_specific_params:
364
+ raise DatafileValidationError(
365
+ f"Kafka sink node {repr(node['name'])} has invalid parameter '{key}'. Only export_kafka_topic, export_schedule, and export_connection_name are allowed for Kafka sinks."
366
+ )
367
+
368
+ # If we have S3/GCS-specific parameters, treat as S3/GCS sink
369
+ elif has_s3_gcs_params:
370
+ # S3/GCS sink validation
371
+ if missing := [param for param in SinkParameters.BLOB_MANDATORY_ATTRIBUTES if param not in node]:
372
+ raise DatafileValidationError(
373
+ f"S3/GCS sink node {repr(node['name'])} is missing required parameters: {missing}"
374
+ )
375
+
376
+ # Check that only valid parameters are present
377
+ for key in node.keys():
378
+ if key not in SinkParameters.BLOB_ACCEPTED_ATTRIBUTES:
379
+ raise DatafileValidationError(
380
+ f"S3/GCS sink node {repr(node['name'])} has invalid parameter '{key}'"
381
+ )
382
+
383
+ # If no type-specific parameters are present, we can't determine the type
384
+ # This means the sink is missing required parameters for any sink type
385
+ else:
386
+ # Check if we have any export parameters at all besides connection_name and schedule
387
+ export_params = {
388
+ k
389
+ for k in node.keys()
390
+ if k.startswith("export_") and k not in {"export_connection_name", "export_schedule"}
391
+ }
392
+ if not export_params:
393
+ raise DatafileValidationError(
394
+ f"Sink node {repr(node['name'])} is missing required parameters. "
395
+ f"For Kafka sinks, provide 'export_kafka_topic'. "
396
+ f"For S3/GCS sinks, provide 'export_bucket_uri' and 'export_file_template'."
397
+ )
398
+ else:
399
+ # There are some export parameters, but they don't match known patterns
400
+ raise DatafileValidationError(
401
+ f"Sink node {repr(node['name'])} has unrecognized export parameters: {export_params}. "
402
+ f"For Kafka sinks, use 'export_kafka_topic'. "
403
+ f"For S3/GCS sinks, use 'export_bucket_uri' and 'export_file_template'."
404
+ )
405
+
406
+ # Validate schedule format (common for both Kafka and S3/GCS)
407
+ export_schedule = node.get("export_schedule")
408
+ if export_schedule and export_schedule != ON_DEMAND and not croniter.is_valid(export_schedule):
409
+ raise DatafileValidationError(
410
+ f"Sink node {repr(node['name'])} has invalid export_schedule '{export_schedule}'. Must be @on-demand or a valid cron expression."
411
+ )
412
+
308
413
  def validate(self):
309
414
  if self.kind == DatafileKind.pipe:
310
415
  # TODO(eclbg):
@@ -325,9 +430,11 @@ class Datafile:
325
430
  self.validate_materialized_node(node)
326
431
  if node_type == PipeNodeTypes.COPY:
327
432
  self.validate_copy_node(node)
433
+ if node_type == PipeNodeTypes.DATA_SINK:
434
+ self.validate_sink_node(node)
328
435
  if node_type not in VALID_PIPE_NODE_TYPES:
329
436
  raise DatafileValidationError(
330
- f"Invalid node type ({node_type}) in pipe {repr(node['name'])}. Allowed node types: {VISIBLE_PIPE_NODE_TYPES}"
437
+ f"Invalid node '{repr(node['name'])}' of type ({node_type}). Allowed node types: {VISIBLE_PIPE_NODE_TYPES}"
331
438
  )
332
439
  for token in self.tokens:
333
440
  if token["permission"].upper() != "READ":
tinybird/prompts.py CHANGED
@@ -676,7 +676,7 @@ EXPORT_FILE_TEMPLATE "daily_prices"
676
676
  EXPORT_SCHEDULE "*/5 * * * *"
677
677
  EXPORT_FORMAT "csv"
678
678
  EXPORT_COMPRESSION "gz"
679
- EXPORT_WRITE_STRATEGY "truncate"
679
+ EXPORT_STRATEGY "truncate"
680
680
  </sink_pipe_instructions>
681
681
  """
682
682
 
tinybird/tb/__cli__.py CHANGED
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
4
4
  __url__ = 'https://www.tinybird.co/docs/forward/commands'
5
5
  __author__ = 'Tinybird'
6
6
  __author_email__ = 'support@tinybird.co'
7
- __version__ = '0.0.1.dev228'
8
- __revision__ = '1a9e75c'
7
+ __version__ = '0.0.1.dev229'
8
+ __revision__ = '814718e'
@@ -319,79 +319,23 @@ async def connection_create_gcs(ctx: Context) -> None:
319
319
 
320
320
 
321
321
  @connection_create.command(name="kafka", short_help="Creates a Kafka connection.")
322
- @click.option(
323
- "--name",
324
- default=None,
325
- help="The name of your Kafka connection. If not provided, it's set as the bootstrap server",
326
- )
327
- @click.option("--bootstrap-servers", help="Kafka Bootstrap Server in form mykafka.mycloud.com:9092")
328
- @click.option("--key", help="Key")
329
- @click.option("--secret", help="Secret")
330
- @click.option(
331
- "--auto-offset-reset", default=None, help="Offset reset, can be 'latest' or 'earliest'. Defaults to 'latest'."
332
- )
333
- @click.option("--schema-registry-url", default=None, help="Avro Confluent Schema Registry URL")
334
- @click.option(
335
- "--sasl-mechanism",
336
- default=None,
337
- help="Authentication method for connection-based protocols. Defaults to 'PLAIN'",
338
- )
339
- @click.option(
340
- "--security-protocol",
341
- default="SASL_SSL",
342
- help="Security protocol for connection-based protocols. Defaults to 'SASL_SSL'",
343
- )
344
- @click.option("--skip-secrets", is_flag=True, help="Skip Tinybird Secret creation")
345
322
  @click.pass_context
346
323
  @coro
347
- async def connection_create_kafka_cmd(
348
- ctx: Context,
349
- name: str,
350
- bootstrap_servers: str,
351
- key: str,
352
- secret: str,
353
- schema_registry_url: str,
354
- auto_offset_reset: str,
355
- sasl_mechanism: str,
356
- security_protocol: str,
357
- skip_secrets: bool,
358
- ) -> None:
324
+ async def connection_create_kafka_cmd(ctx: Context) -> None:
359
325
  """
360
326
  Creates a Kafka connection.
361
327
 
362
328
  \b
363
329
  $ tb connection create kafka
364
330
  """
365
- await connection_create_kafka(
366
- ctx,
367
- name,
368
- bootstrap_servers,
369
- key,
370
- secret,
371
- schema_registry_url,
372
- auto_offset_reset,
373
- sasl_mechanism,
374
- security_protocol,
375
- skip_secrets,
376
- )
331
+ await connection_create_kafka(ctx)
377
332
 
378
333
 
379
- async def connection_create_kafka(
380
- ctx: Context,
381
- name="",
382
- bootstrap_servers="",
383
- key="",
384
- secret="",
385
- schema_registry_url="",
386
- auto_offset_reset="",
387
- sasl_mechanism="",
388
- security_protocol="SASL_SSL",
389
- skip_secrets=False,
390
- ) -> Tuple[str, str, str, str, str, str, str, str, List[str]]:
334
+ async def connection_create_kafka(ctx: Context) -> Tuple[str, str, str, str, str, str, str, str, List[str]]:
391
335
  obj: Dict[str, Any] = ctx.ensure_object(dict)
392
336
  click.echo(FeedbackManager.gray(message="\n» Creating Kafka connection..."))
393
337
  project: Project = ctx.ensure_object(dict)["project"]
394
- name = get_kafka_connection_name(project.folder, name)
338
+ name = get_kafka_connection_name(project.folder, "")
395
339
  default_bootstrap_servers = "localhost:9092"
396
340
  bootstrap_servers = click.prompt(
397
341
  FeedbackManager.highlight(
@@ -404,7 +348,7 @@ async def connection_create_kafka(
404
348
  bootstrap_servers = click.prompt("Bootstrap Server")
405
349
 
406
350
  validate_kafka_bootstrap_servers(bootstrap_servers)
407
- secret_required = not skip_secrets and click.confirm(
351
+ secret_required = click.confirm(
408
352
  FeedbackManager.highlight(message=" ? Do you want to store the bootstrap server in a .env.local file? [Y/n]"),
409
353
  default=True,
410
354
  show_default=False,
@@ -420,12 +364,11 @@ async def connection_create_kafka(
420
364
  except Exception as e:
421
365
  raise CLIConnectionException(FeedbackManager.error(message=str(e)))
422
366
 
423
- if not key:
424
- key = click.prompt(FeedbackManager.highlight(message="? Kafka key"))
367
+ key = click.prompt(FeedbackManager.highlight(message="? Kafka key"))
425
368
 
426
369
  validate_kafka_key(key)
427
370
 
428
- secret_required = not skip_secrets and click.confirm(
371
+ secret_required = click.confirm(
429
372
  FeedbackManager.highlight(message=" ? Do you want to store the Kafka key in a .env.local file? [Y/n]"),
430
373
  default=True,
431
374
  show_default=False,
@@ -438,12 +381,11 @@ async def connection_create_kafka(
438
381
  except Exception as e:
439
382
  raise CLIConnectionException(FeedbackManager.error(message=str(e)))
440
383
 
441
- if not secret:
442
- secret = click.prompt(FeedbackManager.highlight(message="? Kafka secret"), hide_input=True)
384
+ secret = click.prompt(FeedbackManager.highlight(message="? Kafka secret"), hide_input=True)
443
385
 
444
386
  validate_kafka_secret(secret)
445
387
 
446
- secret_required = not skip_secrets and click.confirm(
388
+ secret_required = click.confirm(
447
389
  FeedbackManager.highlight(message=" ? Do you want to store the Kafka secret in a .env.local file? [Y/n]"),
448
390
  default=True,
449
391
  show_default=False,
@@ -456,15 +398,14 @@ async def connection_create_kafka(
456
398
  except Exception as e:
457
399
  raise CLIConnectionException(FeedbackManager.error(message=str(e)))
458
400
 
459
- if not sasl_mechanism:
460
- sasl_mechanism_options = ["PLAIN", "SCRAM-SHA-256", "SCRAM-SHA-512"]
461
- sasl_mechanism = click.prompt(
462
- FeedbackManager.highlight(message="? SASL Mechanism (PLAIN, SCRAM-SHA-256, SCRAM-SHA-512) [PLAIN]"),
463
- type=click.Choice(sasl_mechanism_options),
464
- show_default=False,
465
- show_choices=False,
466
- default="PLAIN",
467
- )
401
+ sasl_mechanism_options = ["PLAIN", "SCRAM-SHA-256", "SCRAM-SHA-512"]
402
+ sasl_mechanism = click.prompt(
403
+ FeedbackManager.highlight(message="? SASL Mechanism (PLAIN, SCRAM-SHA-256, SCRAM-SHA-512) [PLAIN]"),
404
+ type=click.Choice(sasl_mechanism_options),
405
+ show_default=False,
406
+ show_choices=False,
407
+ default="PLAIN",
408
+ )
468
409
 
469
410
  create_in_cloud = (
470
411
  click.confirm(
@@ -474,9 +415,7 @@ async def connection_create_kafka(
474
415
  default=True,
475
416
  show_default=False,
476
417
  )
477
- if obj["env"] == "local"
478
- and not skip_secrets
479
- and (tb_secret_bootstrap_servers or tb_secret_key or tb_secret_secret)
418
+ if obj["env"] == "local" and (tb_secret_bootstrap_servers or tb_secret_key or tb_secret_secret)
480
419
  else False
481
420
  )
482
421
 
@@ -498,9 +437,25 @@ async def connection_create_kafka(
498
437
  await prod_client.create_secret(name=tb_secret_secret, value=secret)
499
438
  click.echo(FeedbackManager.success(message="✓ Secrets created!"))
500
439
 
501
- schema_registry_url and validate_kafka_schema_registry_url(schema_registry_url)
502
- auto_offset_reset and validate_kafka_auto_offset_reset(auto_offset_reset)
440
+ schema_registry_url = click.prompt(
441
+ FeedbackManager.highlight(message="? Schema Registry URL (optional)"),
442
+ default="",
443
+ show_default=False,
444
+ )
445
+ if schema_registry_url:
446
+ validate_kafka_schema_registry_url(schema_registry_url)
447
+
448
+ auto_offset_reset_options = ["latest", "earliest"]
449
+ auto_offset_reset = click.prompt(
450
+ FeedbackManager.highlight(message="? Auto offset reset (latest, earliest) [latest]"),
451
+ type=click.Choice(auto_offset_reset_options),
452
+ default="latest",
453
+ show_default=False,
454
+ show_choices=False,
455
+ )
456
+ validate_kafka_auto_offset_reset(auto_offset_reset)
503
457
  click.echo(FeedbackManager.gray(message="» Validating connection..."))
458
+ security_protocol = "SASL_SSL"
504
459
  topics = list_kafka_topics(bootstrap_servers, key, secret, security_protocol, sasl_mechanism)
505
460
 
506
461
  if topics is None:
@@ -515,7 +470,7 @@ async def connection_create_kafka(
515
470
  tb_secret_key=tb_secret_key,
516
471
  secret=secret,
517
472
  tb_secret_secret=tb_secret_secret,
518
- security_protocol=security_protocol,
473
+ security_protocol="SASL_SSL",
519
474
  sasl_mechanism=sasl_mechanism,
520
475
  folder=project.folder,
521
476
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev228
3
+ Version: 0.0.1.dev229
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
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=1INQFfRfuMCb9lfB8KNf4r6qC2khW568hoHjtk-wshI,69305
5
5
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
6
- tinybird/prompts.py,sha256=BRCHfFKsVU9XBckQHIkluG5TCtgKo-MYMs3fFuR7zmQ,45322
6
+ tinybird/prompts.py,sha256=dg8Q8Q29X69j-PPP8KGooMz7-M3FNXEYqC0Fj0LcUbw,45316
7
7
  tinybird/sql.py,sha256=BufnOgclQokDyihtuXesOwHBsebN6wRXIxO5wKRkOwE,48299
8
8
  tinybird/sql_template.py,sha256=WjsTBjpQLVBHGZbY2dZuhZUurFR-rbJ_KRRy5vx4Y5E,99967
9
9
  tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
@@ -12,12 +12,12 @@ 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=yEKR11gLCL-irEXXF9QwShaR0JLXiBTlaxfolcCIoqY,4097
14
14
  tinybird/ch_utils/engine.py,sha256=X4tE9OrfaUy6kO9cqVEzyI9cDcmOF3IAssRRzsTsfEQ,40781
15
- tinybird/datafile/common.py,sha256=W8HtbKVLe8Fr8Q1x3xw2DA-vroi8EZfvDJptAxiJVzQ,91784
15
+ tinybird/datafile/common.py,sha256=p--Zn09A4CRaSUQKLDoN3ITAX6E_mOsfFjK8aY9fVRk,97217
16
16
  tinybird/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
17
17
  tinybird/datafile/parse_connection.py,sha256=tRyn2Rpr1TeWet5BXmMoQgaotbGdYep1qiTak_OqC5E,1825
18
18
  tinybird/datafile/parse_datasource.py,sha256=ssW8QeFSgglVFi3sDZj_HgkJiTJ2069v2JgqnH3CkDE,1825
19
19
  tinybird/datafile/parse_pipe.py,sha256=xf4m0Tw44QWJzHzAm7Z7FwUoUUtr7noMYjU1NiWnX0k,3880
20
- tinybird/tb/__cli__.py,sha256=6UmdzNjS-aX3yoDOzf3ApvaWpj5UPI69igaZUUi7P1A,247
20
+ tinybird/tb/__cli__.py,sha256=abf6p2ld9Q1KITecyuYWTXBq4NqGO5evhTrj1jhr90M,247
21
21
  tinybird/tb/check_pypi.py,sha256=i3l2L8IajeB7sreikR7oPlYJki9MtS3c_M4crnmbByc,760
22
22
  tinybird/tb/cli.py,sha256=0xYk2Ip4vb3nNFbxfTdG3VoIgdRvUKVbUVU_mviErPA,1107
23
23
  tinybird/tb/client.py,sha256=FKj61vY9STPW03kfVcxYuY1_csI-kP-mc1ERQfqJtg8,56505
@@ -27,7 +27,7 @@ tinybird/tb/modules/cicd.py,sha256=H22MaMsqAeDv-OmeHFOlUOAmfNzEzTFaEV9TQ0g4ehs,7
27
27
  tinybird/tb/modules/cli.py,sha256=zTUob6oSZszCx-lk6MJbQ_VuNOXBo8b0DOHPWezzMOg,15997
28
28
  tinybird/tb/modules/common.py,sha256=F6oaoFZ3aBxEMjiDKYhthsEIUqSFPkcdlMJ7h7A49Ac,83114
29
29
  tinybird/tb/modules/config.py,sha256=VnzYVUo4q1RBEEMMce4_OCrKp4erhgkRPHElydVlKj0,11488
30
- tinybird/tb/modules/connection.py,sha256=dAOv8z3ym9Tt62j7AI8R9PgFwgiCIFdgIMpUiMdtxaQ,18906
30
+ tinybird/tb/modules/connection.py,sha256=KHZgu7sK1C4UBgwkKAMeNdKB0RrTls0LG3YoaUfeAfw,17648
31
31
  tinybird/tb/modules/copy.py,sha256=zHN1d5NA-MFsgbk2kKJq2P9qA8dNOnIsIa60QpVnSwc,4458
32
32
  tinybird/tb/modules/create.py,sha256=56_x6nwj_oAr72X7AvdxXAuXCDKGJp-w1dP6E2XdxqU,23376
33
33
  tinybird/tb/modules/datasource.py,sha256=UiQXDkSEmQIPj4NcUD_I4bAJe9IGVmlVW07yGgSu6kY,40941
@@ -82,8 +82,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
82
82
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
83
83
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
84
84
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
85
- tinybird-0.0.1.dev228.dist-info/METADATA,sha256=-XnISmLBDTR6JLoON6Q6W3v4uFAflsOiBq2yHlQOfFI,1682
86
- tinybird-0.0.1.dev228.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
87
- tinybird-0.0.1.dev228.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
88
- tinybird-0.0.1.dev228.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
89
- tinybird-0.0.1.dev228.dist-info/RECORD,,
85
+ tinybird-0.0.1.dev229.dist-info/METADATA,sha256=L3f2CdrGIrB29xoxfCof0f5s38emd119j3lnUUCZ3P8,1682
86
+ tinybird-0.0.1.dev229.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
87
+ tinybird-0.0.1.dev229.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
88
+ tinybird-0.0.1.dev229.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
89
+ tinybird-0.0.1.dev229.dist-info/RECORD,,