From 94168b2b7bad5e487e1d29586eb83094968eab8d Mon Sep 17 00:00:00 2001 From: h3yAlias Date: Sat, 26 Jul 2025 17:57:03 +0300 Subject: [PATCH 1/5] feat(mvp): added support for token settings in py sdk --- src/rushdb/client.py | 10 ++++++++++ src/rushdb/utils/token_prefix.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/rushdb/utils/token_prefix.py diff --git a/src/rushdb/client.py b/src/rushdb/client.py index 9bc07a0..1efd2e6 100644 --- a/src/rushdb/client.py +++ b/src/rushdb/client.py @@ -11,6 +11,7 @@ import urllib.request from typing import Any, Dict, Optional +from .utils.token_prefix import extract_mixed_properties_from_token from .api.labels import LabelsAPI from .api.properties import PropertiesAPI from .api.records import RecordsAPI @@ -102,6 +103,15 @@ def __init__(self, api_key: str, base_url: Optional[str] = None): ... base_url="https://my-rushdb.company.com/api/v1" ... ) """ + settings, raw_key = extract_mixed_properties_from_token(api_key) + + self.server_settings = { + 'customDB': settings['customDB'], + 'managedDB': settings['managedDB'], + 'selfHosted': settings['selfHosted'], + 'canceled': settings['canceled'], + 'plan_type': settings['planType'], + } if settings else None self.base_url = (base_url or self.DEFAULT_BASE_URL).rstrip("/") self.api_key = api_key self.records = RecordsAPI(self) diff --git a/src/rushdb/utils/token_prefix.py b/src/rushdb/utils/token_prefix.py new file mode 100644 index 0000000..d91c32c --- /dev/null +++ b/src/rushdb/utils/token_prefix.py @@ -0,0 +1,30 @@ +import re +from typing import Dict, Optional, Tuple + +PlanPrefix = { + 'initial': 'in', + 'extended': 'ex', + 'fullFeatured': 'ff', +} + +def extract_mixed_properties_from_token( + prefixed_token: str +) -> Tuple[Optional[Dict[str, bool]], str]: + matched = re.match(r'^([a-z]{2})_([01]{4}\d*)_(.+)$', prefixed_token) + if not matched: + return None, prefixed_token + + prefix, bits, raw = matched.groups() + plan = next((p for p, plan in PlanPrefix.items() if plan == prefix), None) + if plan is None: + return None, prefixed_token + + b_custom, b_managed, b_self, b_canceled = bits[:4] + settings = { + 'planType': plan, + 'customDB': b_custom == '1', + 'managedDB': b_managed == '1', + 'selfHosted': b_self == '1', + 'canceled': b_canceled== '1', + } + return settings, raw \ No newline at end of file From bab3a8f1813dc2ba62ef42495a3c5c1a12c1c512 Mon Sep 17 00:00:00 2001 From: h3yAlias Date: Sat, 26 Jul 2025 18:28:16 +0300 Subject: [PATCH 2/5] chore(mvp): linters && types --- src/rushdb/client.py | 20 ++++++++++++-------- src/rushdb/utils/token_prefix.py | 25 +++++++++++++------------ 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/rushdb/client.py b/src/rushdb/client.py index 1efd2e6..436a71b 100644 --- a/src/rushdb/client.py +++ b/src/rushdb/client.py @@ -11,12 +11,12 @@ import urllib.request from typing import Any, Dict, Optional -from .utils.token_prefix import extract_mixed_properties_from_token from .api.labels import LabelsAPI from .api.properties import PropertiesAPI from .api.records import RecordsAPI from .api.transactions import TransactionsAPI from .common import RushDBError +from .utils.token_prefix import extract_mixed_properties_from_token class RushDB: @@ -105,13 +105,17 @@ def __init__(self, api_key: str, base_url: Optional[str] = None): """ settings, raw_key = extract_mixed_properties_from_token(api_key) - self.server_settings = { - 'customDB': settings['customDB'], - 'managedDB': settings['managedDB'], - 'selfHosted': settings['selfHosted'], - 'canceled': settings['canceled'], - 'plan_type': settings['planType'], - } if settings else None + self.server_settings = ( + { + "customDB": settings["customDB"], + "managedDB": settings["managedDB"], + "selfHosted": settings["selfHosted"], + "canceled": settings["canceled"], + "plan_type": settings["planType"], + } + if settings + else None + ) self.base_url = (base_url or self.DEFAULT_BASE_URL).rstrip("/") self.api_key = api_key self.records = RecordsAPI(self) diff --git a/src/rushdb/utils/token_prefix.py b/src/rushdb/utils/token_prefix.py index d91c32c..fcb47f3 100644 --- a/src/rushdb/utils/token_prefix.py +++ b/src/rushdb/utils/token_prefix.py @@ -2,15 +2,16 @@ from typing import Dict, Optional, Tuple PlanPrefix = { - 'initial': 'in', - 'extended': 'ex', - 'fullFeatured': 'ff', + "initial": "in", + "extended": "ex", + "fullFeatured": "ff", } + def extract_mixed_properties_from_token( - prefixed_token: str + prefixed_token: str, ) -> Tuple[Optional[Dict[str, bool]], str]: - matched = re.match(r'^([a-z]{2})_([01]{4}\d*)_(.+)$', prefixed_token) + matched = re.match(r"^([a-z]{2})_([01]{4}\d*)_(.+)$", prefixed_token) if not matched: return None, prefixed_token @@ -19,12 +20,12 @@ def extract_mixed_properties_from_token( if plan is None: return None, prefixed_token - b_custom, b_managed, b_self, b_canceled = bits[:4] + b_custom, b_managed, b_self, b_canceled = tuple(bits[:4]) settings = { - 'planType': plan, - 'customDB': b_custom == '1', - 'managedDB': b_managed == '1', - 'selfHosted': b_self == '1', - 'canceled': b_canceled== '1', + "planType": plan, + "customDB": b_custom == "1", + "managedDB": b_managed == "1", + "selfHosted": b_self == "1", + "canceled": b_canceled == "1", } - return settings, raw \ No newline at end of file + return settings, raw From 2df235f12a810ec7717cd76a5c3e35db8ffd8c23 Mon Sep 17 00:00:00 2001 From: h3yAlias Date: Sat, 26 Jul 2025 19:12:12 +0300 Subject: [PATCH 3/5] fix(mvp): removed canceled prop --- src/rushdb/client.py | 1 - src/rushdb/utils/token_prefix.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rushdb/client.py b/src/rushdb/client.py index 436a71b..415f575 100644 --- a/src/rushdb/client.py +++ b/src/rushdb/client.py @@ -110,7 +110,6 @@ def __init__(self, api_key: str, base_url: Optional[str] = None): "customDB": settings["customDB"], "managedDB": settings["managedDB"], "selfHosted": settings["selfHosted"], - "canceled": settings["canceled"], "plan_type": settings["planType"], } if settings diff --git a/src/rushdb/utils/token_prefix.py b/src/rushdb/utils/token_prefix.py index fcb47f3..41201b6 100644 --- a/src/rushdb/utils/token_prefix.py +++ b/src/rushdb/utils/token_prefix.py @@ -20,12 +20,11 @@ def extract_mixed_properties_from_token( if plan is None: return None, prefixed_token - b_custom, b_managed, b_self, b_canceled = tuple(bits[:4]) + b_custom, b_managed, b_self = tuple(bits[:4]) settings = { "planType": plan, "customDB": b_custom == "1", "managedDB": b_managed == "1", "selfHosted": b_self == "1", - "canceled": b_canceled == "1", } return settings, raw From ae09c7d6e5f025f74c67d760109c8dcccc89e145 Mon Sep 17 00:00:00 2001 From: h3yAlias Date: Sat, 26 Jul 2025 19:12:42 +0300 Subject: [PATCH 4/5] chore(mvp): updated version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6c1da0d..e67ae17 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "rushdb" -version = "1.9.0" +version = "1.10.0" description = "RushDB Python SDK" authors = [ {name = "RushDB Team", email = "hi@rushdb.com"} From 2cdc1f52e301bc0b1abebafe2d6bf883a49c98e6 Mon Sep 17 00:00:00 2001 From: h3yAlias Date: Sun, 27 Jul 2025 15:06:50 +0300 Subject: [PATCH 5/5] chore(mvp): removed extra bit --- src/rushdb/utils/token_prefix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rushdb/utils/token_prefix.py b/src/rushdb/utils/token_prefix.py index 41201b6..9a870c5 100644 --- a/src/rushdb/utils/token_prefix.py +++ b/src/rushdb/utils/token_prefix.py @@ -20,7 +20,7 @@ def extract_mixed_properties_from_token( if plan is None: return None, prefixed_token - b_custom, b_managed, b_self = tuple(bits[:4]) + b_custom, b_managed, b_self = tuple(bits[:3]) settings = { "planType": plan, "customDB": b_custom == "1",