tinybird 0.0.1.dev50__py3-none-any.whl → 0.0.1.dev52__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/prompts.py CHANGED
@@ -779,7 +779,7 @@ You have commands at your disposal to develop a tinybird project:
779
779
  - {base_command} --build token ls: to list all the tokens
780
780
  There are other commands that you can use, but these are the most common ones. Run `{base_command} -h` to see all the commands if needed.
781
781
  When you need to work with resources or data in the Tinybird environment that you updated with the build command, add always the --build flag before the command. Example: {base_command} --build datasource ls
782
- When you need to work with resources or data in production, add always the --prod flag before the command. Example: {base_command} --prod datasource ls
782
+ When you need to work with resources or data in cloud, add always the --cloud flag before the command. Example: {base_command} --cloud datasource ls
783
783
  </command_calling>
784
784
  <development_instructions>
785
785
  - When asking to create a tinybird data project, if the needed folders are not already created, use the following structure:
@@ -799,8 +799,9 @@ When you need to work with resources or data in production, add always the --pro
799
799
  When asking for ingesting data, adding data or appending data do the following depending on the environment you want to work with:
800
800
  <ingest_data_instructions>
801
801
  - When building locally, create a .ndjson file with the data you want to ingest and do `{base_command} build` to ingest the data in the build env.
802
- - When appending data in production, use `{base_command} --prod datasource append <datasource_name> <file_name>`
803
- - When you have a response that says “there are rows in quarantine”, do `{base_command} --build|--prod datasource data <datasource_name>_quarantine` to understand what is the problem.
802
+ - We call `cloud` the production environment.
803
+ - When appending data in cloud, use `{base_command} --cloud datasource append <datasource_name> <file_name>`
804
+ - When you have a response that says “there are rows in quarantine”, do `{base_command} --build|--cloud datasource data <datasource_name>_quarantine` to understand what is the problem.
804
805
  </ingest_data_instructions>
805
806
  <datasource_file_instructions>
806
807
  Follow these instructions when creating or updating .datasource files:
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.dev50'
8
- __revision__ = 'ce37c39'
7
+ __version__ = '0.0.1.dev52'
8
+ __revision__ = '089e219'
@@ -55,7 +55,7 @@ VERSION = f"{__cli__.__version__} (rev {__cli__.__revision__})"
55
55
  @click.option("--token", help="Use auth token, defaults to TB_TOKEN envvar, then to the .tinyb file")
56
56
  @click.option("--host", help="Use custom host, defaults to TB_HOST envvar, then to https://api.tinybird.co")
57
57
  @click.option("--show-tokens", is_flag=True, default=False, help="Enable the output of tokens")
58
- @click.option("--prod/--local", is_flag=True, default=False, help="Run against production or local")
58
+ @click.option("--cloud/--local", is_flag=True, default=False, help="Run against cloud or local")
59
59
  @click.option("--build", is_flag=True, default=False, help="Run against build mode")
60
60
  @click.option("--folder", type=str, help="Folder where files will be placed")
61
61
  @click.version_option(version=VERSION)
@@ -67,7 +67,7 @@ async def cli(
67
67
  token: str,
68
68
  host: str,
69
69
  show_tokens: bool,
70
- prod: bool,
70
+ cloud: bool,
71
71
  build: bool,
72
72
  folder: Optional[str],
73
73
  ) -> None:
