tinybird 0.0.1.dev119__py3-none-any.whl → 0.0.1.dev120__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/datatypes.py CHANGED
@@ -5,11 +5,14 @@ from decimal import Decimal
5
5
  from typing import Callable, Dict, List, Optional, Tuple
6
6
 
7
7
  datetime64_patterns = [
8
- r"\d\d\d\d.\d\d.\d\d(T|\s)\d\d:\d\d:\d\d.\d\d\d",
9
- r"\d\d.\d\d.\d\d\d\d.\d{1,2}:\d{1,2}:\d{1,2}.\d{1,3}",
8
+ re.compile(r"\d\d\d\d.\d\d.\d\d(T|\s)\d\d:\d\d:\d\d.\d\d\d"),
9
+ re.compile(r"\d\d.\d\d.\d\d\d\d.\d{1,2}:\d{1,2}:\d{1,2}.\d{1,3}"),
10
10
  ]
11
11
 
12
- datetime_patterns = [r"\d\d\d\d.\d\d.\d\d(T|\s)\d\d:\d\d:\d\d", r"\d\d.\d\d.\d\d\d\d.\d{1,2}:\d{1,2}:\d{1,2}"]
12
+ datetime_patterns = [
13
+ re.compile(r"\d\d\d\d.\d\d.\d\d(T|\s)\d\d:\d\d:\d\d"),
14
+ re.compile(r"\d\d.\d\d.\d\d\d\d.\d{1,2}:\d{1,2}:\d{1,2}"),
15
+ ]
13
16
 
14
17
  int_8_max = 2**7
15
18
  int16_max = 2**15
@@ -23,13 +26,15 @@ uint32_max = 2**32
23
26
  uint64_max = 2**64
24
27
  uint128_max = 2**128
25
28
  uint256_max = 2**256
26
- intx_re = r"^[+-]?\d+$"
27
- uintx_re = r"^\d+$"
29
+ intx_re = re.compile(r"^[+-]?\d+$")
30
+ uintx_re = re.compile(r"^\d+$")
28
31
  float32_max = 2**23 # 23 bits is the fractional part of float 32 ieee754
29
32
  float64_max = 2**52 # 51 bits is the fractional part of float 64 ieee754
30
33
 
31
- datetime64_type_pattern = r"^DateTime64(\([1-9](, ?'.+')?\))?$"
32
- datetime_type_pattern = r"^DateTime(\(('.+')?)?\)?$"
34
+ date_pattern = re.compile(r"\d\d\d\d-\d\d-\d\d$")
35
+
36
+ datetime64_type_pattern = re.compile(r"^DateTime64(\([1-9](, ?'.+')?\))?$")
37
+ datetime_type_pattern = re.compile(r"^DateTime(\(('.+')?)?\)?$")
33
38
 
34
39
  # List from https://github.com/tinybirdco/ClickHousePrivate/blob/153473d9c1c871974688a1d72dcff7a13fc2076c/src/DataTypes/Serializations/SerializationBool.cpp#L216
