tinybird 0.0.1.dev100__py3-none-any.whl → 0.0.1.dev101__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/client.py CHANGED
@@ -915,6 +915,16 @@ class TinyB:
915
915
  }
916
916
  return await self._req(f"/v1/infra?{urlencode(params)}", method="POST")
917
917
 
918
+ async def infra_update(self, infra_id: str, organization_id: str, name: str, host: str) -> Dict[str, Any]:
919
+ params = {
920
+ "organization_id": organization_id,
921
+ }
922
+ if name:
923
+ params["name"] = name
924
+ if host:
925
+ params["host"] = host
926
+ return await self._req(f"/v1/infra/{infra_id}?{urlencode(params)}", method="PUT")
927
+
918
928
  async def infra_list(self, organization_id: str) -> List[Dict[str, Any]]:
919
929
  data = await self._req(f"/v1/infra?organization_id={organization_id}")
920
930
  return data.get("infras", [])
tinybird/sql.py CHANGED
@@ -174,7 +174,7 @@ def try_to_fix_nullable_in_simple_aggregating_function(t: str) -> Optional[str]:
174
174
  return result
175
175
 
176
176
 
177
- def schema_to_sql_columns(schema: List[Dict[str, Any]]) -> List[str]:
177
+ def schema_to_sql_columns(schema: List[Dict[str, Any]], skip_jsonpaths: bool = False) -> List[str]:
178
178
  """return an array with each column in SQL
179
179
  >>> schema_to_sql_columns([{'name': 'temperature', 'type': 'Float32', 'codec': None, 'default_value': None, 'nullable': False, 'normalized_name': 'temperature'}, {'name': 'temperature_delta', 'type': 'Float32', 'codec': 'CODEC(Delta(4), LZ4))', 'default_value': 'MATERIALIZED temperature', 'nullable': False, 'normalized_name': 'temperature_delta'}])
180
180
  ['`temperature` Float32', '`temperature_delta` Float32 MATERIALIZED temperature CODEC(Delta(4), LZ4))']
@@ -198,7 +198,7 @@ def schema_to_sql_columns(schema: List[Dict[str, Any]]) -> List[str]:
198
198
  else:
199
199
  _type = x["type"]
200
200
  parts = [col_name(name, backquotes=True), _type]
201
- if x.get("jsonpath", None):
201
+ if x.get("jsonpath", None) and not skip_jsonpaths:
202
202
  parts.append(f"`json:{x['jsonpath']}`")
203
203
  if "default_value" in x and x["default_value"] not in ("", None):
204
204
  parts.append(x["default_value"])
tinybird/sql_toolset.py CHANGED
@@ -10,6 +10,9 @@ from toposort import toposort
10
10
 
11
11
  from tinybird.ch_utils.constants import COPY_ENABLED_TABLE_FUNCTIONS, ENABLED_TABLE_FUNCTIONS
12
12
 
13
+ # VALID_REMOTE is used to explicitly vet queries sent to sql_toolset. In this module, when a table used in a query has
14
+ # VALID_REMOTE in the database portion (as in (VALID_REMOTE, "select * from cluster(tinybird, public.t_blabla)"), the
15
+ # query is not blocked, even if the rhs (the "select * ..." bit) is not found in the various collections of allowed tables.
13
16
  VALID_REMOTE = "VALID_REMOTE"
14
17
 
15
18
 
@@ -351,14 +354,24 @@ def is_invalid_resource(
351
354
  valid_tables: Optional[Set[Tuple[str, str]]] = None,
352
355
  ) -> bool:
353
356
  return is_invalid_resource_from_other_workspace(
354
- r, database, default_database, _replaced_with
357
+ r, database, default_database, _replaced_with, valid_tables
355
358
  ) or is_invalid_resource_from_current_workspace(r, database, default_database, _replaced_with, valid_tables)
356
359
 
357
360
 
358
361
  def is_invalid_resource_from_other_workspace(
359
- r: Tuple[str, str], database: str, default_database: str, _replaced_with: Set[Tuple[str, str]]
362
+ r: Tuple[str, str],
363
+ database: str,
364
+ default_database: str,
365
+ _replaced_with: Set[Tuple[str, str]],
366
+ valid_tables: Optional[Set[Tuple[str, str]]],
360
367
  ) -> bool:
361
- return database not in [default_database, "tinybird", VALID_REMOTE] and r not in _replaced_with
368
+ # return database not in [default_database, "tinybird", VALID_REMOTE] and r not in _replaced_with
369
+ return bool(
370
+ database not in [default_database, "tinybird", VALID_REMOTE]
371
+ and valid_tables
372
+ and r not in valid_tables
373
+ and r not in _replaced_with
374
+ )
362
375
 
363
376
 
364
377
  def is_invalid_resource_from_current_workspace(
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.dev100'
8
- __revision__ = 'ccb1518'
7
+ __version__ = '0.0.1.dev101'
8
+ __revision__ = '5dc0d4b'
@@ -183,6 +183,15 @@ class DatafileKind(Enum):
183
183
  return extension_map[extension]
184
184
 
185
185
 
186
+ KAFKA_PARAMS = {
187
+ "kafka_connection_name",
188
+ "kafka_topic",
189
+ "kafka_group_id",
190
+ }
191
+
192
+ REQUIRED_KAFKA_PARAMS = KAFKA_PARAMS
193
+
194
+
186
195
  class Datafile:
187
196
  def __init__(self) -> None:
188
197
  self.maintainer: Optional[str] = None
@@ -248,9 +257,10 @@ class Datafile:
248
257
  f"Invalid permission {token['permission']} for token {token['token_name']}. Only READ is allowed for pipes"
249
258
  )
250
259
  elif self.kind == DatafileKind.datasource:
251
- # TODO(eclbg):
252
260
  # [x] Just one node
253
261
  # [x] Engine is present
262
+ # [x] Token permissions are valid
263
+ # [x] If it's a kafka datasource, all required kafka params are present
254
264
  # [ ] ...
255
265
  if len(self.nodes) > 1:
256
266
  # Our users are not aware of data source data files being a single-node data file, hence this error
@@ -259,11 +269,20 @@ class Datafile:
259
269
  node = self.nodes[0]
260
270
  if "schema" not in node:
261
271
  raise DatafileValidationError("SCHEMA is mandatory")
272
+ # Validate token permissions
262
273
  for token in self.tokens:
263
274
  if token["permission"].upper() not in {"READ", "APPEND"}:
264
275
  raise DatafileValidationError(
265
276
  f"Invalid permission {token['permission']} for token {token['token_name']}. Only READ and APPEND are allowed for datasources"
266
277
  )
278
+ # Validate Kafka params
279
+ if any(param in node for param in KAFKA_PARAMS) and not all(
280
+ param in node for param in REQUIRED_KAFKA_PARAMS
281
+ ):
282
+ missing = [param for param in REQUIRED_KAFKA_PARAMS if param not in node]
283
+ raise DatafileValidationError(
284
+ f"Some Kafka params have been provided, but the following required ones are missing: {missing}"
285
+ )
267
286
  else:
268
287
  # We cannot validate a datafile whose kind is unknown
269
288
  pass
@@ -1427,6 +1446,7 @@ def parse(
1427
1446
  "include": include,
1428
1447
  "sql": sql("sql"),
1429
1448
  "version": version,
1449
+ # TODO(eclbg): We should decide on a single place to define the kafka params. Definitely not here.
1430
1450
  "kafka_connection_name": assign_var("kafka_connection_name"),
1431
1451
  "kafka_topic": assign_var("kafka_topic"),
1432
1452
  "kafka_group_id": assign_var("kafka_group_id"),
@@ -6,6 +6,7 @@ from pathlib import Path
6
6
  from typing import Optional
7
7
 
8
8
  import click
9
+ import pyperclip
9
10
  import requests
10
11
  from click import Context
11
12
 
@@ -217,11 +218,11 @@ def infra(ctx: Context) -> None:
217
218
 
218
219
  @infra.command(name="init")
219
220
  @click.option("--name", type=str, help="Name for identifying the self-managed infrastructure in Tinybird")
220
- @click.option("--provider", type=str, help="Infrastructure provider (aws, gcp, azure)")
221
- @click.option("--region", type=str, help="AWS region (for AWS provider)")
221
+ @click.option("--provider", type=str, help="Infrastructure provider. Possible values are: aws, gcp, azure)")
222
+ @click.option("--region", type=str, help="AWS region, when using aws as the provider")
222
223
  @click.option("--dns-zone-name", type=str, help="DNS zone name")
223
- @click.option("--namespace", type=str, help="Kubernetes namespace for deployment")
224
- @click.option("--dns-record", type=str, help="DNS record name to create (without domain, e.g. 'tinybird')")
224
+ @click.option("--namespace", type=str, help="Kubernetes namespace for the deployment")
225
+ @click.option("--dns-record", type=str, help="DNS record name to create, without domain. For example, 'tinybird')")
225
226
  @click.option("--storage-class", type=str, help="Storage class for the k8s StatefulSet")
226
227
  @click.option(
227
228
  "--auto-apply", is_flag=True, help="Automatically apply Terraform and kubectl configuration without prompting"
@@ -243,7 +244,7 @@ def infra_init(
243
244
  """Init infra"""
244
245
  # Check if provider is specified
245
246
  if not provider:
246
- click.echo("Error: --provider option is required. Please specify a provider (aws, gcp, azure).")
247
+ click.echo("Error: --provider option is required. Specify a provider. Possible values are: aws, gcp, azure.")
247
248
  return
248
249
 
249
250
  # AWS-specific Terraform template creation
@@ -266,27 +267,27 @@ def infra_init(
266
267
  config = json.load(f)
267
268
  click.echo("Loaded existing configuration from config.json")
268
269
  except json.JSONDecodeError:
269
- click.echo("Warning: Could not parse existing config.json, will create a new one")
270
+ click.echo("Warning: Could not parse existing config.json. Creating a new file...")
270
271
 
271
272
  # Generate a random ID for default values
272
273
  random_id = str(uuid.uuid4())[:8]
273
274
 
274
275
  # Get or prompt for configuration values
275
- name = name or click.prompt("Enter name", type=str)
276
- region = region or config.get("region") or click.prompt("Enter aws region", default="us-east-1", type=str)
277
- dns_zone_name = dns_zone_name or config.get("dns_zone_name") or click.prompt("Enter DNS zone name", type=str)
276
+ name = name or click.prompt("Enter the name for your self-managed region", type=str)
277
+ region = region or config.get("region") or click.prompt("Enter the AWS region", default="us-east-1", type=str)
278
+ dns_zone_name = dns_zone_name or config.get("dns_zone_name") or click.prompt("Enter the DNS zone name", type=str)
278
279
  namespace = (
279
280
  namespace
280
281
  or config.get("namespace")
281
- or click.prompt("Enter namespace name", default=f"tinybird-{random_id}", type=str)
282
+ or click.prompt("Enter the Kubernetes namespace", default=f"tinybird-{random_id}", type=str)
282
283
  )
283
284
  dns_record = (
284
285
  dns_record
285
286
  or config.get("dns_record")
286
- or click.prompt("Enter DNS record name (without domain)", default=f"tinybird-{random_id}", type=str)
287
+ or click.prompt("Enter the DNS record name, without domain", default=f"tinybird-{random_id}", type=str)
287
288
  )
288
289
  storage_class = config.get("storage_class") or click.prompt(
289
- "Enter storage class", default="gp3-encrypted", type=str
290
+ "Enter the Kubernetes storage class", default="gp3-encrypted", type=str
290
291
  )
291
292
 
292
293
  # Save configuration
@@ -407,7 +408,7 @@ def infra_init(
407
408
  available_contexts = [context.strip() for context in contexts_result.stdout.splitlines() if context.strip()]
408
409
 
409
410
  if not available_contexts:
410
- click.echo("No kubectl contexts found. Please configure kubectl first.")
411
+ click.echo("No kubectl contexts found. Configure kubectl first.")
411
412
  return
412
413
 
413
414
  # Prompt user to select a context
@@ -562,3 +563,62 @@ async def infra_ls(ctx: click.Context):
562
563
  click.echo(FeedbackManager.info(message="\n** Infras:"))
563
564
  echo_safe_humanfriendly_tables_format_smart_table(table_human_readable, column_names=columns)
564
565
  click.echo("\n")
566
+
567
+
568
+ @infra.command(name="create")
569
+ @click.option("--name", type=str, help="Name for identifying the self-managed infrastructure in Tinybird")
570
+ @click.option("--host", type=str, help="Host for the infrastructure")
571
+ @click.pass_context
572
+ @coro
573
+ async def infra_create(ctx: click.Context, name: str, host: str):
574
+ """Create a self-managed infrastructure"""
575
+ try:
576
+ client: TinyB = ctx.ensure_object(dict)["client"]
577
+ user_workspaces = await client.user_workspaces_with_organization()
578
+ admin_org_id = user_workspaces.get("organization_id")
579
+ if not admin_org_id:
580
+ raise CLIException("No organization associated to this workspace")
581
+ name = name or click.prompt("Enter name", type=str)
582
+ host = host or click.prompt("Enter host", type=str)
583
+ click.echo(FeedbackManager.highlight(message=f"\n» Creating infrastructure '{name}' in Tinybird..."))
584
+ infra = await client.infra_create(organization_id=admin_org_id, name=name, host=host)
585
+ click.echo(FeedbackManager.success(message=f"\n✓ Infrastructure '{name}' created"))
586
+ pyperclip.copy(infra["token"])
587
+ click.echo(FeedbackManager.info(message="Access token has been copied to your clipboard."))
588
+ click.echo(
589
+ FeedbackManager.info(message="Pass it as an environment variable in your deployment as TB_INFRA_TOKEN")
590
+ )
591
+ except Exception as e:
592
+ click.echo(FeedbackManager.error(message=f"✗ Error: {str(e)}"))
593
+
594
+
595
+ @infra.command(name="update")
596
+ @click.argument("infra_name")
597
+ @click.option("--name", type=str, help="Name for identifying the self-managed infrastructure in Tinybird")
598
+ @click.option("--host", type=str, help="Host for the infrastructure")
599
+ @click.pass_context
600
+ @coro
601
+ async def infra_update(ctx: click.Context, infra_name: str, name: str, host: str):
602
+ """Update a self-managed infrastructure"""
603
+ try:
604
+ client: TinyB = ctx.ensure_object(dict)["client"]
605
+ user_workspaces = await client.user_workspaces_with_organization()
606
+ admin_org_id = user_workspaces.get("organization_id")
607
+ if not admin_org_id:
608
+ raise CLIException("No organization associated to this workspace")
609
+
610
+ if not name and not host:
611
+ click.echo(
612
+ FeedbackManager.warning(message="No name or host provided. Please provide either a name or a host.")
613
+ )
614
+ return
615
+
616
+ if name or host:
617
+ infras = await client.infra_list(organization_id=admin_org_id)
618
+ infra_id = next((infra["id"] for infra in infras if infra["name"] == infra_name), None)
619
+ if not infra_id:
620
+ raise CLIException(f"Infrastructure '{infra_name}' not found")
621
+ click.echo(FeedbackManager.highlight(message=f"\n» Updating infrastructure '{infra_name}' in Tinybird..."))
622
+ await client.infra_update(infra_id=infra_id, organization_id=admin_org_id, name=name, host=host)
623
+ except Exception as e:
624
+ click.echo(FeedbackManager.error(message=f"✗ Error: {str(e)}"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev100
3
+ Version: 0.0.1.dev101
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -1,5 +1,5 @@
1
1
  tinybird/__cli__.py,sha256=esPl5QDTzuQgHe5FuxWLm-fURFigGGwjnYLh9GuWUw4,232
2
- tinybird/client.py,sha256=aDDifEWkVxJcm4WYaw6uUgXhav-e7JUW1N-mgtEjV4A,55087
2
+ tinybird/client.py,sha256=yc2BP2HiQhaUjU-t7nBuZEiJsb2nQMH3vBfOhKCciyU,55468
3
3
  tinybird/config.py,sha256=5UP_UZ2Qtlm5aOH5W7SbtN8r7X-8u3-r853joKqU5zs,6072
4
4
  tinybird/connectors.py,sha256=7Gjms7b5MAaBFGi3xytsJurCylprONpFcYrzp4Fw2Rc,15241
5
5
  tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
@@ -7,15 +7,15 @@ tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
7
7
  tinybird/feedback_manager.py,sha256=YSjtFDJvc8y66j2J0iIkb3SVzDdYAJbzFL-JPQ26pak,68761
8
8
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
9
9
  tinybird/prompts.py,sha256=syxUvbdkzxIrIK8pkS-Y7nzBx7DMS2Z9HaiXx7AjvnQ,33912
10
- tinybird/sql.py,sha256=LBi74GxhNAYTb6m2-KNGpAkguSKh7rcvBbERbE7nalA,46195
10
+ tinybird/sql.py,sha256=J35bhdpuu84HW2tiLp-cs_nzkRwPhiy1yPcFhcWMCR4,46248
11
11
  tinybird/sql_template.py,sha256=VH8io4n5eP2z6TEw111d8hcA9FKQerFjprKKCW2MODw,99127
12
12
  tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
13
- tinybird/sql_toolset.py,sha256=32SNvxRFKQYWTvYPMJ_u3ukcd1hKZyEqx8T2cv2412w,14697
13
+ tinybird/sql_toolset.py,sha256=KORVbNAUTfW1qo3U9oe7Z59xQ0QMsFhB0ji3HzY2JVo,15324
14
14
  tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
15
15
  tinybird/tornado_template.py,sha256=jjNVDMnkYFWXflmT8KU_Ssbo5vR8KQq3EJMk5vYgXRw,41959
16
16
  tinybird/ch_utils/constants.py,sha256=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj0,3890
17
17
  tinybird/ch_utils/engine.py,sha256=BZuPM7MFS7vaEKK5tOMR2bwSAgJudPrJt27uVEwZmTY,40512
18
- tinybird/tb/__cli__.py,sha256=5rOoJNw0w56lLAZpNCTlWF_nWVfCJL-SxcTE0FJGiG4,252
18
+ tinybird/tb/__cli__.py,sha256=9fN3V2hgGADGGvafwXcIrRciQG80C2cmQs_OlsP8u-A,252
19
19
  tinybird/tb/cli.py,sha256=H_HaZhkimKgkryYXpBjHfY9Qtg-ZORiONU3psDNpzDk,1135
20
20
  tinybird/tb/modules/auth.py,sha256=L1IatO2arRSzys3t8px8xVt8uPWUL5EVD0sFzAV_uVU,9022
21
21
  tinybird/tb/modules/build.py,sha256=h5drdmDFX8NHts9dA2Zepao7KSgMAl3DZGyFufVZP78,11085
@@ -32,7 +32,7 @@ tinybird/tb/modules/endpoint.py,sha256=EhVoGAXsFz-83Fiwj1gI-I73iRRvL49d0W81un7hv
32
32
  tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
33
33
  tinybird/tb/modules/feedback_manager.py,sha256=7nNiOx7OMebiheLED1r0d75SbuXCNxyBmF4e20rCBNc,69511
34
34
  tinybird/tb/modules/fmt.py,sha256=qpf9APqKTKL2uphNgdbj4OMVyLkAxZn6dn4eHF99L5g,3553
35
- tinybird/tb/modules/infra.py,sha256=l64FN62AB6N_ICisEonVsI_uQ_hzwZRBvupBjBJKac8,19707
35
+ tinybird/tb/modules/infra.py,sha256=vb6WmVHFuU1ZhtQMh2wOzRd2x8g7CLt_2gR3EL_L2E4,22867
36
36
  tinybird/tb/modules/job.py,sha256=956Pj8BEEsiD2GZsV9RKKVM3I_CveOLgS82lykO5ukk,2963
37
37
  tinybird/tb/modules/llm.py,sha256=AC0VSphTOM2t-v1_3NLvNN_FIbgMo4dTyMqIv5nniPo,835
38
38
  tinybird/tb/modules/llm_utils.py,sha256=nS9r4FAElJw8yXtmdYrx-rtI2zXR8qXfi1QqUDCfxvg,3469
@@ -61,7 +61,7 @@ tinybird/tb/modules/datafile/build.py,sha256=jhfIJ2xt0N13XsLPe3iMQIyCPApHS13_Df2
61
61
  tinybird/tb/modules/datafile/build_common.py,sha256=rT7VJ5mnQ68R_8US91DAtkusfvjWuG_NObOzNgtN_ko,4562
62
62
  tinybird/tb/modules/datafile/build_datasource.py,sha256=CCU3eQ8Rax9RgHHfbAXDRL6rQ49N35h_GDQnGrUUUzA,17379
63
63
  tinybird/tb/modules/datafile/build_pipe.py,sha256=w-Wd08gZYAEcak9FdBijVfIU2_Wn_PPdgAZddPpoGTo,11382
64
- tinybird/tb/modules/datafile/common.py,sha256=i9Gvhz3JiR58MRBcYZDwqTqamQOj-46TnHU8Hm8bqmg,81399
64
+ tinybird/tb/modules/datafile/common.py,sha256=ZRRx-9EXeHMOz6Lu9Y1TSWELF0ftfUHLLQAANjJZ334,82241
65
65
  tinybird/tb/modules/datafile/diff.py,sha256=-0J7PsBO64T7LOZSkZ4ZFHHCPvT7cKItnJkbz2PkndU,6754
66
66
  tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
67
67
  tinybird/tb/modules/datafile/fixture.py,sha256=si-9LB-LdKQSWDtVW82xDrHtFfko5bgBG1cvjqqrcPU,1064
@@ -81,8 +81,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
81
81
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
82
82
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
83
83
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
84
- tinybird-0.0.1.dev100.dist-info/METADATA,sha256=QaYp1xwcpo3MDoYY8ZGLSXI9ZHFKCV6I6bk2d9u6hRg,2586
85
- tinybird-0.0.1.dev100.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
86
- tinybird-0.0.1.dev100.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
87
- tinybird-0.0.1.dev100.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
88
- tinybird-0.0.1.dev100.dist-info/RECORD,,
84
+ tinybird-0.0.1.dev101.dist-info/METADATA,sha256=73sj_cIfixFVZVrtmkn_MwEYvtkMLO4GYeJCjJQ1KA0,2586
85
+ tinybird-0.0.1.dev101.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
86
+ tinybird-0.0.1.dev101.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
87
+ tinybird-0.0.1.dev101.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
88
+ tinybird-0.0.1.dev101.dist-info/RECORD,,