tinybird 0.0.1.dev6__py3-none-any.whl → 0.0.1.dev7__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.

Files changed (30) hide show
  1. tinybird/tb/modules/branch.py +0 -21
  2. tinybird/tb/modules/build.py +7 -18
  3. tinybird/tb/modules/cli.py +11 -131
  4. tinybird/tb/modules/common.py +14 -2
  5. tinybird/tb/modules/create.py +10 -14
  6. tinybird/tb/modules/datafile/build.py +2103 -0
  7. tinybird/tb/modules/datafile/build_common.py +118 -0
  8. tinybird/tb/modules/datafile/build_datasource.py +403 -0
  9. tinybird/tb/modules/datafile/build_pipe.py +648 -0
  10. tinybird/tb/modules/datafile/common.py +897 -0
  11. tinybird/tb/modules/datafile/diff.py +197 -0
  12. tinybird/tb/modules/datafile/exceptions.py +23 -0
  13. tinybird/tb/modules/datafile/format_common.py +66 -0
  14. tinybird/tb/modules/datafile/format_datasource.py +160 -0
  15. tinybird/tb/modules/datafile/format_pipe.py +195 -0
  16. tinybird/tb/modules/datafile/parse_datasource.py +41 -0
  17. tinybird/tb/modules/datafile/parse_pipe.py +69 -0
  18. tinybird/tb/modules/datafile/pipe_checker.py +560 -0
  19. tinybird/tb/modules/datafile/pull.py +157 -0
  20. tinybird/tb/modules/datasource.py +1 -1
  21. tinybird/tb/modules/fmt.py +4 -1
  22. tinybird/tb/modules/pipe.py +8 -2
  23. tinybird/tb/modules/prompts.py +1 -1
  24. tinybird/tb/modules/workspace.py +1 -1
  25. {tinybird-0.0.1.dev6.dist-info → tinybird-0.0.1.dev7.dist-info}/METADATA +1 -1
  26. {tinybird-0.0.1.dev6.dist-info → tinybird-0.0.1.dev7.dist-info}/RECORD +29 -16
  27. tinybird/tb/modules/datafile.py +0 -6122
  28. {tinybird-0.0.1.dev6.dist-info → tinybird-0.0.1.dev7.dist-info}/WHEEL +0 -0
  29. {tinybird-0.0.1.dev6.dist-info → tinybird-0.0.1.dev7.dist-info}/entry_points.txt +0 -0
  30. {tinybird-0.0.1.dev6.dist-info → tinybird-0.0.1.dev7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,157 @@
1
+ import re
2
+ from asyncio import Semaphore, gather
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ import aiofiles
7
+ import click
8
+
9
+ from tinybird.client import AuthNoTokenException, TinyB
10
+ from tinybird.feedback_manager import FeedbackManager
11
+ from tinybird.tb.modules.datafile.common import get_name_version
12
+ from tinybird.tb.modules.datafile.format_datasource import format_datasource
13
+ from tinybird.tb.modules.datafile.format_pipe import format_pipe
14
+
15
+
16
+ async def folder_pull(
17
+ client: TinyB,
18
+ folder: str,
19
+ auto: bool,
20
+ match: Optional[str],
21
+ force: bool,
22
+ verbose: bool = True,
23
+ progress_bar: bool = False,
24
+ fmt: bool = False,
25
+ ):
26
+ pattern = re.compile(match) if match else None
27
+
28
+ def _get_latest_versions(resources: List[str]):
29
+ versions: Dict[str, Any] = {}
30
+
31
+ for x in resources:
32
+ t = get_name_version(x)
33
+ t["original_name"] = x
34
+ if t["version"] is None:
35
+ t["version"] = -1
36
+ name = t["name"]
37
+
38
+ if name not in versions or name == x or versions[name]["version"] < t["version"]:
39
+ versions[name] = t
40
+ return versions
41
+
42
+ def get_file_folder(extension: str):
43
+ if not auto:
44
+ return None
45
+ if extension == "datasource":
46
+ return "datasources"
47
+ if extension == "pipe":
48
+ return "pipes"
49
+ if extension == "token":
50
+ return "tokens"
51
+ return None
52
+
53
+ async def write_files(
54
+ versions: Dict[str, Any],
55
+ resources: List[str],
56
+ extension: str,
57
+ get_resource_function: str,
58
+ progress_bar: bool = False,
59
+ fmt: bool = False,
60
+ ):
61
+ async def write_resource(k: Dict[str, Any]):
62
+ name = f"{k['name']}.{extension}"
63
+ try:
64
+ if pattern and not pattern.search(name):
65
+ if verbose:
66
+ click.echo(FeedbackManager.info_skipping_resource(resource=name))
67
+ return
68
+
69
+ resource = await getattr(client, get_resource_function)(k["original_name"])
70
+ resource_to_write = resource
71
+
72
+ if fmt:
73
+ if extension == "datasource":
74
+ resource_to_write = await format_datasource(name, content=resource)
75
+ elif extension == "pipe":
76
+ resource_to_write = await format_pipe(name, content=resource)
77
+
78
+ dest_folder = folder
79
+ if "." in k["name"] and extension != "token":
80
+ dest_folder = Path(folder) / "vendor" / k["name"].split(".", 1)[0]
81
+ name = f"{k['name'].split('.', 1)[1]}.{extension}"
82
+
83
+ file_folder = get_file_folder(extension)
84
+ f = Path(dest_folder) / file_folder if file_folder is not None else Path(dest_folder)
85
+
86
+ if not f.exists():
87
+ f.mkdir(parents=True)
88
+
89
+ f = f / name
90
+ resource_names = [x.split(".")[-1] for x in resources]
91
+
92
+ if verbose:
93
+ click.echo(FeedbackManager.info_writing_resource(resource=f))
94
+ if not f.exists() or force:
95
+ async with aiofiles.open(f, "w") as fd:
96
+ # versions are a client only thing so
97
+ # datafiles from the server do not contains information about versions
98
+ if k["version"] >= 0:
99
+ if fmt:
100
+ resource_to_write = "\n" + resource_to_write # fmt strips the first line
101
+
102
+ resource_to_write = f"VERSION {k['version']}\n" + resource_to_write
103
+ if resource_to_write:
104
+ matches = re.findall(r"([^\s\.]*__v\d+)", resource_to_write)
105
+ for match in set(matches):
106
+ m = match.split("__v")[0]
107
+ if m in resources or m in resource_names:
108
+ resource_to_write = resource_to_write.replace(match, m)
109
+ await fd.write(resource_to_write)
110
+ else:
111
+ if verbose:
112
+ click.echo(FeedbackManager.info_skip_already_exists())
113
+ except Exception as e:
114
+ raise click.ClickException(FeedbackManager.error_exception(error=e))
115
+
116
+ values = versions.values()
117
+
118
+ if progress_bar:
119
+ with click.progressbar(values, label=f"Pulling {extension}s") as values: # type: ignore
120
+ for k in values:
121
+ await write_resource(k)
122
+ else:
123
+ tasks = [write_resource(k) for k in values]
124
+ await _gather_with_concurrency(5, *tasks)
125
+
126
+ try:
127
+ datasources = await client.datasources()
128
+ remote_datasources = sorted([x["name"] for x in datasources])
129
+ datasources_versions = _get_latest_versions(remote_datasources)
130
+
131
+ pipes = await client.pipes()
132
+ remote_pipes = sorted([x["name"] for x in pipes])
133
+ pipes_versions = _get_latest_versions(remote_pipes)
134
+
135
+ resources = list(datasources_versions.keys()) + list(pipes_versions.keys())
136
+
137
+ await write_files(
138
+ datasources_versions, resources, "datasource", "datasource_file", progress_bar=progress_bar, fmt=fmt
139
+ )
140
+ await write_files(pipes_versions, resources, "pipe", "pipe_file", progress_bar=progress_bar, fmt=fmt)
141
+
142
+ return
143
+
144
+ except AuthNoTokenException:
145
+ raise
146
+ except Exception as e:
147
+ raise click.ClickException(FeedbackManager.error_pull(error=str(e)))
148
+
149
+
150
+ async def _gather_with_concurrency(n, *tasks):
151
+ semaphore = Semaphore(n)
152
+
153
+ async def sem_task(task):
154
+ async with semaphore:
155
+ return await task
156
+
157
+ return await gather(*(sem_task(task) for task in tasks))
@@ -41,7 +41,7 @@ from tinybird.tb.modules.common import (
41
41
  validate_kafka_topic,
42
42
  wait_job,
43
43
  )
44
- from tinybird.tb.modules.datafile import get_name_version
44
+ from tinybird.tb.modules.datafile.common import get_name_version
45
45
  from tinybird.tb.modules.exceptions import CLIDatasourceException
46
46
 
47
47
 
@@ -10,7 +10,10 @@ from click import Context
10
10
  from tinybird.feedback_manager import FeedbackManager
11
11
  from tinybird.tb.modules.cli import cli
12
12
  from tinybird.tb.modules.common import coro
13
- from tinybird.tb.modules.datafile import color_diff, format_datasource, format_pipe, is_file_a_datasource, peek
13
+ from tinybird.tb.modules.datafile.common import is_file_a_datasource
14
+ from tinybird.tb.modules.datafile.diff import color_diff, peek
15
+ from tinybird.tb.modules.datafile.format_datasource import format_datasource
16
+ from tinybird.tb.modules.datafile.format_pipe import format_pipe
14
17
 
15
18
 
16
19
  @cli.command()
@@ -19,8 +19,14 @@ from tinybird.config import DEFAULT_API_HOST, FeatureFlags
19
19
  from tinybird.feedback_manager import FeedbackManager
20
20
  from tinybird.tb.modules.branch import warn_if_in_live
21
21
  from tinybird.tb.modules.cli import cli
22
- from tinybird.tb.modules.common import coro, create_tb_client, echo_safe_humanfriendly_tables_format_smart_table
23
- from tinybird.tb.modules.datafile import PipeNodeTypes, PipeTypes, folder_push, get_name_version, process_file, wait_job
22
+ from tinybird.tb.modules.common import (
23
+ coro,
24
+ create_tb_client,
25
+ echo_safe_humanfriendly_tables_format_smart_table,
26
+ wait_job,
27
+ )
28
+ from tinybird.tb.modules.datafile.build import folder_push, process_file
29
+ from tinybird.tb.modules.datafile.common import PipeNodeTypes, PipeTypes, get_name_version
24
30
  from tinybird.tb.modules.exceptions import CLIPipeException
25
31
 
26
32
 
@@ -44,7 +44,7 @@ SQL >
44
44
  - Create multiple pipes to show different use cases over the same datasource.
45
45
  - The SQL query must be a valid ClickHouse SQL query that mixes ClickHouse syntax and Tinybird templating syntax.
46
46
  - If you need to use dynamic parameters you must start the whole sql query ALWAYS with "%" symbol on top. e.g: SQL >\n %\n SELECT * FROM <table> WHERE <condition> LIMIT 10
47
- - The Parameter functions like this one {{String(<my_param_name>,<default_value>)}} can be one of the following: String, DateTime, Date, Float32, Float64, Int, Integer, UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256
47
+ - The Parameter functions like this one {{String(my_param_name,default_value)}} can be one of the following: String, DateTime, Date, Float32, Float64, Int, Integer, UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256
48
48
  - Parameter names must be different from column names. Pass always the param name and a default value to the function.
49
49
  - Nodes can't have the same exact name as the Pipe they belong to.
50
50
  </instructions>
@@ -26,7 +26,7 @@ from tinybird.tb.modules.common import (
26
26
  switch_workspace,
27
27
  )
28
28
  from tinybird.tb.modules.config import CLIConfig
29
- from tinybird.tb.modules.datafile import PipeTypes
29
+ from tinybird.tb.modules.datafile.common import PipeTypes
30
30
  from tinybird.tb.modules.exceptions import CLIWorkspaceException
31
31
 
32
32
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tinybird
3
- Version: 0.0.1.dev6
3
+ Version: 0.0.1.dev7
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -17,32 +17,45 @@ tinybird/ch_utils/constants.py,sha256=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj
17
17
  tinybird/ch_utils/engine.py,sha256=OXkBhlzGjZotjD0vaT-rFIbSGV4tpiHxE8qO_ip0SyQ,40454
18
18
  tinybird/tb/cli.py,sha256=6Lu3wsCNepAxjJCWy4c6RhVPArBtm8TlUcSxX--TsBo,783
19
19
  tinybird/tb/modules/auth.py,sha256=hynZ-Temot8YBsySUWKSFzZlYadtFPxG3o6lCSu1n6E,9018
20
- tinybird/tb/modules/branch.py,sha256=X3Ks8SnIeZLgU6wU6tY0-PfLmIJdGho6wlkmC4o4nOg,39119
21
- tinybird/tb/modules/build.py,sha256=CAZq1BxbGM-uaoGanVEtZT3YwzWN_jJ6Fzgrw8Nwi3g,7798
20
+ tinybird/tb/modules/branch.py,sha256=R1tTUBGyI0p_dt2IAWbuyNOvemhjCIPwYxEmOxL3zOg,38468
21
+ tinybird/tb/modules/build.py,sha256=dAsgm3UyC46aMYFOH9O8qsyYdBJBoyoTV1mXSBcDJIc,7643
22
22
  tinybird/tb/modules/cicd.py,sha256=mIMU1gNGpN3f5K3rBYN9rFoOT3RogDxIs_zB3LY-iO4,7463
23
- tinybird/tb/modules/cli.py,sha256=Kz55MfNv01lcYow2TNRJuGZvUZ_2Sa-jfNqeYVmhuJU,61968
24
- tinybird/tb/modules/common.py,sha256=KBuSgVKqyUE4OVgMqD7BXro346IxcSNkKCf_I1_D9fw,79086
23
+ tinybird/tb/modules/cli.py,sha256=Yw6ooemOAIUZR-IKk05BG_D7RgoljTgoHBYW7aq4XaM,56674
24
+ tinybird/tb/modules/common.py,sha256=vb69xKJXbRjoYOlCwerXEU3488Od_zfR2N2yP5VyNw8,79372
25
25
  tinybird/tb/modules/config.py,sha256=ppWvACHrSLkb5hOoQLYNby2w8jR76-8Kx2NBCst7ntQ,11760
26
26
  tinybird/tb/modules/connection.py,sha256=ZSqBGoRiJedjHKEyB_fr1ybucOHtaad8d7uqGa2Q92M,28668
27
- tinybird/tb/modules/create.py,sha256=E5hs03kDdJj7n0_6H3loUOcfNv71Jbks0EBu9Kdre4Q,6898
28
- tinybird/tb/modules/datafile.py,sha256=16MTuwXqsruhf_UoniDQSHetMIGeFbiUtZcLDJcqoAk,253563
29
- tinybird/tb/modules/datasource.py,sha256=Wkxj6QBtTKCgl43JFwMWafEHYnnQjGZZHoL2SbuC3KQ,35811
27
+ tinybird/tb/modules/create.py,sha256=24TWPzRnG8WmDLm8LP2Y5Sb4wwbz4rzarL3YwKQU4i8,6761
28
+ tinybird/tb/modules/datasource.py,sha256=tjcf5o-HYIdTkb_c1ErGUFIE-W6G992vsvCuDGcxb9Q,35818
30
29
  tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
31
- tinybird/tb/modules/fmt.py,sha256=ZoYLUkyExudbUr-Phy-I2riPBdQd1NXwA1y-XbSEFB8,3385
30
+ tinybird/tb/modules/fmt.py,sha256=UszEQO15fdzQ49QEj7Unhu68IKwSuKPsOrKhk2p2TAg,3547
32
31
  tinybird/tb/modules/job.py,sha256=eoBVyA24lYIPonU88Jn7FF9hBKz1kScy9_w_oWreuc4,2952
33
32
  tinybird/tb/modules/llm.py,sha256=D6ShlqCorZpRLjE5srI7Ws4VUTH6kSotTi88CvUwoGw,2446
34
33
  tinybird/tb/modules/local.py,sha256=nCaN05ntqIGFbBqyhRwpwdLpcYwsx6Vvp0atU_KKaTo,5893
35
34
  tinybird/tb/modules/mock.py,sha256=dYxm8_1zXGZnf4X8OYmG9hK1I-csHakD64Hag8mAn4Q,2069
36
- tinybird/tb/modules/pipe.py,sha256=LIiEK3zUmLcu24zgHy8qWvDD4yQjwnb--AZ1vbs0554,30984
37
- tinybird/tb/modules/prompts.py,sha256=12Abh1kZItxMa7r3WbTi_TgTYtlV30HcaG_JiodafIA,7255
35
+ tinybird/tb/modules/pipe.py,sha256=9wnfKbp2FkmLiJgVk3qbra76ktwsUTXghu6j9cCEahQ,31058
36
+ tinybird/tb/modules/prompts.py,sha256=u_-VSsqk8fXJTsLO3sCv9DR1Qx2V_M_Z_gBfiyvn5jA,7251
38
37
  tinybird/tb/modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
39
38
  tinybird/tb/modules/table.py,sha256=hG-PRDVuFp2uph41WpoLRV1yjp3RI2fi_iGGiI0rdxU,7695
40
39
  tinybird/tb/modules/tag.py,sha256=1qQWyk1p3Btv3LzM8VbJG-k7x2-pFuAlYCg3QL6QewI,3480
41
40
  tinybird/tb/modules/telemetry.py,sha256=iEGnMuCuNhvF6ln__j6X9MSTwL_0Hm-GgFHHHvhfknk,10466
42
41
  tinybird/tb/modules/test.py,sha256=psINFpSYT1eGgy32-_4q6CJ7LOcdwBpAfasMA0_tNOU,4330
43
42
  tinybird/tb/modules/token.py,sha256=r0oeG1RpOOzHtqbUaHBiOmhE55HfNIvReAAWyKl9fJg,12695
44
- tinybird/tb/modules/workspace.py,sha256=alZFDKy_qaZk5TIe6gduBeNgpp4h5jp6RDj1SwP5ylg,10909
43
+ tinybird/tb/modules/workspace.py,sha256=FVlh-kbiZp5Gvp6dGFxi0UD8ail77rMamXLhqdVwrZ0,10916
45
44
  tinybird/tb/modules/workspace_members.py,sha256=08W0onEYkKLEC5TkAI07cxN9XSquEm7HnL7OkHAVDjo,8715
45
+ tinybird/tb/modules/datafile/build.py,sha256=NAvtZS8skAt_8HIdzOJhbp-d9kMIqFQJ9tupQ6M9IK0,90180
46
+ tinybird/tb/modules/datafile/build_common.py,sha256=74547h5ja4C66DAwDMabj75FA_BUTJxTJv-24tSFmrs,4551
47
+ tinybird/tb/modules/datafile/build_datasource.py,sha256=cJee7crf57gAGIa76Du0TznVU9gtk7F88eBCI7930tk,16836
48
+ tinybird/tb/modules/datafile/build_pipe.py,sha256=X4a-UM_GSOmR8ks2kBITgebXz-aE-iEdG5F1eEUzIyc,27555
49
+ tinybird/tb/modules/datafile/common.py,sha256=g5G0jXC-okEiKPnWa8X3p3-VxXoZlQQUwKzhxVA0tfs,33918
50
+ tinybird/tb/modules/datafile/diff.py,sha256=ZaTPGjRFJWokhaad_rMSxfYT92PA96s4WhhvlZubgyA,6769
51
+ tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
52
+ tinybird/tb/modules/datafile/format_common.py,sha256=zNWDXvwSKC9_T5e9R92LLj9ekDflVWwsllhGQilZsnY,2184
53
+ tinybird/tb/modules/datafile/format_datasource.py,sha256=tsnCjONISvhFuucKNbIHkT__UmlUbcswx5mwI9hiDQc,6216
54
+ tinybird/tb/modules/datafile/format_pipe.py,sha256=R5tnlEccLn3KX6ehtC_H2sGQNrthuJUiVSN9z_-KGCY,7474
55
+ tinybird/tb/modules/datafile/parse_datasource.py,sha256=9pp0fJ2Da-7pznaHq5OV7NvzswK0RuXOPHU4kXNRMnA,1111
56
+ tinybird/tb/modules/datafile/parse_pipe.py,sha256=STgA12LOLUnnb_cvVvZeEE4ka-nfk0jsNzxJhWj94cY,2599
57
+ tinybird/tb/modules/datafile/pipe_checker.py,sha256=cp80Bru41GlyMRvyERpdJNXns2MjmtIAWFnBLF4cPXs,24667
58
+ tinybird/tb/modules/datafile/pull.py,sha256=MleQG9GTo9_ZoMKrneps-QzI4dr6n5IPosHWz2sTz20,5894
46
59
  tinybird/tb/modules/tinyunit/tinyunit.py,sha256=IkjRCvb8HnNEE84rtl0I1b9gQVpE_zCE8MvFFet51sg,11716
47
60
  tinybird/tb/modules/tinyunit/tinyunit_lib.py,sha256=hGh1ZaXC1af7rKnX7222urkj0QJMhMWclqMy59dOqwE,1922
48
61
  tinybird/tb_cli_modules/cicd.py,sha256=0lMkb6CVOFZl5HOwgY8mK4T4mgI7O8335UngLXtCc-c,13851
@@ -51,8 +64,8 @@ tinybird/tb_cli_modules/config.py,sha256=6NTgIdwf0X132A1j6G_YrdPep87ymZ9b5pABabK
51
64
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
52
65
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
53
66
  tinybird/tb_cli_modules/telemetry.py,sha256=iEGnMuCuNhvF6ln__j6X9MSTwL_0Hm-GgFHHHvhfknk,10466
54
- tinybird-0.0.1.dev6.dist-info/METADATA,sha256=wgXkBp0lUmzhrrDmTwxzy0FKVfmEIGfZ6no4CQF3uQc,2404
55
- tinybird-0.0.1.dev6.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
56
- tinybird-0.0.1.dev6.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
57
- tinybird-0.0.1.dev6.dist-info/top_level.txt,sha256=pgw6AzERHBcW3YTi2PW4arjxLkulk2msOz_SomfOEuc,45
58
- tinybird-0.0.1.dev6.dist-info/RECORD,,
67
+ tinybird-0.0.1.dev7.dist-info/METADATA,sha256=MDbMCTsirb0x3yH4RirvEzBzYvjieV1ucRH1R89aPAw,2404
68
+ tinybird-0.0.1.dev7.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
69
+ tinybird-0.0.1.dev7.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
70
+ tinybird-0.0.1.dev7.dist-info/top_level.txt,sha256=pgw6AzERHBcW3YTi2PW4arjxLkulk2msOz_SomfOEuc,45
71
+ tinybird-0.0.1.dev7.dist-info/RECORD,,