@@ -76,7 +76,7 @@ async def cli(
76
76
  """
77
77
  project = Project(folder=folder or os.getcwd())
78
78
  # We need to unpatch for our tests not to break
79
- if show_tokens or not prod or ctx.invoked_subcommand == "build" or build:
79
+ if show_tokens or not cloud or ctx.invoked_subcommand == "build" or build:
80
80
  __unpatch_click_output()
81
81
  else:
82
82
  __patch_click_output()
@@ -108,11 +108,13 @@ async def cli(
108
108
  config = await get_config(host, token)
109
109
  client = _get_tb_client(config.get("token", None), config["host"])
110
110
 
111
+ config["path"] = str(project.path)
111
112
  # If they have passed a token or host as paramter and it's different that record in .tinyb, refresh the workspace id
112
113
  if token or host:
113
114
  try:
114
115
  workspace = await client.workspace_info()
115
116
  config["id"] = workspace.get("id", "")
117
+ config["name"] = workspace.get("name", "")
116
118
  # If we can not get this info, we continue with the id on the file
117
119
  except (AuthNoTokenException, AuthException):
118
120
  pass
@@ -121,7 +123,7 @@ async def cli(
121
123
 
122
124
  logging.debug("debug enabled")
123
125
 
124
- client = await create_ctx_client(ctx, config, prod, build, project)
126
+ client = await create_ctx_client(ctx, config, cloud, build, project)
125
127
 
126
128
  if client:
127
129
  ctx.ensure_object(dict)["client"] = client
@@ -388,23 +390,23 @@ def __unpatch_click_output():
388
390
  click.secho = __old_click_secho
389
391
 
390
392
 
391
- async def create_ctx_client(ctx: Context, config: Dict[str, Any], prod: bool, build: bool, project: Project):
393
+ async def create_ctx_client(ctx: Context, config: Dict[str, Any], cloud: bool, build: bool, project: Project):
392
394
  commands_without_ctx_client = ["auth", "check", "login", "local"]
393
395
  command = ctx.invoked_subcommand
394
396
  if command in commands_without_ctx_client:
395
397
  return None
396
398
 
397
- commands_always_prod = ["pull"]
399
+ commands_always_cloud = ["pull"]
398
400
  commands_always_build = ["build", "test"]
399
401
  commands_always_local = ["create", "mock"]
400
402
  if (
401
- (prod or command in commands_always_prod)
403
+ (cloud or command in commands_always_cloud)
402
404
  and command not in commands_always_build
403
405
  and command not in commands_always_local
404
406
  ):
405
- click.echo(FeedbackManager.gray(message=f"Running against {config.get('name') or 'production'}"))
407
+ click.echo(FeedbackManager.gray(message=f"Running against {config.get('name') or 'cloud'}"))
406
408
  return _get_tb_client(config.get("token", None), config["host"])
407
409
  build = command in commands_always_build or build
408
410
  if not build and command not in commands_always_local and command not in commands_always_build:
409
411
  click.echo(FeedbackManager.gray(message="Running against Tinybird local\n"))
410
- return await get_tinybird_local_client(str(project.path), build=build)
412
+ return await get_tinybird_local_client(config, build=build)
@@ -1,6 +1,7 @@
1
1
  import hashlib
2
2
  import logging
3
3
  import os
4
+ from typing import Any, Dict
4
5
 
5
6
  import requests
6
7
 
@@ -8,23 +9,24 @@ from tinybird.client import AuthNoTokenException, TinyB
8
9
  from tinybird.tb.modules.config import CLIConfig
9
10
  from tinybird.tb.modules.exceptions import CLIException
10
11
 
11
- TB_IMAGE_NAME = "registry.gitlab.com/tinybird/analytics/tinybird-local-jammy-3.11:beta"
12
+ TB_IMAGE_NAME = "tinybirdco/tinybird-local:beta"
12
13
  TB_CONTAINER_NAME = "tinybird-local"
13
14
  TB_LOCAL_PORT = int(os.getenv("TB_LOCAL_PORT", 80))
14
15
  TB_LOCAL_HOST = f"http://localhost:{TB_LOCAL_PORT}"
15
16
 
16
17
 
17
- async def get_tinybird_local_client(path: str, build: bool = False) -> TinyB:
18
+ async def get_tinybird_local_client(config_obj: Dict[str, Any], build: bool = False) -> TinyB:
18
19
  """Get a Tinybird client connected to the local environment."""
19
- config = await get_tinybird_local_config(path, build=build)
20
+ config = await get_tinybird_local_config(config_obj, build=build)
20
21
  return config.get_client(host=TB_LOCAL_HOST)
21
22
 
22
23
 
23
- async def get_tinybird_local_config(path: str, build: bool = False) -> CLIConfig:
24
+ async def get_tinybird_local_config(config_obj: Dict[str, Any], build: bool = False) -> CLIConfig:
24
25
  """Craft a client config with a workspace name based on the path of the project files
25
26
 
26
27
  It uses the tokens from tinybird local
27
28
  """
29
+ path = config_obj.get("path")
28
30
  config = CLIConfig.get_project_config(path)
29
31
 
30
32
  try:
@@ -34,26 +36,26 @@ async def get_tinybird_local_config(path: str, build: bool = False) -> CLIConfig
34
36
  raise CLIException("Tinybird local is not running. Please run `tb local start` first.")
35
37
 
36
38
  user_token = tokens["user_token"]
39
+ admin_token = tokens["admin_token"]
37
40
  default_token = tokens["workspace_admin_token"]
38
41
  # Create a new workspace if path is provided. This is used to isolate the build in a different workspace.
39
- path = path or os.getcwd()
40
42
  if path:
41
43
  folder_hash = hashlib.sha256(path.encode()).hexdigest()
42
44
  user_client = config.get_client(host=TB_LOCAL_HOST, token=user_token)
43
- ws_name = f"Tinybird_Local_Build_{folder_hash}" if build else config.get("name")
45
+ ws_name = f"Tinybird_Local_Build_{folder_hash}" if build else config.get("name") or config_obj.get("name")
44
46
  if not ws_name:
45
47
  raise AuthNoTokenException()
46
48
 
47
49
  logging.debug(f"Workspace used for build: {ws_name}")
48
50
 
49
- user_workspaces = requests.get(f"{TB_LOCAL_HOST}/v0/user/workspaces?token={user_token}").json()
51
+ user_workspaces = requests.get(f"{TB_LOCAL_HOST}/v0/user/workspaces?token={admin_token}").json()
50
52
  local_workspaces = user_workspaces.get("workspaces", [])
51
53
 
52
54
  ws = next((ws for ws in local_workspaces if ws["name"] == ws_name), None)
53
55
 
54
56
  if not ws:
55
57
  await user_client.create_workspace(ws_name, template=None)
56
- user_workspaces = requests.get(f"{TB_LOCAL_HOST}/v0/user/workspaces?token={user_token}").json()
58
+ user_workspaces = requests.get(f"{TB_LOCAL_HOST}/v0/user/workspaces?token={admin_token}").json()
57
59
  ws = next((ws for ws in user_workspaces["workspaces"] if ws["name"] == ws_name), None)
58
60
  if not ws:
59
61
  raise AuthNoTokenException()
@@ -34,35 +34,16 @@ class AuthHandler(http.server.SimpleHTTPRequestHandler):
34
34
  height: 100vh;
35
35
  margin: 0;
36
36
  }
37
- .message {
38
- background: white;
39
- padding: 2rem 3rem;
40
- border-radius: 8px;
41
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
42
- text-align: center;
43
- display: flex;
44
- flex-direction: column;
45
- align-items: center;
46
- }
47
- h1 {
48
- color: #25283D;
49
- font-size: 1.2rem;
50
- margin: 0;
51
- font-weight: 500;
52
- }
53
37
  </style>
54
38
  </head>
55
39
  <body>
56
- <div class="message">
57
- <h1>Authenticating...</h1>
58
- </div>
59
40
  <script>
60
- var hash = window.location.hash.substr(1);
61
- var access_token = new URLSearchParams(hash).get('access_token');
62
- window.history.pushState({}, '', '/');
63
- fetch('/?token=' + access_token, {method: 'POST'})
41
+ const searchParams = new URLSearchParams(window.location.search);
42
+ const code = searchParams.get('code');
43
+ const workspace = searchParams.get('workspace');
44
+ fetch('/?code=' + code, {method: 'POST'})
64
45
  .then(() => {
65
- document.querySelector('.message h1').textContent = 'Authentication successful! You can close this window.';
46
+ window.location.href = "https://cloud.tinybird.co/cli-login?workspace=" + workspace;
66
47
  });
67
48
  </script>
68
49
  </body>
@@ -73,13 +54,13 @@ class AuthHandler(http.server.SimpleHTTPRequestHandler):
73
54
  parsed_path = urllib.parse.urlparse(self.path)
74
55
  query_params = urllib.parse.parse_qs(parsed_path.query)
75
56
 
76
- if "token" in query_params:
77
- token = query_params["token"][0]
78
- self.server.auth_callback(token) # type: ignore
57
+ if "code" in query_params:
58
+ code = query_params["code"][0]
59
+ self.server.auth_callback(code) # type: ignore
79
60
  self.send_response(200)
80
61
  self.end_headers()
81
62
  else:
82
- self.send_error(400, "Missing 'token' parameter")
63
+ self.send_error(400, "Missing 'code' parameter")
83
64
 
84
65
  self.server.shutdown()
85
66
 
@@ -112,12 +93,17 @@ def start_server(auth_callback):
112
93
  "--host",
113
94
  help="Set custom host if it's different than https://api.tinybird.co. See https://www.tinybird.co/docs/api-reference/overview#regions-and-endpoints for the available list of regions.",
114
95
  )
96
+ @click.option(
97
+ "--auth-host",
98
+ default="https://cloud.tinybird.co",
99
+ help="Set the host to authenticate to. If unset, the default host will be used.",
100
+ )
115
101
  @click.option(
116
102
  "--workspace",
117
103
  help="Set the workspace to authenticate to. If unset, the default workspace will be used.",
118
104
  )
119
105
  @coro
120
- async def login(host: str, workspace: str):
106
+ async def login(host: str, auth_host: str, workspace: str):
121
107
  """Authenticate using the browser."""
122
108
  auth_event = threading.Event()
123
109
  auth_code = [None] # Using a list to store the code, as it's mutable
@@ -135,30 +121,23 @@ async def login(host: str, workspace: str):
135
121
  server_thread.start()
136
122
 
137
123
  # Open the browser to the auth page
138
- if "wadus" in host:
139
- client_id = "Rpl7Uy9aSjqoPCSvHgGl3zNQuZcSOXBe"
140
- base_auth_url = "https://auth.wadus1.tinybird.co"
141
- else:
142
- client_id = "T6excMo8IKguvUw4vFNYfqlt9pe6msCU"
143
- base_auth_url = "https://auth.tinybird.co"
144
124
  callback_url = f"http://localhost:{AUTH_SERVER_PORT}"
145
125
  params = {
146
- "client_id": client_id,
147
126
  "redirect_uri": callback_url,
148
- "response_type": "token",
149
- "scope": "openid profile email",
150
127
  }
151
- auth_url = f"{base_auth_url}/authorize?{urlencode(params)}"
128
+
129
+ if workspace:
130
+ params["workspace"] = workspace
131
+
132
+ auth_url = f"{auth_host}/api/cli-login?{urlencode(params)}"
152
133
  webbrowser.open(auth_url)
153
134
 
154
135
  # Wait for the authentication to complete or timeout
155
136
  if auth_event.wait(timeout=60): # Wait for up to 60 seconds
156
137
  params = {}
157
- if workspace:
158
- params["workspace_id"] = workspace
138
+ params["code"] = auth_code[0]
159
139
  response = requests.get( # noqa: ASYNC210
160
- f"{host}/v0/user/tokens?{urlencode(params)}",
161
- headers={"Authorization": f"Bearer {auth_code[0]}"},
140
+ f"{auth_host}/api/cli-login?{urlencode(params)}",
162
141
  )
163
142
 
164
143
  data = response.json()
@@ -168,15 +147,15 @@ async def login(host: str, workspace: str):
168
147
  cli_config.set_user_token(data.get("user_token", ""))
169
148
  cli_config.set_host(host)
170
149
 
171
- ws = await cli_config.get_client().workspace_info()
150
+ ws = await cli_config.get_client(token=data.get("workspace_token", "")).workspace_info()
172
151
  for k in ("id", "name", "user_email", "user_id", "scope"):
173
152
  if k in ws:
174
153
  cli_config[k] = ws[k]
175
154
 
176
155
  cli_config.persist_to_file()
177
- click.echo(FeedbackManager.info(message="\nWorkspace: %s" % ws["name"]))
178
- click.echo(FeedbackManager.info(message="User: %s" % ws["user_email"]))
179
- click.echo(FeedbackManager.info(message="Host: %s" % host))
156
+ click.echo(FeedbackManager.gray(message="\nWorkspace: ") + FeedbackManager.info(message=ws["name"]))
157
+ click.echo(FeedbackManager.gray(message="User: ") + FeedbackManager.info(message=ws["user_email"]))
158
+ click.echo(FeedbackManager.gray(message="Host: ") + FeedbackManager.info(message=host))
180
159
  click.echo(FeedbackManager.success(message="\n✓ Authentication successful!"))
181
160
  else:
182
161
  click.echo(FeedbackManager.error(message="Authentication failed or timed out."))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tinybird
3
- Version: 0.0.1.dev50
3
+ Version: 0.0.1.dev52
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -6,7 +6,7 @@ tinybird/context.py,sha256=A3GBApac9xO6hrAMJ1s9dMrI_ou9aKF84CdEjtPddMk,1417
6
6
  tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
7
7
  tinybird/feedback_manager.py,sha256=g1r9NcFfKXdk_13soaiTZLvdoUGleVfawl6Yfj3zmRw,67823
8
8
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
9
- tinybird/prompts.py,sha256=unaqHksayhVtxFaTTxuL6Dftb1IM9vQncXtpTI3pxuY,30545
9
+ tinybird/prompts.py,sha256=3Yx0atKYf0uE1YKN04HU0h-kJGEHKt0OItPhDgOYGKI,30585
10
10
  tinybird/sql.py,sha256=LBi74GxhNAYTb6m2-KNGpAkguSKh7rcvBbERbE7nalA,46195
11
11
  tinybird/sql_template.py,sha256=GmMLAI10MTqjQo9qztuQHLRWs67teozsWDxUBdvkAn4,93668
12
12
  tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
@@ -15,12 +15,12 @@ tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
15
15
  tinybird/tornado_template.py,sha256=FL85SMPq2dH4JqKovmSbaolGdEzwOO91NqOzqXo2Qr0,41863
16
16
  tinybird/ch_utils/constants.py,sha256=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj0,3890
17
17
  tinybird/ch_utils/engine.py,sha256=OXkBhlzGjZotjD0vaT-rFIbSGV4tpiHxE8qO_ip0SyQ,40454
18
- tinybird/tb/__cli__.py,sha256=cKGrrXAl7KnVAvMksFSzNWU1rVZC5C-NHFyK0FbUxNE,251
18
+ tinybird/tb/__cli__.py,sha256=IBx_XSP1q2ge9y0mmA6ZqDind5oGjb9jTywt-9A8TQU,251
19
19
  tinybird/tb/cli.py,sha256=FD1pfbzu9YHJHEG6Vtn_EwPLTYhwqw-I6AxXeTaRHU8,926
20
20
  tinybird/tb/modules/auth.py,sha256=EzRWFmwRkXNhUmRaruEVFLdkbUg8xMSix0cAWl5D4Jg,9029
21
21
  tinybird/tb/modules/build.py,sha256=bGx4sON9g90zVBVCd16La-1yV1nWZ_AY-2RZ77sco0s,8361
22
22
  tinybird/tb/modules/cicd.py,sha256=xxXwy-QekJcG14kkJeGNl7LkHduhZXfvBZE8WrU6-t4,5351
23
- tinybird/tb/modules/cli.py,sha256=2nQxwooYcvp0nrgI36yr4ZC1ka9LD3lr4B4TWg3SRUQ,16086
23
+ tinybird/tb/modules/cli.py,sha256=ILZ39TNbT7QuimzRayAU1NAYBmWWhE66pAbVDUlKWMU,16167
24
24
  tinybird/tb/modules/common.py,sha256=TWcGJUgzJCQvzI1oMKbNdx-KTRmMGvB25BawHpsaV8Q,70610
25
25
  tinybird/tb/modules/config.py,sha256=mie3oMVTf5YOUFEiLs88P16U4LkJafJjSpjwyAkFHog,10979
26
26
  tinybird/tb/modules/copy.py,sha256=wxyxZg8BPiWDgbW5HXJKYQp7_EumBXmAilo3McbCQOo,5916
@@ -35,8 +35,8 @@ tinybird/tb/modules/job.py,sha256=956Pj8BEEsiD2GZsV9RKKVM3I_CveOLgS82lykO5ukk,29
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=x4xuCGVkoa8KLYGZEJnFUP8HUkKX05Frp_djRVjVjTs,5669
38
- tinybird/tb/modules/local_common.py,sha256=UW6tNexC98aGRC6ca2w8qDDzyTTn-GDfr3uRy7zRHBM,2767
39
- tinybird/tb/modules/login.py,sha256=cnB2Vwjc94FpG9C-7Y-l7Lb0Xilp2oUFDzqbQW0tpkU,6519
38
+ tinybird/tb/modules/local_common.py,sha256=W1fEnB1vBQ4YC5U1PdA0w0g3cTV78bQ5R-lRxdDj5-Y,2868
39
+ tinybird/tb/modules/login.py,sha256=bzZ5HyG3lD1DvWFrSXZKVJVUxRNEnmd_wXLITJbyalg,5733
40
40
  tinybird/tb/modules/materialization.py,sha256=HQKRTH6lkcYiDQJihbFqF_in58ezXG4ggZ_7Ywp_nUM,5738
41
41
  tinybird/tb/modules/mock.py,sha256=PzFtZL-6bZAZ3EiCC2nYJo058I4m50fD7FcBHISn3cI,5235
42
42
  tinybird/tb/modules/pipe.py,sha256=pH2KwgH6Xbvl3kT8vMelpKvT6bcyB4EKFDvGfOsxXbg,2418
@@ -74,8 +74,8 @@ tinybird/tb_cli_modules/config.py,sha256=6u6B5QCdiQLbJkCkwtnKGs9H3nP-KXXhC75mF7B
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.dev50.dist-info/METADATA,sha256=sHW1V0sKWKhAnBz7c01CAdci9nxkirPHycgQ2vzpHT0,2482
78
- tinybird-0.0.1.dev50.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
79
- tinybird-0.0.1.dev50.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
80
- tinybird-0.0.1.dev50.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
81
- tinybird-0.0.1.dev50.dist-info/RECORD,,
77
+ tinybird-0.0.1.dev52.dist-info/METADATA,sha256=SiIvJoWFT3tstvtnBfuqv3v_tjkswAQ-z-wrB8J8UwA,2482
78
+ tinybird-0.0.1.dev52.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
79
+ tinybird-0.0.1.dev52.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
80
+ tinybird-0.0.1.dev52.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
81
+ tinybird-0.0.1.dev52.dist-info/RECORD,,