tinybird 0.0.1.dev88__py3-none-any.whl → 0.0.1.dev90__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.

@@ -761,6 +761,16 @@ def engine_local_to_replicated(engine: str, database: str, name: str) -> str:
761
761
  return re.sub(r"(.*)MergeTree(\(([^\)]*)\))*(.*)", _replace, engine.strip())
762
762
 
763
763
 
764
+ def ttl_from_engine(engine: str) -> Optional[str]:
765
+ ttl_array = engine.split(" TTL ")
766
+ if len(ttl_array) <= 1:
767
+ return None
768
+ settings_array = engine.split(" SETTINGS ")
769
+ settings = " SETTINGS " + settings_array[1] if len(settings_array) > 1 else None
770
+ ttl = ttl_array[1][: -(len(settings))] if settings else ttl_array[1]
771
+ return ttl
772
+
773
+
764
774
  def ttl_condition_from_engine_full(engine_full: Optional[str]) -> Optional[str]:
765
775
  """
766
776
  >>> ttl_condition_from_engine_full(None)
@@ -808,13 +818,9 @@ def ttl_condition_from_engine_full(engine_full: Optional[str]) -> Optional[str]:
808
818
  return None
809
819
 
810
820
  try:
811
- ttl_array = engine_full.split(" TTL ")
812
- if len(ttl_array) <= 1:
821
+ ttl = ttl_from_engine(engine_full)
822
+ if not ttl:
813
823
  return None
814
- settings_array = engine_full.split(" SETTINGS ")
815
- settings = " SETTINGS " + settings_array[1] if len(settings_array) > 1 else None
816
- ttl = ttl_array[1][: -(len(settings))] if settings else ttl_array[1]
817
-
818
824
  groups = SIMPLE_TTL_DEFINITION.search(ttl)
819
825
  if not groups:
820
826
  return None
tinybird/client.py CHANGED
@@ -288,6 +288,25 @@ class TinyB:
288
288
  ds = [x for x in ds if x["name"].startswith(branch)]
289
289
  return ds
290
290
 
291
+ async def secrets(self) -> List[Dict[str, Any]]:
292
+ response = await self._req("/v0/variables")
293
+ return response["variables"]
294
+
295
+ async def get_secret(self, name: str) -> Optional[Dict[str, Any]]:
296
+ return await self._req(f"/v0/variables/{name}")
297
+
298
+ async def create_secret(self, name: str, value: str):
299
+ response = await self._req("/v0/variables", method="POST", data={"name": name, "value": value})
300
+ return response
301
+
302
+ async def update_secret(self, name: str, value: str):
303
+ response = await self._req(f"/v0/variables/{name}", method="PUT", data={"value": value})
304
+ return response
305
+
306
+ async def delete_secret(self, name: str):
307
+ response = await self._req(f"/v0/variables/{name}", method="DELETE")
308
+ return response
309
+
291
310
  async def get_connections(self, service: Optional[str] = None):
292
311
  params = {}
293
312
 
tinybird/config.py CHANGED
@@ -30,6 +30,7 @@ LEGACY_HOSTS = {
30
30
  "https://api.us-west-2.aws.tinybird.co": "https://app.tinybird.co/aws/us-west-2",
31
31
  "https://api.eu-central-1.aws.tinybird.co": "https://app.tinybird.co/aws/eu-central-1",
32
32
  "https://api.eu-west-1.aws.tinybird.co": "https://app.tinybird.co/aws/eu-west-1",
33
+ "https://api.europe-west2.gcp.tinybird.co": "https://cloud.tinybird.co/gcp/europe-west2",
33
34
  "https://api.ap-east.aws.tinybird.co": "https://app.tinybird.co/aws/ap-east",
34
35
  "https://api.wadus1.gcp.tinybird.co": "https://app.wadus.tinybird.co/gcp/wadus1",
35
36
  "https://api.wadus2.gcp.tinybird.co": "https://app.wadus.tinybird.co/gcp/wadus2",
@@ -48,6 +49,7 @@ LEGACY_HOSTS = {
48
49
  "https://ui.us-east.aws.tinybird.co": "https://app.tinybird.co/aws/us-east-1",
49
50
  "https://ui.us-west-2.aws.tinybird.co": "https://app.tinybird.co/aws/us-west-2",
50
51
  "https://ui.eu-central-1.aws.tinybird.co": "https://app.tinybird.co/aws/eu-central-1",
52
+ "https://ui.europe-west2.gcp.tinybird.co": "https://cloud.tinybird.co/gcp/europe-west2",
51
53
  "https://ui.ap-east.aws.tinybird.co": "https://app.tinybird.co/aws/ap-east",
52
54
  "https://ui.split.tinybird.co": "https://app.tinybird.co/aws/split-us-east",
53
55
  "https://ui.split.us-west-2.aws.tinybird.co": "https://app.tinybird.co/aws/split-us-west-2",
tinybird/context.py CHANGED
@@ -7,7 +7,7 @@ if TYPE_CHECKING:
7
7
 
8
8
  workspace_id: ContextVar[str] = ContextVar("workspace_id")
9
9
  workspace: ContextVar["User"] = ContextVar("workspace")
10
- datasource_id: ContextVar[str] = ContextVar("datasource_id")
10
+ table_id: ContextVar[str] = ContextVar("table_id")
11
11
  hfi_frequency: ContextVar[float] = ContextVar("hfi_frequency")
12
12
  hfi_frequency_gatherer: ContextVar[float] = ContextVar("hfi_frequency_gatherer")
13
13
  use_gatherer: ContextVar[bool] = ContextVar("use_gatherer")
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.dev88'
8
- __revision__ = 'fd53f21'
7
+ __version__ = '0.0.1.dev90'
8
+ __revision__ = 'd11bb13'
tinybird/tb/cli.py CHANGED
@@ -22,6 +22,7 @@ import tinybird.tb.modules.materialization
22
22
  import tinybird.tb.modules.mock
23
23
  import tinybird.tb.modules.pipe
24
24
  import tinybird.tb.modules.playground
25
+ import tinybird.tb.modules.secret
25
26
  import tinybird.tb.modules.tag
26
27
  import tinybird.tb.modules.test
27
28
  import tinybird.tb.modules.token
@@ -191,17 +191,19 @@ def deployment_group() -> None:
191
191
  help="Validate the deployment before creating it. Disabled by default.",
192
192
  )
193
193
  @click.option(
194
- "--allow-remove-datasources/--no-allow-remove-datasources",
194
+ "--allow-destructive-operations/--no-allow-destructive-operations",
195
195
  is_flag=True,
196
196
  default=False,
197
197
  help="Allow removing datasources. Disabled by default.",
198
198
  )
199
199
  @click.pass_context
200
- def deployment_create(ctx: click.Context, wait: bool, auto: bool, check: bool, allow_remove_datasources: bool) -> None:
200
+ def deployment_create(
201
+ ctx: click.Context, wait: bool, auto: bool, check: bool, allow_destructive_operations: bool
202
+ ) -> None:
201
203
  """