35
40
  bool_allowed_values = {
@@ -71,7 +76,7 @@ def is_type_datetime64(type_to_check: str) -> bool:
71
76
  >>> is_type_datetime64("datetime64")
72
77
  False
73
78
  """
74
- return re.match(datetime64_type_pattern, type_to_check) is not None
79
+ return datetime64_type_pattern.match(type_to_check) is not None
75
80
 
76
81
 
77
82
  def is_type_datetime(type_to_check: str) -> bool:
@@ -87,7 +92,7 @@ def is_type_datetime(type_to_check: str) -> bool:
87
92
  >>> is_type_datetime("datetime")
88
93
  False
89
94
  """
90
- return re.match(datetime_type_pattern, type_to_check) is not None
95
+ return datetime_type_pattern.match(type_to_check) is not None
91
96
 
92
97
 
93
98
  def string_test(x: str) -> bool:
@@ -95,63 +100,63 @@ def string_test(x: str) -> bool:
95
100
 
96
101
 
97
102
  def date_test(x: str) -> bool:
98
- return re.match(r"\d\d\d\d-\d\d-\d\d$", x) is not None
103
+ return date_pattern.match(x) is not None
99
104
 
100
105
 
101
106
  def datetime64_test(x: str) -> bool:
102
- return any([re.match(p, x) for p in datetime64_patterns])
107
+ return any([p.match(x) for p in datetime64_patterns])
103
108
 
104
109
 
105
110
  def datetime_test(x: str) -> bool:
106
- return any([re.match(p, x) for p in datetime_patterns])
111
+ return any([p.match(x) for p in datetime_patterns])
107
112
 
108
113
 
109
114
  def int_8_test(x: str) -> bool:
110
- return re.match(intx_re, x) is not None and -int_8_max <= int(x) < int_8_max
115
+ return intx_re.match(x) is not None and -int_8_max <= int(x) < int_8_max
111
116
 
112
117
 
113
118
  def int16_test(x: str) -> bool:
114
- return re.match(intx_re, x) is not None and -int16_max <= int(x) < int16_max
119
+ return intx_re.match(x) is not None and -int16_max <= int(x) < int16_max
115
120
 
116
121
 
117
122
  def int32_test(x: str) -> bool:
118
- return re.match(intx_re, x) is not None and -int32_max <= int(x) < int32_max
123
+ return intx_re.match(x) is not None and -int32_max <= int(x) < int32_max
119
124
 
120
125
 
121
126
  def int64_test(x: str) -> bool:
122
- return re.match(intx_re, x) is not None and -int64_max <= int(x) < int64_max
127
+ return intx_re.match(x) is not None and -int64_max <= int(x) < int64_max
123
128
 
124
129
 
125
130
  def int128_test(x: str) -> bool:
126
- return re.match(intx_re, x) is not None and -int128_max <= int(x) < int128_max
131
+ return intx_re.match(x) is not None and -int128_max <= int(x) < int128_max
127
132
 
128
133
 
129
134
  def int256_test(x: str) -> bool:
130
- return re.match(intx_re, x) is not None and -int256_max <= int(x) < int256_max
135
+ return intx_re.match(x) is not None and -int256_max <= int(x) < int256_max
131
136
 
132
137
 
133
138
  def uint_8_test(x: str) -> bool:
134
- return re.match(uintx_re, x) is not None and 0 <= int(x) < uint_8_max
139
+ return uintx_re.match(x) is not None and 0 <= int(x) < uint_8_max
135
140
 
136
141
 
137
142
  def uint16_test(x: str) -> bool:
138
- return re.match(uintx_re, x) is not None and 0 <= int(x) < uint16_max
143
+ return uintx_re.match(x) is not None and 0 <= int(x) < uint16_max
139
144
 
140
145
 
141
146
  def uint32_test(x: str) -> bool:
142
- return re.match(uintx_re, x) is not None and 0 <= int(x) < uint32_max
147
+ return uintx_re.match(x) is not None and 0 <= int(x) < uint32_max
143
148
 
144
149
 
145
150
  def uint64_test(x: str) -> bool:
146
- return re.match(uintx_re, x) is not None and 0 <= int(x) < uint64_max
151
+ return uintx_re.match(x) is not None and 0 <= int(x) < uint64_max
147
152
 
148
153
 
149
154
  def uint128_test(x: str) -> bool:
150
- return re.match(intx_re, x) is not None and 0 <= int(x) < uint128_max
155
+ return intx_re.match(x) is not None and 0 <= int(x) < uint128_max
151
156
 
152
157
 
153
158
  def uint256_test(x: str) -> bool:
154
- return re.match(intx_re, x) is not None and 0 <= int(x) < uint256_max
159
+ return intx_re.match(x) is not None and 0 <= int(x) < uint256_max
155
160
 
156
161
 
157
162
  def float_test(x: str) -> bool:
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.dev119'
8
- __revision__ = 'bbe4729'
7
+ __version__ = '0.0.1.dev120'
8
+ __revision__ = 'a558f0d'
tinybird/tb/client.py CHANGED
@@ -1170,6 +1170,13 @@ class TinyB:
1170
1170
  response = await self._req(f"/v0/connectors/snowflake/warehouses?{urlencode(params)}", method="POST", data="")
1171
1171
  return response["warehouses"]
1172
1172
 
1173
+ async def check_aws_credentials(self) -> bool:
1174
+ try:
1175
+ await self._req("/v0/integrations/s3/settings")
1176
+ return True
1177
+ except Exception:
1178
+ return False
1179
+
1173
1180
  async def get_trust_policy(self, service: str) -> Dict[str, Any]:
1174
1181
  return await self._req(f"/v0/integrations/{service}/policies/trust-policy")
1175
1182
 
@@ -151,6 +151,15 @@ async def connection_create_s3(ctx: Context) -> None:
151
151
  obj: Dict[str, Any] = ctx.ensure_object(dict)
152
152
  client: TinyB = obj["client"]
153
153
 
154
+ if obj["env"] == "local" and not await client.check_aws_credentials():
155
+ click.echo(
156
+ FeedbackManager.error(
157
+ message="No AWS credentials found. Please run `tb local restart --use-aws-creds` to pass your credentials. "
158
+ "Read more about this in https://www.tinybird.co/docs/forward/get-data-in/connectors/s3#local-environment"
159
+ )
160
+ )
161
+ return
162
+
154
163
  service = DataConnectorType.AMAZON_S3
155
164
  click.echo(FeedbackManager.prompt_s3_connection_header())
156
165
  connection_name = get_s3_connection_name(project.folder)
@@ -810,6 +810,31 @@ def _parse_table_structure(schema: str) -> List[Dict[str, Any]]:
810
810
  detected_type = parse_expr(
811
811
  [NULL, NOTNULL, DEFAULT, MATERIALIZED, ALIAS, CODEC, TTL, JSONPATH, COMMA], "TYPE"
812
812
  )
813
+
814
+ # Boolean type is supported in ClickHouse but its behavior is strange and will lead to unexpected results.
815
+ # Better to use Bool or UInt8 instead. An example:
816
+ #
817
+ # SELECT
818
+ # CAST(true, 'Boolean') AS bool,
819
+ # toTypeName(bool)
820
+ #
821
+ # ┌─bool─┬─toTypeName(bool)─┐
822
+ # │ true │ Bool │
823
+ # └──────┴──────────────────┘
824
+ if "boolean" in detected_type.lower():
825
+ raise SchemaSyntaxError(
826
+ message="Boolean type is not supported",
827
+ hint="Hint: use Bool or UInt8 instead",
828
+ lineno=line,
829
+ pos=pos,
830
+ )
831
+ if "datetime64" in detected_type.lower() and "datetime64(" not in detected_type.lower():
832
+ raise SchemaSyntaxError(
833
+ message="DateTime64 type without precision is not supported",
834
+ hint="Hint: use DateTime64(3) instead",
835
+ lineno=line,
836
+ pos=pos,
837
+ )
813
838
  try:
814
839
  # Imported in the body to be compatible with the CLI
815
840
  from chtoolset.query import check_compatible_types
@@ -441,6 +441,7 @@ class FeedbackManager:
441
441
  error_tag_generic = error_message("There was an issue updating tags. {error}")
442
442
  error_tag_not_found = error_message("Tag {tag_name} not found.")
443
443
  error_build_failed = error_message("Build failed")
444
+ error_request_failed = error_message("Request failed with status code {status_code}, please try again later.")
444
445
 
445
446
  info_incl_relative_path = info_message("** Relative path {path} does not exist, skipping.")
446
447
  info_ignoring_incl_file = info_message(
@@ -1,5 +1,11 @@
1
1
  import requests
2
2
 
3
+ from tinybird.tb.modules.feedback_manager import FeedbackManager
4
+
5
+
6
+ class LLMException(Exception):
7
+ pass
8
+
3
9
 
4
10
  class LLM:
5
11
  def __init__(
@@ -29,4 +35,8 @@ class LLM:
29
35
  headers={"Authorization": f"Bearer {self.user_token}"},
30
36
  data=data,
31
37
  )
38
+
39
+ if not response.ok:
40
+ raise LLMException(FeedbackManager.error_request_failed(status_code=response.status_code))
41
+
32
42
  return response.json().get("result", "")
@@ -207,7 +207,11 @@ def update_cli() -> None:
207
207
  text=True,
208
208
  )
209
209
  except FileNotFoundError:
210
- raise CLIException("Cannot find required tool: uv. Reinstall using: curl https://tinybird.co | sh")
210
+ raise CLIException(
211
+ FeedbackManager.error(
212
+ message="Cannot find required tool: uv. Reinstall using: curl https://tinybird.co | sh"
213
+ )
214
+ )
211
215
 
212
216
  stdout, stderr = process.communicate()
213
217
  if "Nothing to upgrade" not in stdout + stderr:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev119
3
+ Version: 0.0.1.dev120
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -1,6 +1,6 @@
1
1
  tinybird/connectors.py,sha256=7Gjms7b5MAaBFGi3xytsJurCylprONpFcYrzp4Fw2Rc,15241
2
2
  tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
3
- tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
3
+ tinybird/datatypes.py,sha256=r4WCvspmrXTJHiPjjyOTiZyZl31FO3Ynkwq4LQsYm6E,11059
4
4
  tinybird/feedback_manager.py,sha256=a_ZhFX2zcB7vRknIcmHKMdQbb0c7TqlTBQ_5hPuWh88,69267
5
5
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
6
6
  tinybird/prompts.py,sha256=6J-dE0gOSOaIwdEwJUhEQS1Ztllz_qZnpnrv-tDoJWA,35511
@@ -12,9 +12,9 @@ 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=17vHNVcPbqx_TWEowqxodoPtHhbxEqUTKuhIYCtjQDY,252
15
+ tinybird/tb/__cli__.py,sha256=UPIBtmA_KZNY0wM1HvtBDT0JZJO0puY_D9DLW6X0pDw,252
16
16
  tinybird/tb/cli.py,sha256=uDLwcbwSJfVFw-pceijZJqaq26z5jNsey0QaUGFjt7w,1097
17
- tinybird/tb/client.py,sha256=4SQE1Ke8ZAIbCkGfGlDm2ChCESRy_oYtWK7ZW6aZmhA,55464
17
+ tinybird/tb/client.py,sha256=MxhpIC5lkL8JOaS1CxftmE_GxjYGBw4xx9yJzMFm3fM,55664
18
18
  tinybird/tb/config.py,sha256=3bEyh6sECiAm41L9Nr_ALkvprMyuzvQSvVPrljFbg68,3790
19
19
  tinybird/tb/modules/auth.py,sha256=_OeYnmTH83lnqCgQEdS6K0bx1KBUeRmZk2M7JnRmWpk,9037
20
20
  tinybird/tb/modules/build.py,sha256=4yP8QJd2YYr1w9XWCSRqB6CztfVzN6gL75p32UYJvdc,15566
@@ -22,20 +22,20 @@ tinybird/tb/modules/cicd.py,sha256=A7zJZF9HkJ6NPokplgNjmefMrpUlRbFxBbjMZhq5OTI,7
22
22
  tinybird/tb/modules/cli.py,sha256=Y_5hu9xwyTIZw4bQoe0MYLnRIzmR7hUjql_oZBxd4Qg,13407
23
23
  tinybird/tb/modules/common.py,sha256=d5h5jSibRXcaDY3d4XkQ5cBjLwSWDPPPQOQFeAuNlV0,84081
24
24
  tinybird/tb/modules/config.py,sha256=ziqW_t_mRVvWOd85VoB4vKyvgMkEfpXDf9H4v38p2xc,11422
25
- tinybird/tb/modules/connection.py,sha256=IVp2-E5mcwABc6FtdjhLhz0Nbr3xR5oSP9M7IEEraLA,6339
25
+ tinybird/tb/modules/connection.py,sha256=BPU5Q4gGv6z0aJ8qjKoh5OLa6DTcBaOvEG7EtqJBoQg,6757
26
26
  tinybird/tb/modules/copy.py,sha256=2Mm4FWKehOG7CoOhiF1m9UZJgJn0W1_cMolqju8ONYg,5805
27
27
  tinybird/tb/modules/create.py,sha256=s0Hx4s4fqqJPlo3Nl2JvybrlaObzBt9ej4Cv5C93HdM,16576
28
28
  tinybird/tb/modules/datasource.py,sha256=-aQCK_-wEmoo92Ki7zr2wm424RchDgWvT6yhfFY5kko,16909
29
29
  tinybird/tb/modules/deployment.py,sha256=4Zt7jPbqt18fB5kPx7DbO91Bh6xzBBTEUFY7O89shuU,19560
30
30
  tinybird/tb/modules/endpoint.py,sha256=XySDt3pk66vxOZ0egUfz4bY8bEk3BjOXkv-L0OIJ3sc,12083
31
31
  tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
32
- tinybird/tb/modules/feedback_manager.py,sha256=4Somda9qWcibNRteE-aj50WpQ4gdEzhdpY6mh1LiGL0,73984
32
+ tinybird/tb/modules/feedback_manager.py,sha256=7GH_Rob23L74UMQ2uG9_bZs1JSyg2W_T2dMAjSYOuPo,74099
33
33
  tinybird/tb/modules/fmt.py,sha256=qpf9APqKTKL2uphNgdbj4OMVyLkAxZn6dn4eHF99L5g,3553
34
34
  tinybird/tb/modules/infra.py,sha256=eX0StUipaXaxIhMxO82cnAnFKTCa7EPOt-e8pWoSLX0,33206
35
35
  tinybird/tb/modules/job.py,sha256=n4dSSBgnA8NqD7srGahf2xRj6wxkmX9Vl0J-QJ_a2w0,2966
36
- tinybird/tb/modules/llm.py,sha256=AC0VSphTOM2t-v1_3NLvNN_FIbgMo4dTyMqIv5nniPo,835
36
+ tinybird/tb/modules/llm.py,sha256=KfsCYmKeW1VQz0iDZhGKCRkQv_Y3kTHh6JuxvofOguE,1076
37
37
  tinybird/tb/modules/llm_utils.py,sha256=nS9r4FAElJw8yXtmdYrx-rtI2zXR8qXfi1QqUDCfxvg,3469
38
- tinybird/tb/modules/local.py,sha256=n2BRj51yRmYfd_2fuNPv0iNLKftCP-OvYVtZsUTXQsk,11028
38
+ tinybird/tb/modules/local.py,sha256=702U0p9pPFwZHkVNEsp2Y5gJxBKtOvd2XoS4dn1p-m8,11111
39
39
  tinybird/tb/modules/local_common.py,sha256=DqTHHcq4JitohYvHiqCz2Av4REPhmwwS6naQTOf1Mdk,3191
40
40
  tinybird/tb/modules/login.py,sha256=rLYdV7MLCTT1F4VBAWGv6SO9efMiM9-977ayLecUzjI,6842
41
41
  tinybird/tb/modules/logout.py,sha256=ULooy1cDBD02-r7voZmhV7udA0ML5tVuflJyShrh56Y,1022
@@ -59,7 +59,7 @@ tinybird/tb/modules/datafile/build.py,sha256=ltQ6ZEYwteYRJNeCgArl5iOWXilnEyUTR-R
59
59
  tinybird/tb/modules/datafile/build_common.py,sha256=LU24kAQmxDJIyoIapDaYG-SU3P4FrMG9UBf8m9PgVSI,4565
60
60
  tinybird/tb/modules/datafile/build_datasource.py,sha256=nXEQ0qHdq2ai7jJTv8H2d7eeDPBYzLn8VY7zMtOYb8M,17382
61
61
  tinybird/tb/modules/datafile/build_pipe.py,sha256=6Cwjf3BKEF3-oQ9PipsQfK-Z43nSwtA4qJAUoysI7Uc,11385
62
- tinybird/tb/modules/datafile/common.py,sha256=4pvW92X9BXomaN3-WhQOjvnAHY96O4dTsp4USBdknzk,83192
62
+ tinybird/tb/modules/datafile/common.py,sha256=7vlw2tb6FOlq65C_ZdDbgjOR4ni7ysAwjnd05GNdjt8,84365
63
63
  tinybird/tb/modules/datafile/diff.py,sha256=MTmj53RYjER4neLgWVjabn-FKVFgh8h8uYiBo55lFQg,6757
64
64
  tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
65
65
  tinybird/tb/modules/datafile/fixture.py,sha256=V3WGfPLIR78el3oCNWNkySWs6LxIufyIM0mDrrT3aWc,1131
@@ -79,8 +79,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
79
79
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
80
80
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
81
81
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
82
- tinybird-0.0.1.dev119.dist-info/METADATA,sha256=ZAd9dK656El6TZCSUO-aTlsD0GzJf32p826lOLBxvIQ,1612
83
- tinybird-0.0.1.dev119.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
84
- tinybird-0.0.1.dev119.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
85
- tinybird-0.0.1.dev119.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
86
- tinybird-0.0.1.dev119.dist-info/RECORD,,
82
+ tinybird-0.0.1.dev120.dist-info/METADATA,sha256=JesTFd-RCepauIp0A_ooi20zst3Gw9AoBkKxncAZbnI,1612
83
+ tinybird-0.0.1.dev120.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
84
+ tinybird-0.0.1.dev120.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
85
+ tinybird-0.0.1.dev120.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
86
+ tinybird-0.0.1.dev120.dist-info/RECORD,,