tinybird 0.0.1.dev17__py3-none-any.whl → 0.0.1.dev18__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.
@@ -6,6 +6,7 @@ import click
6
6
  from tinybird.feedback_manager import FeedbackManager
7
7
  from tinybird.tb.modules.datafile.common import (
8
8
  Datafile,
9
+ DatafileSyntaxError,
9
10
  format_filename,
10
11
  parse,
11
12
  )
@@ -18,6 +19,7 @@ def parse_datasource(
18
19
  content: Optional[str] = None,
19
20
  skip_eval: bool = False,
20
21
  hide_folders: bool = False,
22
+ add_context_to_datafile_syntax_errors: bool = True,
21
23
  ) -> Datafile:
22
24
  basepath = ""
23
25
  if not content:
@@ -30,6 +32,12 @@ def parse_datasource(
30
32
  filename = format_filename(filename, hide_folders)
31
33
  try:
32
34
  doc = parse(s, "default", basepath, replace_includes=replace_includes, skip_eval=skip_eval)
35
+ except DatafileSyntaxError as e:
36
+ try:
37
+ if add_context_to_datafile_syntax_errors:
38
+ e.get_context_from_file_contents(s)
39
+ finally:
40
+ raise e
33
41
  except ParseException as e:
34
42
  raise click.ClickException(
35
43
  FeedbackManager.error_parsing_file(filename=filename, lineno=e.lineno, error=e)
@@ -7,6 +7,7 @@ from tinybird.feedback_manager import FeedbackManager
7
7
  from tinybird.sql_template import get_template_and_variables, render_sql_template
8
8
  from tinybird.tb.modules.datafile.common import (
9
9
  Datafile,
10
+ DatafileSyntaxError,
10
11
  format_filename,
11
12
  parse,
12
13
  )
@@ -20,6 +21,7 @@ def parse_pipe(
20
21
  content: Optional[str] = None,
21
22
  skip_eval: bool = False,
22
23
  hide_folders: bool = False,
24
+ add_context_to_datafile_syntax_errors: bool = True,
23
25
  ) -> Datafile:
24
26
  basepath = ""
25
27
  if not content:
@@ -32,7 +34,14 @@ def parse_pipe(
32
34
  filename = format_filename(filename, hide_folders)
33
35
  try:
34
36
  sql = ""
35
- doc = parse(s, basepath=basepath, replace_includes=replace_includes, skip_eval=skip_eval)
37
+ try:
38
+ doc = parse(s, basepath=basepath, replace_includes=replace_includes, skip_eval=skip_eval)
39
+ except DatafileSyntaxError as e:
40
+ try:
41
+ if add_context_to_datafile_syntax_errors:
42
+ e.get_context_from_file_contents(s)
43
+ finally:
44
+ raise e
36
45
  for node in doc.nodes:
37
46
  sql = node.get("sql", "")
38
47
  if sql.strip()[0] == "%":
@@ -26,7 +26,6 @@ class TestExpectation(BaseModel):
26
26
  name: str
27
27
  description: str
28
28
  parameters: str
29
- expected_result: str
30
29
 
31
30
 
32
31
  class TestExpectations(BaseModel):
@@ -69,11 +68,11 @@ class LLM:
69
68
  except Exception:
70
69
  return DataProject(datasources=[], pipes=[])
71
70
 
72
- async def generate_sql_sample_data(self, schema: str, rows: int = 20, context: str = "") -> str:
71
+ async def generate_sql_sample_data(self, schema: str, rows: int = 20, prompt: str = "") -> str:
73
72
  response = await self.user_client._req(
74
73
  "/v0/llm/mock",
75
74
  method="POST",
76
- data=f'{{"schema": "{urllib.parse.quote(schema)}", "rows": {rows}, "context": "{urllib.parse.quote(context)}"}}',
75
+ data=f'{{"schema": "{urllib.parse.quote(schema)}", "rows": {rows}, "context": "{prompt}"}}',
77
76
  headers={"Content-Type": "application/json"},
78
77
  )
79
78
  return response.get("result", "")
@@ -90,6 +89,8 @@ class LLM:
90
89
  {"role": "system", "content": create_test_calls_prompt.format(context=context)},
91
90
  {"role": "user", "content": f"Pipe content: {pipe_content}\nPipe params: {pipe_params}"},
92
91
  ],
92
+ temperature=0.2,
93
+ seed=42,
93
94
  response_format=TestExpectations,
94
95
  )
95
96
  return completion.choices[0].message.parsed or TestExpectations(tests=[])
@@ -9,7 +9,7 @@ from tinybird.tb.modules.config import CLIConfig
9
9
  from tinybird.tb.modules.exceptions import CLIException
10
10
 
11
11
  # TODO: Use the official Tinybird image once it's available 'tinybirdco/tinybird-local:latest'
12
- TB_IMAGE_NAME = "registry.gitlab.com/tinybird/analytics/tinybird-local-jammy-3.11:latest"
12
+ TB_IMAGE_NAME = "tinybirdco/tinybird-local:latest"
13
13
  TB_CONTAINER_NAME = "tinybird-local"
14
14
  TB_LOCAL_PORT = int(os.getenv("TB_LOCAL_PORT", 80))
15
15
  TB_LOCAL_HOST = f"http://localhost:{TB_LOCAL_PORT}"
@@ -151,7 +151,7 @@ def login(host: str, workspace: str):
151
151
  if workspace:
152
152
  params["workspace_id"] = workspace
153
153
  response = requests.get(
154
- f"https://api.tinybird.co/v0/user/tokens?{urlencode(params)}",
154
+ f"{host}/v0/user/tokens?{urlencode(params)}",
155
155
  headers={"Authorization": f"Bearer {auth_code[0]}"},
156
156
  )
157
157
  data = response.json()
@@ -15,10 +15,10 @@ from tinybird.tb.modules.local_common import get_tinybird_local_client
15
15
  @cli.command()
16
16
  @click.argument("datasource", type=str)
17
17
  @click.option("--rows", type=int, default=10, help="Number of events to send")
18
- @click.option("--context", type=str, default="", help="Extra context to use for data generation")
18
+ @click.option("--prompt", type=str, default="", help="Extra context to use for data generation")
19
19
  @click.option("--folder", type=str, default=".", help="Folder where datafiles will be placed")
20
20
  @coro
21
- async def mock(datasource: str, rows: int, context: str, folder: str) -> None:
21
+ async def mock(datasource: str, rows: int, prompt: str, folder: str) -> None:
22
22
  """Load sample data into a Data Source.
23
23
 
24
24
  Args:
@@ -35,15 +35,15 @@ async def mock(datasource: str, rows: int, context: str, folder: str) -> None:
35
35
  datasource_path = Path("datasources", f"{datasource}.datasource")
36
36
  datasource_path = Path(folder) / datasource_path
37
37
 
38
- context_path = Path(folder) / "fixtures" / f"{datasource_name}.prompt"
39
- if not context:
40
- # load the context from the fixture.prompt file if it exists
41
- if context_path.exists():
42
- click.echo(FeedbackManager.gray(message=f"Using context for {context_path}..."))
43
- context = context_path.read_text()
38
+ prompt_path = Path(folder) / "fixtures" / f"{datasource_name}.prompt"
39
+ if not prompt:
40
+ # load the prompt from the fixture.prompt file if it exists
41
+ if prompt_path.exists():
42
+ click.echo(FeedbackManager.gray(message=f"Using prompt for {prompt_path}..."))
43
+ prompt = prompt_path.read_text()
44
44
  else:
45
- click.echo(FeedbackManager.gray(message=f"Overriding context for {datasource_name}..."))
46
- context_path.write_text(context)
45
+ click.echo(FeedbackManager.gray(message=f"Overriding prompt for {datasource_name}..."))
46
+ prompt_path.write_text(prompt)
47
47
 
48
48
  click.echo(FeedbackManager.gray(message=f"Creating fixture for {datasource_name}..."))
49
49
  datasource_content = datasource_path.read_text()
@@ -52,7 +52,9 @@ async def mock(datasource: str, rows: int, context: str, folder: str) -> None:
52
52
  user_client.token = config.get_user_token()
53
53
  llm = LLM(client=user_client)
54
54
  tb_client = await get_tinybird_local_client(os.path.abspath(folder))
55
- sql = await llm.generate_sql_sample_data(datasource_content, rows=rows, context=context)
55
+ sql = await llm.generate_sql_sample_data(datasource_content, rows=rows, prompt=prompt)
56
+ if os.environ.get('TB_DEBUG', '') != '':
57
+ print(sql)
56
58
  result = await tb_client.query(f"{sql} FORMAT JSON")
57
59
  data = result.get("data", [])[:rows]
58
60
  fixture_name = build_fixture_name(datasource_path.absolute(), datasource_name, datasource_content)
@@ -60,4 +62,4 @@ async def mock(datasource: str, rows: int, context: str, folder: str) -> None:
60
62
  click.echo(FeedbackManager.success(message="✓ Done!"))
61
63
 
62
64
  except Exception as e:
63
- raise CLIException(FeedbackManager.error(message=str(e)))
65
+ raise CLIException(FeedbackManager.error_exception(error=e))
@@ -20,6 +20,32 @@ from tinybird.tb.modules.exceptions import CLIException
20
20
  from tinybird.tb.modules.llm import LLM, TestExpectation
21
21
  from tinybird.tb.modules.local_common import get_tinybird_local_client
22
22
 
23
+ yaml.SafeDumper.org_represent_str = yaml.SafeDumper.represent_str
24
+
25
+
26
+ def repr_str(dumper, data):
27
+ if "\n" in data:
28
+ return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|")
29
+ return dumper.org_represent_str(data)
30
+
31
+
32
+ yaml.add_representer(str, repr_str, Dumper=yaml.SafeDumper)
33
+
34
+
35
+ def generate_test_file(pipe_name: str, tests: List[TestExpectation], folder: Optional[str], mode: str = "w"):
36
+ base = Path("tests")
37
+ if folder:
38
+ base = Path(folder) / base
39
+
40
+ base.mkdir(parents=True, exist_ok=True)
41
+
42
+ yaml_str = yaml.safe_dump(tests, sort_keys=False)
43
+ formatted_yaml = yaml_str.replace("- name:", "\n- name:")
44
+
45
+ path = base / f"{pipe_name}.yaml"
46
+ with open(path, mode) as f:
47
+ f.write(formatted_yaml)
48
+
23
49
 
24
50
  @cli.group()
25
51
  @click.pass_context
@@ -46,16 +72,6 @@ async def test_create(ctx: click.Context, pipe: str, prompt: Optional[str], fold
46
72
  Create a test for an existing endpoint
47
73
  """
48
74
 
49
- def generate_test_file(pipe_name: str, tests: List[TestExpectation]):
50
- base = Path("tests")
51
- if folder:
52
- base = Path(folder) / base
53
- base.mkdir(parents=True, exist_ok=True)
54
-
55
- path = base / f"{pipe_name}.yaml"
56
- with open(path, "w") as f:
57
- yaml.dump(tests, f)
58
-
59
75
  try:
60
76
  pipe_path = Path(pipe)
61
77
  pipe_name = pipe
@@ -82,25 +98,73 @@ async def test_create(ctx: click.Context, pipe: str, prompt: Optional[str], fold
82
98
  )
83
99
  valid_test_expectations = []
84
100
  for test in test_expectations.tests:
85
- test_params = test.parameters if test.parameters.startswith("?") else f"?{test.parameters}"
101
+ valid_test = test.model_dump()
102
+ test_params = (
103
+ valid_test["parameters"] if valid_test["parameters"].startswith("?") else f"?{valid_test['parameters']}"
104
+ )
105
+ response = ""
86
106
  try:
87
107
  response = await client._req(f"/v0/pipes/{pipe_name}.ndjson{test_params}")
88
108
  except Exception:
89
- continue
109
+ valid_test["expected_http_status"] = 500
90
110
 
91
- test.expected_result = response
92
- valid_test_expectations.append(test.model_dump())
111
+ valid_test["expected_result"] = response
112
+ valid_test_expectations.append(valid_test)
93
113
  if valid_test_expectations:
94
- generate_test_file(pipe_name, valid_test_expectations)
114
+ generate_test_file(pipe_name, valid_test_expectations, folder, mode="a")
95
115
  click.echo(FeedbackManager.info(message=f"✓ /tests/{pipe_name}.yaml"))
96
116
  click.echo(FeedbackManager.success(message="✓ Done!\n"))
97
117
  except Exception as e:
98
118
  raise CLIException(FeedbackManager.error_exception(error=e))
99
119
 
100
120
 
121
+ @test.command(
122
+ name="update",
123
+ help="Update the test expectations for a file or a test.",
124
+ )
125
+ @click.argument("pipe", type=str)
126
+ @click.option(
127
+ "--folder",
128
+ default=".",
129
+ type=click.Path(exists=True, file_okay=False),
130
+ help="Folder where datafiles will be placed",
131
+ )
132
+ @click.pass_context
133
+ @coro
134
+ async def test_update(ctx: click.Context, pipe: str, folder: Optional[str]) -> None:
135
+ client = await get_tinybird_local_client(os.path.abspath(folder))
136
+
137
+ pipe_tests_path = Path(pipe)
138
+ pipe_name = pipe
139
+ if pipe_tests_path.suffix == ".yaml":
140
+ pipe_name = pipe_tests_path.stem
141
+ else:
142
+ pipe_tests_path = Path("tests", f"{pipe}.yaml")
143
+
144
+ click.echo(FeedbackManager.gray(message=f"\nUpdating tests expectations for {pipe_name} endpoint..."))
145
+ pipe_tests_path = Path(folder) / pipe_tests_path
146
+ pipe_tests_content = yaml.safe_load(pipe_tests_path.read_text())
147
+ for test in pipe_tests_content:
148
+ test_params = test["parameters"] if test["parameters"].startswith("?") else f"?{test['parameters']}"
149
+ response = ""
150
+ try:
151
+ response = await client._req(f"/v0/pipes/{pipe_name}.ndjson{test_params}")
152
+ except Exception:
153
+ test["expected_http_status"] = 500
154
+ else:
155
+ if "expected_http_status" in test:
156
+ del test["expected_http_status"]
157
+
158
+ test["expected_result"] = response
159
+
160
+ generate_test_file(pipe_name, pipe_tests_content, folder)
161
+ click.echo(FeedbackManager.info(message=f"✓ /tests/{pipe_name}.yaml"))
162
+ click.echo(FeedbackManager.success(message="✓ Done!\n"))
163
+
164
+
101
165
  @test.command(
102
166
  name="run",
103
- help="Run the test suite, a file, or a test. To skip test to run in branches and CI put them in a 'skip_in_branch' folder.",
167
+ help="Run the test suite, a file, or a test.",
104
168
  )
105
169
  @click.argument("file", nargs=-1)
106
170
  @click.option(
@@ -120,7 +184,16 @@ async def test_run(ctx: click.Context, file: Tuple[str, ...], folder: Optional[s
120
184
  test_file_content = yaml.safe_load(test_file_path.read_text())
121
185
  for test in test_file_content:
122
186
  try:
123
- response = await client._req(f"/v0/pipes/{test_file_path.stem}.ndjson?{test['parameters']}")
187
+ test_params = test["parameters"] if test["parameters"].startswith("?") else f"?{test['parameters']}"
188
+ response = ""
189
+ try:
190
+ response = await client._req(f"/v0/pipes/{test_file_path.stem}.ndjson{test_params}")
191
+ except Exception:
192
+ if "expected_http_status" not in test:
193
+ raise Exception("Expected to not fail but got an error")
194
+ if test["expected_http_status"] != 500:
195
+ raise Exception(f"Expected {test['expected_http_status']} but got another status")
196
+
124
197
  if test["expected_result"] != response:
125
198
  diff = difflib.ndiff(
126
199
  test["expected_result"].splitlines(keepends=True), response.splitlines(keepends=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tinybird
3
- Version: 0.0.1.dev17
3
+ Version: 0.0.1.dev18
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -16,6 +16,7 @@ Requires-Dist: croniter (==1.3.8)
16
16
  Requires-Dist: docker (==7.1.0)
17
17
  Requires-Dist: GitPython (~=3.1.32)
18
18
  Requires-Dist: humanfriendly (~=8.2)
19
+ Requires-Dist: prompt-toolkit (==3.0.48)
19
20
  Requires-Dist: pydantic (~=2.8.0)
20
21
  Requires-Dist: pyperclip (==1.8.2)
21
22
  Requires-Dist: pyyaml (<6.1,>=6.0)
@@ -17,29 +17,29 @@ 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=onCxcKvTV4RuokC5V3t82OXWAIwgU6pMWs8rpWOUi_o,815
19
19
  tinybird/tb/modules/auth.py,sha256=hynZ-Temot8YBsySUWKSFzZlYadtFPxG3o6lCSu1n6E,9018
20
- tinybird/tb/modules/build.py,sha256=3YEcUBSsp8DREyox5x27BabcdYHFEokGnQ-f8-etDmo,8412
21
- tinybird/tb/modules/build_shell.py,sha256=jN06ZT7BK3lHtMgBjaOn4sD6yooUy9v8uuZnE-jjmlU,5485
22
- tinybird/tb/modules/cicd.py,sha256=KCFfywFfvGRh24GZwqrhICiTK_arHelPs_X4EB-pXIw,7331
20
+ tinybird/tb/modules/build.py,sha256=RILQAcx6Im8JSaL3ybJTOAm_oatuxdEfbVYl-5eAIgo,8998
21
+ tinybird/tb/modules/build_shell.py,sha256=hmOlKl_rz3cG8z4pAybi2WnzuaD4NbCBU-IQ_zWrock,12254
22
+ tinybird/tb/modules/cicd.py,sha256=Xa3M7Egq4eDS6QIhrx8C8Ixf-R7oiZpO-5ZBPqYAKtI,5344
23
23
  tinybird/tb/modules/cli.py,sha256=PRURYKphzjqVltMG647D8ADGS-YFR2rAkDNEwUTTDjk,53082
24
- tinybird/tb/modules/common.py,sha256=ZvkuI1JYVVwBZOZ9VDiNLR_-HHRavTHqSe6uVPJ8MS4,76431
24
+ tinybird/tb/modules/common.py,sha256=XfpzFVT9xJZ_HH7EZRLAjRMkTtz5rP7Njld5-EwMqiA,72400
25
25
  tinybird/tb/modules/config.py,sha256=ri4Gwyzqol6-NofTjHnWquuDzJOjHbkaAnboO8JNENY,11499
26
26
  tinybird/tb/modules/connection.py,sha256=ZSqBGoRiJedjHKEyB_fr1ybucOHtaad8d7uqGa2Q92M,28668
27
- tinybird/tb/modules/create.py,sha256=fr418rucTn9etxcOfdBViV9dk_mIQJpB_L0XO8NF4e0,10059
27
+ tinybird/tb/modules/create.py,sha256=jSVh8ysT5OoQ0EUg3ETU3VtKZayqFWBjPjcQSdYa7Sc,9882
28
28
  tinybird/tb/modules/datasource.py,sha256=rX7RnrXl4xxPwGxkj1DgLr521wjNXEixAeAyxMrkJJk,35472
29
29
  tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
30
30
  tinybird/tb/modules/fmt.py,sha256=UszEQO15fdzQ49QEj7Unhu68IKwSuKPsOrKhk2p2TAg,3547
31
31
  tinybird/tb/modules/job.py,sha256=eoBVyA24lYIPonU88Jn7FF9hBKz1kScy9_w_oWreuc4,2952
32
- tinybird/tb/modules/llm.py,sha256=duwf3r1caLaKzuOJC_stI_Hx54ncr-5uWaWeZ3HN65o,3099
32
+ tinybird/tb/modules/llm.py,sha256=OcyRzQ0V392XsiGFwrrpjkCuV6AdE6cnhh6cDKPQt7U,3102
33
33
  tinybird/tb/modules/local.py,sha256=hV2fvHPaVHVzKwVoVDFAIbJZslOX1_COx96DZrR-dW8,5151
34
- tinybird/tb/modules/local_common.py,sha256=Z2JYIE5HIJVNuzdIv1_NFxSEs8DOsLoCzbmT1iy0-HU,2172
35
- tinybird/tb/modules/login.py,sha256=vIeysdttfGDBMkf_i3cqAVNR5s0X0D6exATcRsDdWiA,5849
36
- tinybird/tb/modules/mock.py,sha256=5xhR_djr1-_JwJPI-Oy1exI3ndz7srmmvlei0DMQCAk,2824
34
+ tinybird/tb/modules/local_common.py,sha256=PsQu0Sg8BruusPzlzvs6dd2WlomvOcks-B37A798-Ls,2133
35
+ tinybird/tb/modules/login.py,sha256=kx3I197rOaBzyBMNyFKUoLK7sGXD5NWURJFvUbU6lZc,5832
36
+ tinybird/tb/modules/mock.py,sha256=cpEmfSv5Osy_YF5eaFcAlpAYi0oVlX1NQH4mnAKvlUI,2884
37
37
  tinybird/tb/modules/pipe.py,sha256=P_W5HW1-UEidWlw0pty-n_qYvCAyMlNorBmWzmCP7cU,30906
38
38
  tinybird/tb/modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
39
39
  tinybird/tb/modules/table.py,sha256=hG-PRDVuFp2uph41WpoLRV1yjp3RI2fi_iGGiI0rdxU,7695
40
40
  tinybird/tb/modules/tag.py,sha256=1qQWyk1p3Btv3LzM8VbJG-k7x2-pFuAlYCg3QL6QewI,3480
41
41
  tinybird/tb/modules/telemetry.py,sha256=iEGnMuCuNhvF6ln__j6X9MSTwL_0Hm-GgFHHHvhfknk,10466
42
- tinybird/tb/modules/test.py,sha256=wWOg9FFyAiJkF7qjYapJUne5SVyXwmmhStfpCAZwZ80,5383
42
+ tinybird/tb/modules/test.py,sha256=wvD3wDDAhvNyrFtsGXYfk45OuKY9Kix-1n8pzIhlhx4,8024
43
43
  tinybird/tb/modules/token.py,sha256=r0oeG1RpOOzHtqbUaHBiOmhE55HfNIvReAAWyKl9fJg,12695
44
44
  tinybird/tb/modules/workspace.py,sha256=FVlh-kbiZp5Gvp6dGFxi0UD8ail77rMamXLhqdVwrZ0,10916
45
45
  tinybird/tb/modules/workspace_members.py,sha256=08W0onEYkKLEC5TkAI07cxN9XSquEm7HnL7OkHAVDjo,8715
@@ -47,15 +47,15 @@ tinybird/tb/modules/datafile/build.py,sha256=rFdK_GerPDgPfyPfZ4EZ0-cQqWfHd6htS0l
47
47
  tinybird/tb/modules/datafile/build_common.py,sha256=74547h5ja4C66DAwDMabj75FA_BUTJxTJv-24tSFmrs,4551
48
48
  tinybird/tb/modules/datafile/build_datasource.py,sha256=fquzEGwk9NL_0K5YYG86Xtvgn4J5YHtRUoKJxbQGO0s,17344
49
49
  tinybird/tb/modules/datafile/build_pipe.py,sha256=V5u21NEpSCWNVl46Cdn_I_bOojxpgSrg1MnScPDqx4U,27648
50
- tinybird/tb/modules/datafile/common.py,sha256=NkoCdj4p-Ak3n80DJB5a33Ucw2WTcSYa8iqw4KsRZGs,81082
50
+ tinybird/tb/modules/datafile/common.py,sha256=NEX_fzDD1WGdo1oYMX8_w_M_wZQPvLAEOzGwC3Ph1mc,75632
51
51
  tinybird/tb/modules/datafile/diff.py,sha256=-iaP7GvAzZtZSa8jPgVpOFlTRutxgxRBLBcGL1_RFr4,6743
52
52
  tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
53
53
  tinybird/tb/modules/datafile/fixture.py,sha256=YHlL4tojmPwm343Y8KO6r7d5Bhsk7U3lKP-oLMeBMsY,1771
54
54
  tinybird/tb/modules/datafile/format_common.py,sha256=zNWDXvwSKC9_T5e9R92LLj9ekDflVWwsllhGQilZsnY,2184
55
55
  tinybird/tb/modules/datafile/format_datasource.py,sha256=tsnCjONISvhFuucKNbIHkT__UmlUbcswx5mwI9hiDQc,6216
56
56
  tinybird/tb/modules/datafile/format_pipe.py,sha256=R5tnlEccLn3KX6ehtC_H2sGQNrthuJUiVSN9z_-KGCY,7474
57
- tinybird/tb/modules/datafile/parse_datasource.py,sha256=YKt4Sy830p2jqXW5jN1Bf60AM5o4gZ3QcZjxnyWIeBg,1190
58
- tinybird/tb/modules/datafile/parse_pipe.py,sha256=STgA12LOLUnnb_cvVvZeEE4ka-nfk0jsNzxJhWj94cY,2599
57
+ tinybird/tb/modules/datafile/parse_datasource.py,sha256=mAGN72mviRS0rtpAD0kODhlu-N8j1fX2kp5D1GUzP6U,1464
58
+ tinybird/tb/modules/datafile/parse_pipe.py,sha256=9_j-wB4gsWtrXY8Gypt4EkOH6BepJpZkjFdZfbW-H50,2914
59
59
  tinybird/tb/modules/datafile/pipe_checker.py,sha256=cp80Bru41GlyMRvyERpdJNXns2MjmtIAWFnBLF4cPXs,24667
60
60
  tinybird/tb/modules/datafile/pull.py,sha256=wBXBAZIruIyCRQZvfYxMc7h1q35NlKF-hFIF-bUm4iY,5956
61
61
  tinybird/tb/modules/tinyunit/tinyunit.py,sha256=IkjRCvb8HnNEE84rtl0I1b9gQVpE_zCE8MvFFet51sg,11716
@@ -66,8 +66,8 @@ tinybird/tb_cli_modules/config.py,sha256=6NTgIdwf0X132A1j6G_YrdPep87ymZ9b5pABabK
66
66
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
67
67
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
68
68
  tinybird/tb_cli_modules/telemetry.py,sha256=iEGnMuCuNhvF6ln__j6X9MSTwL_0Hm-GgFHHHvhfknk,10466
69
- tinybird-0.0.1.dev17.dist-info/METADATA,sha256=eu-lIaxe76zXyzD78jMIjloB-BEVztY_wQeN3mJFoOI,2405
70
- tinybird-0.0.1.dev17.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
71
- tinybird-0.0.1.dev17.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
72
- tinybird-0.0.1.dev17.dist-info/top_level.txt,sha256=pgw6AzERHBcW3YTi2PW4arjxLkulk2msOz_SomfOEuc,45
73
- tinybird-0.0.1.dev17.dist-info/RECORD,,
69
+ tinybird-0.0.1.dev18.dist-info/METADATA,sha256=BXYeNyT3BS_18oePeU18RfW9Zbx0p6Rq_uPFRCN_Ss8,2446
70
+ tinybird-0.0.1.dev18.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
71
+ tinybird-0.0.1.dev18.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
72
+ tinybird-0.0.1.dev18.dist-info/top_level.txt,sha256=pgw6AzERHBcW3YTi2PW4arjxLkulk2msOz_SomfOEuc,45
73
+ tinybird-0.0.1.dev18.dist-info/RECORD,,