tinybird 0.0.1.dev111__py3-none-any.whl → 0.0.1.dev113__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 +32 -0
- tinybird/tb/__cli__.py +2 -2
- tinybird/tb/modules/cicd.py +7 -0
- tinybird/tb/modules/cli.py +8 -1
- tinybird/tb/modules/common.py +60 -86
- tinybird/tb/modules/connection.py +42 -0
- tinybird/tb/modules/create.py +60 -2
- tinybird/tb/modules/datafile/fixture.py +3 -1
- tinybird/tb/modules/feedback_manager.py +1 -1
- tinybird/tb/modules/infra.py +1 -1
- {tinybird-0.0.1.dev111.dist-info → tinybird-0.0.1.dev113.dist-info}/METADATA +1 -1
- {tinybird-0.0.1.dev111.dist-info → tinybird-0.0.1.dev113.dist-info}/RECORD +15 -15
- {tinybird-0.0.1.dev111.dist-info → tinybird-0.0.1.dev113.dist-info}/WHEEL +0 -0
- {tinybird-0.0.1.dev111.dist-info → tinybird-0.0.1.dev113.dist-info}/entry_points.txt +0 -0
- {tinybird-0.0.1.dev111.dist-info → tinybird-0.0.1.dev113.dist-info}/top_level.txt +0 -0
tinybird/prompts.py
CHANGED
|
@@ -954,3 +954,35 @@ FORWARD_QUERY >
|
|
|
954
954
|
</forward_query_example>
|
|
955
955
|
</deployment_instruction>
|
|
956
956
|
"""
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
def readme_prompt(readme: str, host: str, token: str, resources_xml: str) -> str:
|
|
960
|
+
return f"""
|
|
961
|
+
You are an expert in SQL and Tinybird. Follow these instructions to generate a new README.md file for a tinybird project:
|
|
962
|
+
Current README.md file:
|
|
963
|
+
<current_resources_xml>
|
|
964
|
+
{resources_xml}
|
|
965
|
+
</current_resources_xml>
|
|
966
|
+
<readme>{readme}</readme>
|
|
967
|
+
<readme_instructions>
|
|
968
|
+
- If it is not present in the current readme, generate a new ## Tinybird section with the following content:
|
|
969
|
+
- ### Overview section:
|
|
970
|
+
- Explaining the purpose of the project.
|
|
971
|
+
- ### Data sources section:
|
|
972
|
+
- Explaining the purpose of each datasource.
|
|
973
|
+
- Add a snippet of how to ingest data into each datasource like the following (where the payload example matches the datasource schema respecting non-nullable types):
|
|
974
|
+
curl -X POST "{host}/v0/events?name=events" \
|
|
975
|
+
-H "Authorization: Bearer {token}" \
|
|
976
|
+
-d '{{"date":"2025-01-31","id":"123","user_id":"abc"}}'
|
|
977
|
+
- ### Endpoints section:
|
|
978
|
+
- Explaining the purpose of each endpoint.
|
|
979
|
+
- Add a snippet of how to use each endpoint like the following:
|
|
980
|
+
curl -X GET "{host}/v0/pipes/pipe_name.json?token={token}"
|
|
981
|
+
- DateTime parameters must be formatted as YYYY-MM-DD HH:MM:SS, or else will fail.
|
|
982
|
+
- Do not include any other extra info related to Tinybird just maintain the existing one in the <readme> tag.
|
|
983
|
+
- Make sure the API host is correct, {host}.
|
|
984
|
+
- It is mandatory to return a <resource> tag with type "readme" in the response.
|
|
985
|
+
- The response must follow the following format:
|
|
986
|
+
<readme>[readme content here]</readme>
|
|
987
|
+
</readme_instructions>
|
|
988
|
+
"""
|
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.
|
|
8
|
-
__revision__ = '
|
|
7
|
+
__version__ = '0.0.1.dev113'
|
|
8
|
+
__revision__ = '49946d6'
|
tinybird/tb/modules/cicd.py
CHANGED
|
@@ -120,7 +120,9 @@ tinybird_ci_workflow:
|
|
|
120
120
|
services:
|
|
121
121
|
- name: tinybirdco/tinybird-local:beta
|
|
122
122
|
alias: tinybird-local
|
|
123
|
+
"""
|
|
123
124
|
|
|
125
|
+
GITLAB_CD_YML = """
|
|
124
126
|
tinybird_cd_workflow:
|
|
125
127
|
image: ubuntu:latest
|
|
126
128
|
stage: deploy
|
|
@@ -217,6 +219,11 @@ class GitLabCICDGenerator(CICDGeneratorBase):
|
|
|
217
219
|
file_name="tinybird-ci.yml",
|
|
218
220
|
dir_path=".gitlab/tinybird",
|
|
219
221
|
),
|
|
222
|
+
CICDFile(
|
|
223
|
+
template=GITLAB_CD_YML,
|
|
224
|
+
file_name="tinybird-cd.yml",
|
|
225
|
+
dir_path=".gitlab/tinybird",
|
|
226
|
+
),
|
|
220
227
|
]
|
|
221
228
|
|
|
222
229
|
|
tinybird/tb/modules/cli.py
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import json
|
|
7
7
|
import logging
|
|
8
8
|
import os
|
|
9
|
+
import shutil
|
|
9
10
|
import sys
|
|
10
11
|
from os import getcwd
|
|
11
12
|
from pathlib import Path
|
|
@@ -48,7 +49,13 @@ DEFAULT_PATTERNS: List[Tuple[str, Union[str, Callable[[str], str]]]] = [
|
|
|
48
49
|
VERSION = f"{__cli__.__version__} (rev {__cli__.__revision__})"
|
|
49
50
|
|
|
50
51
|
|
|
51
|
-
@click.group(
|
|
52
|
+
@click.group(
|
|
53
|
+
cls=CatchAuthExceptions,
|
|
54
|
+
context_settings={
|
|
55
|
+
"help_option_names": ["-h", "--help"],
|
|
56
|
+
"max_content_width": shutil.get_terminal_size().columns - 10,
|
|
57
|
+
},
|
|
58
|
+
)
|
|
52
59
|
@click.option(
|
|
53
60
|
"--debug/--no-debug",
|
|
54
61
|
default=False,
|
tinybird/tb/modules/common.py
CHANGED
|
@@ -1751,90 +1751,69 @@ async def remove_release(
|
|
|
1751
1751
|
click.echo(FeedbackManager.info_no_release_deleted())
|
|
1752
1752
|
|
|
1753
1753
|
|
|
1754
|
-
async def
|
|
1754
|
+
async def run_aws_iamrole_connection_flow(
|
|
1755
1755
|
client: TinyB,
|
|
1756
1756
|
service: str,
|
|
1757
|
-
|
|
1758
|
-
region: Optional[str],
|
|
1759
|
-
policy: str = "write",
|
|
1760
|
-
no_validate: Optional[bool] = False,
|
|
1757
|
+
policy: str = "read",
|
|
1761
1758
|
):
|
|
1762
|
-
if
|
|
1763
|
-
|
|
1764
|
-
client, service=service, policy=policy
|
|
1765
|
-
)
|
|
1759
|
+
if service == DataConnectorType.AMAZON_DYNAMODB:
|
|
1760
|
+
raise NotImplementedError("DynamoDB is not supported yet")
|
|
1766
1761
|
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
show_default=False,
|
|
1771
|
-
prompt_suffix="Press y to continue:",
|
|
1772
|
-
):
|
|
1773
|
-
sys.exit(1)
|
|
1762
|
+
resource_type = "table" if service == DataConnectorType.AMAZON_DYNAMODB else "bucket"
|
|
1763
|
+
resource_name = click.prompt(f"Enter the name of the {resource_type}")
|
|
1764
|
+
validate_string_connector_param(resource_type.capitalize(), resource_name)
|
|
1774
1765
|
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
pyperclip.copy(access_policy)
|
|
1778
|
-
except Exception:
|
|
1779
|
-
access_policy_copied = False
|
|
1766
|
+
resource_region = click.prompt(f"Enter the region where the {resource_type} is located")
|
|
1767
|
+
validate_string_connector_param("Region", resource_region)
|
|
1780
1768
|
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
"<table_name>": "<table_name> with your DynamoDB table name",
|
|
1784
|
-
}
|
|
1769
|
+
access_policy, trust_policy, external_id = await get_aws_iamrole_policies(client, service=service, policy=policy)
|
|
1770
|
+
access_policy = access_policy.replace("<bucket>", resource_name)
|
|
1785
1771
|
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1772
|
+
if not click.confirm(
|
|
1773
|
+
FeedbackManager.prompt_s3_iamrole_connection_login_aws(),
|
|
1774
|
+
show_default=False,
|
|
1775
|
+
prompt_suffix="Press y to continue:",
|
|
1776
|
+
):
|
|
1777
|
+
sys.exit(1)
|
|
1791
1778
|
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
if access_policy_copied
|
|
1798
|
-
else FeedbackManager.prompt_s3_iamrole_connection_policy_not_copied(access_policy=access_policy)
|
|
1799
|
-
),
|
|
1800
|
-
show_default=False,
|
|
1801
|
-
prompt_suffix="Press y to continue:",
|
|
1802
|
-
):
|
|
1803
|
-
sys.exit(1)
|
|
1804
|
-
|
|
1805
|
-
trust_policy_copied = True
|
|
1806
|
-
try:
|
|
1807
|
-
pyperclip.copy(trust_policy)
|
|
1808
|
-
except Exception:
|
|
1809
|
-
trust_policy_copied = False
|
|
1810
|
-
|
|
1811
|
-
if not click.confirm(
|
|
1812
|
-
(
|
|
1813
|
-
FeedbackManager.prompt_s3_iamrole_connection_role(trust_policy=trust_policy)
|
|
1814
|
-
if trust_policy_copied
|
|
1815
|
-
else FeedbackManager.prompt_s3_iamrole_connection_role_not_copied(trust_policy=trust_policy)
|
|
1816
|
-
),
|
|
1817
|
-
show_default=False,
|
|
1818
|
-
prompt_suffix="Press y to continue:",
|
|
1819
|
-
):
|
|
1820
|
-
sys.exit(1)
|
|
1821
|
-
else:
|
|
1822
|
-
try:
|
|
1823
|
-
trust_policy = await client.get_trust_policy(service)
|
|
1824
|
-
external_id = trust_policy["Statement"][0]["Condition"]["StringEquals"]["sts:ExternalId"]
|
|
1825
|
-
except Exception:
|
|
1826
|
-
external_id = ""
|
|
1779
|
+
access_policy_copied = True
|
|
1780
|
+
try:
|
|
1781
|
+
pyperclip.copy(access_policy)
|
|
1782
|
+
except Exception:
|
|
1783
|
+
access_policy_copied = False
|
|
1827
1784
|
|
|
1828
|
-
if not
|
|
1829
|
-
|
|
1830
|
-
|
|
1785
|
+
if not click.confirm(
|
|
1786
|
+
(
|
|
1787
|
+
FeedbackManager.prompt_s3_iamrole_connection_policy(access_policy=access_policy)
|
|
1788
|
+
if access_policy_copied
|
|
1789
|
+
else FeedbackManager.prompt_s3_iamrole_connection_policy_not_copied(access_policy=access_policy)
|
|
1790
|
+
),
|
|
1791
|
+
show_default=False,
|
|
1792
|
+
prompt_suffix="Press y to continue:",
|
|
1793
|
+
):
|
|
1794
|
+
sys.exit(1)
|
|
1831
1795
|
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1796
|
+
trust_policy_copied = True
|
|
1797
|
+
try:
|
|
1798
|
+
pyperclip.copy(trust_policy)
|
|
1799
|
+
except Exception:
|
|
1800
|
+
trust_policy_copied = False
|
|
1836
1801
|
|
|
1837
|
-
|
|
1802
|
+
if not click.confirm(
|
|
1803
|
+
(
|
|
1804
|
+
FeedbackManager.prompt_s3_iamrole_connection_role(trust_policy=trust_policy)
|
|
1805
|
+
if trust_policy_copied
|
|
1806
|
+
else FeedbackManager.prompt_s3_iamrole_connection_role_not_copied(trust_policy=trust_policy)
|
|
1807
|
+
),
|
|
1808
|
+
show_default=False,
|
|
1809
|
+
prompt_suffix="Press y to continue:",
|
|
1810
|
+
):
|
|
1811
|
+
sys.exit(1)
|
|
1812
|
+
|
|
1813
|
+
role_arn = click.prompt("Enter the ARN of the role you just created")
|
|
1814
|
+
validate_string_connector_param("Role ARN", role_arn)
|
|
1815
|
+
|
|
1816
|
+
return role_arn, resource_region, external_id
|
|
1838
1817
|
|
|
1839
1818
|
|
|
1840
1819
|
async def get_aws_iamrole_policies(client: TinyB, service: str, policy: str = "write"):
|
|
@@ -1867,20 +1846,15 @@ async def get_aws_iamrole_policies(client: TinyB, service: str, policy: str = "w
|
|
|
1867
1846
|
return json.dumps(access_policy, indent=4), json.dumps(trust_policy, indent=4), external_id
|
|
1868
1847
|
|
|
1869
1848
|
|
|
1870
|
-
async def validate_aws_iamrole_connection_name(
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
raise CLIConnectionException(FeedbackManager.info_connection_already_exists(name=connection_name))
|
|
1876
|
-
else:
|
|
1877
|
-
while not connection_name:
|
|
1878
|
-
connection_name = click.prompt("Enter the name for this connection", default=None, show_default=False)
|
|
1879
|
-
assert isinstance(connection_name, str)
|
|
1849
|
+
async def validate_aws_iamrole_connection_name(client: TinyB) -> str:
|
|
1850
|
+
connection_name = None
|
|
1851
|
+
while not connection_name:
|
|
1852
|
+
connection_name = click.prompt("Enter the name for this connection", default=None, show_default=False)
|
|
1853
|
+
assert isinstance(connection_name, str)
|
|
1880
1854
|
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1855
|
+
if await client.get_connector(connection_name) is not None:
|
|
1856
|
+
click.echo(FeedbackManager.info_connection_already_exists(name=connection_name))
|
|
1857
|
+
connection_name = None
|
|
1884
1858
|
assert isinstance(connection_name, str)
|
|
1885
1859
|
return connection_name
|
|
1886
1860
|
|
|
@@ -15,8 +15,12 @@ from tinybird.tb.modules.common import (
|
|
|
15
15
|
_get_setting_value,
|
|
16
16
|
coro,
|
|
17
17
|
echo_safe_humanfriendly_tables_format_smart_table,
|
|
18
|
+
run_aws_iamrole_connection_flow,
|
|
19
|
+
validate_aws_iamrole_connection_name,
|
|
18
20
|
)
|
|
21
|
+
from tinybird.tb.modules.create import generate_aws_iamrole_connection_file
|
|
19
22
|
from tinybird.tb.modules.feedback_manager import FeedbackManager
|
|
23
|
+
from tinybird.tb.modules.project import Project
|
|
20
24
|
|
|
21
25
|
DATA_CONNECTOR_SETTINGS: Dict[DataConnectorType, List[str]] = {
|
|
22
26
|
DataConnectorType.KAFKA: [
|
|
@@ -123,3 +127,41 @@ async def connection_ls(ctx: Context, service: Optional[DataConnectorType] = Non
|
|
|
123
127
|
column_names = [c.replace("kafka_", "") for c in columns]
|
|
124
128
|
echo_safe_humanfriendly_tables_format_smart_table(table, column_names=column_names)
|
|
125
129
|
click.echo("\n")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@connection.group(name="create")
|
|
133
|
+
@click.pass_context
|
|
134
|
+
def connection_create(ctx: Context) -> None:
|
|
135
|
+
"""Create a connection."""
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@connection_create.command(name="s3", short_help="Creates a AWS S3 connection.")
|
|
139
|
+
@click.pass_context
|
|
140
|
+
@coro
|
|
141
|
+
async def connection_create_s3(ctx: Context) -> None:
|
|
142
|
+
"""
|
|
143
|
+
Creates a AWS S3 connection.
|
|
144
|
+
|
|
145
|
+
\b
|
|
146
|
+
$ tb connection create s3
|
|
147
|
+
"""
|
|
148
|
+
project: Project = ctx.ensure_object(dict)["project"]
|
|
149
|
+
obj: Dict[str, Any] = ctx.ensure_object(dict)
|
|
150
|
+
client: TinyB = obj["client"]
|
|
151
|
+
service = DataConnectorType.AMAZON_S3
|
|
152
|
+
connection_name = await validate_aws_iamrole_connection_name(client)
|
|
153
|
+
role_arn, region, external_id = await run_aws_iamrole_connection_flow(
|
|
154
|
+
client,
|
|
155
|
+
service=service,
|
|
156
|
+
policy="read", # For now only read since we only support import from S3
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
await generate_aws_iamrole_connection_file(
|
|
160
|
+
name=connection_name, service=service, role_arn=role_arn, region=region, folder=project.folder
|
|
161
|
+
)
|
|
162
|
+
if external_id:
|
|
163
|
+
click.echo(
|
|
164
|
+
FeedbackManager.success_s3_iam_connection_created(
|
|
165
|
+
connection_name=connection_name, external_id=external_id, role_arn=role_arn
|
|
166
|
+
)
|
|
167
|
+
)
|
tinybird/tb/modules/create.py
CHANGED
|
@@ -6,7 +6,7 @@ from typing import Optional, Tuple
|
|
|
6
6
|
import click
|
|
7
7
|
|
|
8
8
|
from tinybird.client import TinyB
|
|
9
|
-
from tinybird.prompts import create_prompt, mock_prompt, rules_prompt
|
|
9
|
+
from tinybird.prompts import create_prompt, mock_prompt, readme_prompt, rules_prompt
|
|
10
10
|
from tinybird.tb.modules.cicd import init_cicd
|
|
11
11
|
from tinybird.tb.modules.cli import cli
|
|
12
12
|
from tinybird.tb.modules.common import _generate_datafile, coro, generate_datafile
|
|
@@ -88,12 +88,32 @@ async def create(
|
|
|
88
88
|
click.echo(FeedbackManager.success(message="✓ Scaffolding completed!\n"))
|
|
89
89
|
created_something = True
|
|
90
90
|
result = ""
|
|
91
|
-
if data or prompt:
|
|
91
|
+
if (data or prompt) and user_token:
|
|
92
92
|
click.echo(FeedbackManager.highlight(message="\n» Creating resources..."))
|
|
93
93
|
result, created_something = await create_resources(
|
|
94
94
|
local_client, tb_client, user_token, data, prompt, folder
|
|
95
95
|
)
|
|
96
96
|
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
97
|
+
if prompt:
|
|
98
|
+
readme_path = Path(root_folder) / "README.md"
|
|
99
|
+
if readme_path.exists():
|
|
100
|
+
click.echo(FeedbackManager.highlight(message="\n» Updating README.md..."))
|
|
101
|
+
else:
|
|
102
|
+
click.echo(FeedbackManager.highlight(message="\n» Creating README.md..."))
|
|
103
|
+
readme_path.touch()
|
|
104
|
+
llm = LLM(user_token=str(user_token), host=tb_client.host)
|
|
105
|
+
readme_user_prompt = prompt or ""
|
|
106
|
+
all_resources_xml = get_resources_xml(project)
|
|
107
|
+
readme_response = llm.ask(
|
|
108
|
+
system_prompt=readme_prompt(
|
|
109
|
+
readme_path.read_text(), tb_client.host, tb_client.token, all_resources_xml
|
|
110
|
+
),
|
|
111
|
+
prompt=readme_user_prompt,
|
|
112
|
+
)
|
|
113
|
+
readme_result = extract_xml(readme_response, "readme")
|
|
114
|
+
readme_path.write_text(readme_result)
|
|
115
|
+
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
116
|
+
created_something = True
|
|
97
117
|
|
|
98
118
|
if not already_has_cicd(root_folder):
|
|
99
119
|
click.echo(FeedbackManager.highlight(message="\n» Creating CI/CD files for GitHub and GitLab..."))
|
|
@@ -353,6 +373,17 @@ def generate_connection_file(name: str, content: str, folder: str) -> Path:
|
|
|
353
373
|
return f.relative_to(folder)
|
|
354
374
|
|
|
355
375
|
|
|
376
|
+
async def generate_aws_iamrole_connection_file(
|
|
377
|
+
name: str, service: str, role_arn: str, region: str, folder: str
|
|
378
|
+
) -> None:
|
|
379
|
+
content = f"""TYPE {service}
|
|
380
|
+
|
|
381
|
+
S3_ARN {role_arn}
|
|
382
|
+
S3_REGION {region}
|
|
383
|
+
"""
|
|
384
|
+
generate_connection_file(name, content, folder)
|
|
385
|
+
|
|
386
|
+
|
|
356
387
|
def create_rules(folder: str, source: str, agent: str):
|
|
357
388
|
if agent == "cursor":
|
|
358
389
|
extension = ".cursorrules"
|
|
@@ -379,3 +410,30 @@ def get_context() -> str:
|
|
|
379
410
|
def save_context(prompt: str, feedback: str):
|
|
380
411
|
context_file = get_context_file()
|
|
381
412
|
context_file.write_text(f"- {prompt}\n{feedback}")
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def get_resources_xml(project: Project) -> str:
|
|
416
|
+
folder = project.folder
|
|
417
|
+
datasource_paths = [
|
|
418
|
+
Path(folder) / "datasources" / f for f in os.listdir(Path(folder) / "datasources") if f.endswith(".datasource")
|
|
419
|
+
]
|
|
420
|
+
pipes_paths = [
|
|
421
|
+
Path(folder) / "endpoints" / f for f in os.listdir(Path(folder) / "endpoints") if f.endswith(".pipe")
|
|
422
|
+
]
|
|
423
|
+
resources_xml = "\n".join(
|
|
424
|
+
[
|
|
425
|
+
f"<resource><type>{resource_type}</type><name>{resource_name}</name><content>{resource_content}</content></resource>"
|
|
426
|
+
for resource_type, resource_name, resource_content in [
|
|
427
|
+
("datasource", ds.stem, ds.read_text()) for ds in datasource_paths
|
|
428
|
+
]
|
|
429
|
+
+ [
|
|
430
|
+
(
|
|
431
|
+
"pipe",
|
|
432
|
+
pipe.stem,
|
|
433
|
+
pipe.read_text(),
|
|
434
|
+
)
|
|
435
|
+
for pipe in pipes_paths
|
|
436
|
+
]
|
|
437
|
+
]
|
|
438
|
+
)
|
|
439
|
+
return resources_xml
|
|
@@ -5,7 +5,9 @@ from tinybird.tb.modules.common import format_data_to_ndjson
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def get_fixture_dir(folder: str) -> Path:
|
|
8
|
-
|
|
8
|
+
fixture_dir = Path(folder) / "fixtures"
|
|
9
|
+
fixture_dir.mkdir(exist_ok=True)
|
|
10
|
+
return fixture_dir
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
def persist_fixture_sql(fixture_name: str, sql: str, folder: str) -> Path:
|
|
@@ -498,7 +498,7 @@ Ready? """
|
|
|
498
498
|
|
|
499
499
|
prompt_s3_iamrole_connection_login_aws = prompt_message("""[1] Log into your AWS Console\n\n""")
|
|
500
500
|
prompt_s3_iamrole_connection_policy = prompt_message(
|
|
501
|
-
"""\n[2] Go to IAM > Policies. Create a new policy with the following permissions
|
|
501
|
+
"""\n[2] Go to IAM > Policies. Create a new policy with the following permissions:\n\n{access_policy}\n\n(The policy has been copied to your clipboard)\n\n"""
|
|
502
502
|
)
|
|
503
503
|
prompt_s3_iamrole_connection_policy_not_copied = prompt_message(
|
|
504
504
|
"""\n[2] Go to IAM > Policies. Create a new policy with the following permissions. Please, copy this policy and replace <bucket> with your bucket name:\n\n{access_policy}\n\n"""
|
tinybird/tb/modules/infra.py
CHANGED
|
@@ -371,7 +371,7 @@ async def infra_init(
|
|
|
371
371
|
|
|
372
372
|
# Create infra directory if it doesn't exist
|
|
373
373
|
infra_dir = Path(f"infra/{cloud_provider}")
|
|
374
|
-
infra_dir.mkdir(exist_ok=True)
|
|
374
|
+
infra_dir.mkdir(parents=True, exist_ok=True)
|
|
375
375
|
yaml_path = infra_dir / "k8s.yaml"
|
|
376
376
|
tf_path = infra_dir / "main.tf"
|
|
377
377
|
config_path = infra_dir / "config.json"
|
|
@@ -6,7 +6,7 @@ tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
|
|
|
6
6
|
tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
|
|
7
7
|
tinybird/feedback_manager.py,sha256=a_ZhFX2zcB7vRknIcmHKMdQbb0c7TqlTBQ_5hPuWh88,69267
|
|
8
8
|
tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
|
|
9
|
-
tinybird/prompts.py,sha256=
|
|
9
|
+
tinybird/prompts.py,sha256=6J-dE0gOSOaIwdEwJUhEQS1Ztllz_qZnpnrv-tDoJWA,35511
|
|
10
10
|
tinybird/sql.py,sha256=C_B81wwv3BsqyXGhF5oTk9DcTUkrp7NwIFqSzd3Dmjc,47854
|
|
11
11
|
tinybird/sql_template.py,sha256=mK0yeRFctbXTAu0VNMjIzoFBJoh9PoniAVgEatA5SG4,99832
|
|
12
12
|
tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
|
|
@@ -15,24 +15,24 @@ 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=
|
|
18
|
+
tinybird/tb/__cli__.py,sha256=LaRkkDcDxWMZ18zj4QiJLTrW9enEg_2awfZ1Gc0sO-U,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
|
|
22
|
-
tinybird/tb/modules/cicd.py,sha256=
|
|
23
|
-
tinybird/tb/modules/cli.py,sha256=
|
|
24
|
-
tinybird/tb/modules/common.py,sha256=
|
|
22
|
+
tinybird/tb/modules/cicd.py,sha256=A7zJZF9HkJ6NPokplgNjmefMrpUlRbFxBbjMZhq5OTI,7110
|
|
23
|
+
tinybird/tb/modules/cli.py,sha256=sZEYoJVfqN6zaCSN5NQRrzQLXxeJ5nDO7EnFXit9qh8,16157
|
|
24
|
+
tinybird/tb/modules/common.py,sha256=d2kkXrkoMBmh_CirBBgLw1E1_cxKUUB3ZE_Mx1x9tww,81717
|
|
25
25
|
tinybird/tb/modules/config.py,sha256=FqdLpLaKpYubqw3xkB4EX06ufZYDgGRxONR_9i-y-KE,11416
|
|
26
|
-
tinybird/tb/modules/connection.py,sha256=
|
|
26
|
+
tinybird/tb/modules/connection.py,sha256=IL095_8ideKM1Ueen3BdsYvJKA05VAdpv7bSQjhXKJo,5354
|
|
27
27
|
tinybird/tb/modules/copy.py,sha256=MAVqKip8_QhOYq99U_XuqSO6hCLJEh5sFtbhcXtI3SI,5802
|
|
28
|
-
tinybird/tb/modules/create.py,sha256=
|
|
28
|
+
tinybird/tb/modules/create.py,sha256=hIFZeaVKxNij80jKMWT9Pq9M-Uoo2hoUXfb1VdD5H_8,16401
|
|
29
29
|
tinybird/tb/modules/datasource.py,sha256=dNCK9iCR2xPLfwqqwg2ixyE6NuoVEiJU2mBZBmOYrVY,16906
|
|
30
30
|
tinybird/tb/modules/deployment.py,sha256=UIW3W0qKBRk2o4gE8WDjmq9-UkrNZjtkbyKvcQR203k,19515
|
|
31
31
|
tinybird/tb/modules/endpoint.py,sha256=EhVoGAXsFz-83Fiwj1gI-I73iRRvL49d0W81un7hvPE,12080
|
|
32
32
|
tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
|
|
33
|
-
tinybird/tb/modules/feedback_manager.py,sha256=
|
|
33
|
+
tinybird/tb/modules/feedback_manager.py,sha256=7e-O-LyTi_hTln47Y_FuSWerggZQLUGqfTJeYK6D9i4,69479
|
|
34
34
|
tinybird/tb/modules/fmt.py,sha256=qpf9APqKTKL2uphNgdbj4OMVyLkAxZn6dn4eHF99L5g,3553
|
|
35
|
-
tinybird/tb/modules/infra.py,sha256=
|
|
35
|
+
tinybird/tb/modules/infra.py,sha256=fnbsfx8paRE8RHPbjdSOiOEvtyQbJ95OrHZuCighgKA,33203
|
|
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
|
|
@@ -64,7 +64,7 @@ tinybird/tb/modules/datafile/build_pipe.py,sha256=w-Wd08gZYAEcak9FdBijVfIU2_Wn_P
|
|
|
64
64
|
tinybird/tb/modules/datafile/common.py,sha256=4pvW92X9BXomaN3-WhQOjvnAHY96O4dTsp4USBdknzk,83192
|
|
65
65
|
tinybird/tb/modules/datafile/diff.py,sha256=-0J7PsBO64T7LOZSkZ4ZFHHCPvT7cKItnJkbz2PkndU,6754
|
|
66
66
|
tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
|
|
67
|
-
tinybird/tb/modules/datafile/fixture.py,sha256=
|
|
67
|
+
tinybird/tb/modules/datafile/fixture.py,sha256=V3WGfPLIR78el3oCNWNkySWs6LxIufyIM0mDrrT3aWc,1131
|
|
68
68
|
tinybird/tb/modules/datafile/format_common.py,sha256=WaNV4tXrQU5gjV6MJP-5TGqg_Bre6ilNS8emvFl-X3c,1967
|
|
69
69
|
tinybird/tb/modules/datafile/format_datasource.py,sha256=gpRsGnDEMxEo0pIlEHXKvyuwKIpqJJUCN9JRSiDYs_4,6156
|
|
70
70
|
tinybird/tb/modules/datafile/format_pipe.py,sha256=58iSTrJ5lg-IsbpX8TQumQTuZ6UIotMsCIkNJd1M-pM,7418
|
|
@@ -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.
|
|
85
|
-
tinybird-0.0.1.
|
|
86
|
-
tinybird-0.0.1.
|
|
87
|
-
tinybird-0.0.1.
|
|
88
|
-
tinybird-0.0.1.
|
|
84
|
+
tinybird-0.0.1.dev113.dist-info/METADATA,sha256=pXBu3TNee7oQ8TTmimVtTCShVvNle6Q26inMsxXIU6o,1612
|
|
85
|
+
tinybird-0.0.1.dev113.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
86
|
+
tinybird-0.0.1.dev113.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
|
|
87
|
+
tinybird-0.0.1.dev113.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
|
|
88
|
+
tinybird-0.0.1.dev113.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|