202
204
  Validate and deploy the project server side.
203
205
  """
204
- create_deployment(ctx, wait, auto, check, allow_remove_datasources)
206
+ create_deployment(ctx, wait, auto, check, allow_destructive_operations)
205
207
 
206
208
 
207
209
  @deployment_group.command(name="ls")
@@ -298,17 +300,17 @@ def deployment_rollback(ctx: click.Context, wait: bool) -> None:
298
300
  help="Validate the deployment before creating it. Disabled by default.",
299
301
  )
300
302
  @click.option(
301
- "--allow-remove-datasources/--no-allow-remove-datasources",
303
+ "--allow-destructive-operations/--no-allow-destructive-operations",
302
304
  is_flag=True,
303
305
  default=False,
304
306
  help="Allow removing datasources. Disabled by default.",
305
307
  )
306
308
  @click.pass_context
307
- def deploy(ctx: click.Context, wait: bool, auto: bool, check: bool, allow_remove_datasources: bool) -> None:
309
+ def deploy(ctx: click.Context, wait: bool, auto: bool, check: bool, allow_destructive_operations: bool) -> None:
308
310
  """
309
311
  Deploy the project.
310
312
  """
311
- create_deployment(ctx, wait, auto, check, allow_remove_datasources)
313
+ create_deployment(ctx, wait, auto, check, allow_destructive_operations)
312
314
 
313
315
 
314
316
  def create_deployment(
@@ -316,7 +318,7 @@ def create_deployment(
316
318
  wait: bool,
317
319
  auto: bool,
318
320
  check: Optional[bool] = None,
319
- allow_remove_datasources: Optional[bool] = None,
321
+ allow_destructive_operations: Optional[bool] = None,
320
322
  ) -> None:
321
323
  # TODO: This code is duplicated in build_server.py
322
324
  # Should be refactored to be shared
@@ -350,8 +352,8 @@ def create_deployment(
350
352
  if check:
351
353
  click.echo(FeedbackManager.highlight(message="\n» Validating deployment...\n"))
352
354
  params["check"] = "true"
353
- if allow_remove_datasources:
354
- params["allow_remove_datasources"] = "true"
355
+ if allow_destructive_operations:
356
+ params["allow_destructive_operations"] = "true"
355
357
  r = requests.post(TINYBIRD_API_URL, files=files, headers=HEADERS, params=params)
356
358
  result = r.json()
357
359
  logging.debug(json.dumps(result, indent=2))
@@ -0,0 +1,85 @@
1
+ import re
2
+ from typing import Optional
3
+
4
+ import click
5
+
6
+ from tinybird.client import TinyB
7
+ from tinybird.tb.modules.cli import cli
8
+ from tinybird.tb.modules.common import coro, echo_safe_humanfriendly_tables_format_smart_table
9
+ from tinybird.tb.modules.feedback_manager import FeedbackManager
10
+
11
+
12
+ @cli.group()
13
+ @click.pass_context
14
+ def secret(ctx):
15
+ """Secret commands."""
16
+
17
+
18
+ @secret.command(name="ls")
19
+ @click.option("--match", default=None, help="Retrieve any secrets matching the pattern. For example, --match _test")
20
+ @click.pass_context
21
+ @coro
22
+ async def secret_ls(ctx: click.Context, match: Optional[str]):
23
+ """List secrets"""
24
+
25
+ client: TinyB = ctx.ensure_object(dict)["client"]
26
+ secrets = await client.secrets()
27
+ columns = ["name", "created_at", "updated_at"]
28
+ table_human_readable = []
29
+ table_machine_readable = []
30
+ pattern = re.compile(match) if match else None
31
+
32
+ for secret in secrets:
33
+ name = secret["name"]
34
+
35
+ if pattern and not pattern.search(name):
36
+ continue
37
+
38
+ created_at = secret["created_at"]
39
+ updated_at = secret["updated_at"]
40
+
41
+ table_human_readable.append((name, created_at, updated_at))
42
+ table_machine_readable.append({"name": name, "created at": created_at, "updated at": updated_at})
43
+
44
+ click.echo(FeedbackManager.info(message="** Secrets:"))
45
+ echo_safe_humanfriendly_tables_format_smart_table(table_human_readable, column_names=columns)
46
+ click.echo("\n")
47
+
48
+
49
+ @secret.command(name="set")
50
+ @click.argument("name")
51
+ @click.argument("value")
52
+ @click.pass_context
53
+ @coro
54
+ async def secret_set(ctx: click.Context, name: str, value: str):
55
+ """Create or update secrets"""
56
+ try:
57
+ click.echo(FeedbackManager.highlight(message=f"\n» Setting secret '{name}'..."))
58
+ client: TinyB = ctx.ensure_object(dict)["client"]
59
+ existing_secret = None
60
+ try:
61
+ existing_secret = await client.get_secret(name)
62
+ except Exception:
63
+ pass
64
+ if existing_secret:
65
+ await client.update_secret(name, value)
66
+ else:
67
+ await client.create_secret(name, value)
68
+ click.echo(FeedbackManager.success(message=f"\n✓ Secret '{name}' set"))
69
+ except Exception as e:
70
+ click.echo(FeedbackManager.error(message=f"✗ Error: {e}"))
71
+
72
+
73
+ @secret.command(name="rm")
74
+ @click.argument("name")
75
+ @click.pass_context
76
+ @coro
77
+ async def secret_rm(ctx: click.Context, name: str):
78
+ """Delete a secret"""
79
+ try:
80
+ click.echo(FeedbackManager.highlight(message=f"\n» Deleting secret '{name}'..."))
81
+ client: TinyB = ctx.ensure_object(dict)["client"]
82
+ await client.delete_secret(name)
83
+ click.echo(FeedbackManager.success(message=f"\n✓ Secret '{name}' deleted"))
84
+ except Exception as e:
85
+ click.echo(FeedbackManager.error(message=f"✗ Error: {e}"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev88
3
+ Version: 0.0.1.dev90
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -1,8 +1,8 @@
1
1
  tinybird/__cli__.py,sha256=esPl5QDTzuQgHe5FuxWLm-fURFigGGwjnYLh9GuWUw4,232
2
- tinybird/client.py,sha256=Ng4HQHum6ezf7nRZ61PbEOhYvEEPadmXKDYu2SGaL0c,53393
3
- tinybird/config.py,sha256=GQSc8v7mT79pmMANvp758i8mGVsTPd1VjJzjJmFi0LM,5885
2
+ tinybird/client.py,sha256=B6FaylxfcalxJTjiMgaS1Iyn9aBRsDaphwhC5VKeK6M,54179
3
+ tinybird/config.py,sha256=5UP_UZ2Qtlm5aOH5W7SbtN8r7X-8u3-r853joKqU5zs,6072
4
4
  tinybird/connectors.py,sha256=7Gjms7b5MAaBFGi3xytsJurCylprONpFcYrzp4Fw2Rc,15241
5
- tinybird/context.py,sha256=VaMhyHruH-uyMypPDfxtuo4scS18b7rxCCdeUVm6ysg,1301
5
+ tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
6
6
  tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
7
7
  tinybird/feedback_manager.py,sha256=YSjtFDJvc8y66j2J0iIkb3SVzDdYAJbzFL-JPQ26pak,68761
8
8
  tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
@@ -14,9 +14,9 @@ tinybird/sql_toolset.py,sha256=32SNvxRFKQYWTvYPMJ_u3ukcd1hKZyEqx8T2cv2412w,14697
14
14
  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
- tinybird/ch_utils/engine.py,sha256=AUAww-KjGOZg9h0IBlKA3FeacJYB4rOtqcTGJhFM-g8,40392
18
- tinybird/tb/__cli__.py,sha256=gO4_tED-nqmsmf_rs3JTBHu2MQsY0Dn0JvbUsi_2ZCE,251
19
- tinybird/tb/cli.py,sha256=qon0Lim-v5hHWWRW7TXaOoGo3p2kc5Xwgg3feI4mbMQ,998
17
+ tinybird/ch_utils/engine.py,sha256=BZuPM7MFS7vaEKK5tOMR2bwSAgJudPrJt27uVEwZmTY,40512
18
+ tinybird/tb/__cli__.py,sha256=Xjw-O5fZcxgHniZqT8Lfpai9LjBf9MYDmOuWtnCwi2c,251
19
+ tinybird/tb/cli.py,sha256=LOOJoNelfyqerVWrMasp2f-8roZzKdSoSa_sMViwHMg,1032
20
20
  tinybird/tb/modules/auth.py,sha256=L1IatO2arRSzys3t8px8xVt8uPWUL5EVD0sFzAV_uVU,9022
21
21
  tinybird/tb/modules/build.py,sha256=-lRGBxKtuipmyl3pmiGcfp67fH1Ed-COfHAZKdgLIWo,10483
22
22
  tinybird/tb/modules/cicd.py,sha256=T0lb9u_bDdTUVe8TwNNb1qQ5KnSPHMVjqPfKF4BBNBw,5347
@@ -26,7 +26,7 @@ tinybird/tb/modules/config.py,sha256=BVZg-4f_R3vJTwCChXY2AXaH67SRk62xoP_IymquosI
26
26
  tinybird/tb/modules/copy.py,sha256=MAVqKip8_QhOYq99U_XuqSO6hCLJEh5sFtbhcXtI3SI,5802
27
27
  tinybird/tb/modules/create.py,sha256=KjotVfIQLfcPyQBykTHnPLn4ikrm6qqeMcbRE1d-6Jo,13280
28
28
  tinybird/tb/modules/datasource.py,sha256=dNCK9iCR2xPLfwqqwg2ixyE6NuoVEiJU2mBZBmOYrVY,16906
29
- tinybird/tb/modules/deployment.py,sha256=XAVt6a_vtH8sJ99Z9Ht1q5_ni7AFPRSeidfgfuJtqLw,17565
29
+ tinybird/tb/modules/deployment.py,sha256=oSRnQnz2Wkvp1y0yt_tVa9g0aCYyFxNAsUyxoZTIcpY,17615
30
30
  tinybird/tb/modules/endpoint.py,sha256=EhVoGAXsFz-83Fiwj1gI-I73iRRvL49d0W81un7hvPE,12080
31
31
  tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
32
32
  tinybird/tb/modules/feedback_manager.py,sha256=7nNiOx7OMebiheLED1r0d75SbuXCNxyBmF4e20rCBNc,69511
@@ -44,6 +44,7 @@ tinybird/tb/modules/pipe.py,sha256=gcLz0qHgwKDLsWFY3yFLO9a0ETAV1dFbI8YeLHi9460,2
44
44
  tinybird/tb/modules/playground.py,sha256=CQaz2JqFDdReK2fJY1yZsSwiSY24_jeTb9PKw1WUigA,4848
45
45
  tinybird/tb/modules/project.py,sha256=ei0TIAuRksdV2g2FJqByuV4DPyivQGrZ42z_eQDNBgI,2963
46
46
  tinybird/tb/modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
47
+ tinybird/tb/modules/secret.py,sha256=xxzfKxfFN7GORib1WslCaFDHt_dgnjmfOewyptPU_VM,2820
47
48
  tinybird/tb/modules/shell.py,sha256=a98W4L4gfrmxEyybtu6S4ENXrBYtgNASB5e_evuXQvI,13936
48
49
  tinybird/tb/modules/table.py,sha256=4XrtjM-N0zfNtxVkbvLDQQazno1EPXnxTyo7llivfXk,11035
49
50
  tinybird/tb/modules/tag.py,sha256=anPmMUBc-TbFovlpFi8GPkKA18y7Y0GczMsMms5TZsU,3502
@@ -77,8 +78,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
77
78
  tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
78
79
  tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
79
80
  tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
80
- tinybird-0.0.1.dev88.dist-info/METADATA,sha256=D04ACuigyiZY-PtN_M1CKoBYBOUC33qeYNcb6pykA-E,2585
81
- tinybird-0.0.1.dev88.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
82
- tinybird-0.0.1.dev88.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
83
- tinybird-0.0.1.dev88.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
84
- tinybird-0.0.1.dev88.dist-info/RECORD,,
81
+ tinybird-0.0.1.dev90.dist-info/METADATA,sha256=1J8tIFd9v-xKv7yNIMmNAR9ZEx63FSbKgxwM4jiHL-s,2585
82
+ tinybird-0.0.1.dev90.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
83
+ tinybird-0.0.1.dev90.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
84
+ tinybird-0.0.1.dev90.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
85
+ tinybird-0.0.1.dev90.dist-info/RECORD,,