Skip to content

Feature/post release cleanups #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ Searches for records matching specified criteria.
```python
def find(
self,
query: Optional[SearchQuery] = None,
search_query: Optional[SearchQuery] = None,
record_id: Optional[str] = None,
transaction: Optional[Transaction] = None
) -> List[Record]
Expand Down Expand Up @@ -830,7 +830,7 @@ Retrieves a list of properties based on optional search criteria.
```python
def find(
self,
query: Optional[SearchQuery] = None,
search_query: Optional[SearchQuery] = None,
transaction: Optional[Transaction] = None
) -> List[Property]
```
Expand Down
237 changes: 120 additions & 117 deletions poetry.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "rushdb"
version = "1.0.0"
version = "1.2.0"
description = "RushDB Python SDK"
authors = ["RushDB Team <hi@rushdb.com>"]
license = "Apache-2.0"
Expand Down
6 changes: 3 additions & 3 deletions src/rushdb/api/labels.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ class LabelsAPI(BaseAPI):

def list(
self,
query: Optional[SearchQuery] = None,
search_query: Optional[SearchQuery] = None,
transaction: Optional[Transaction] = None,
) -> List[str]:
"""List all labels."""
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"POST",
"/api/v1/labels/search",
data=typing.cast(typing.Dict[str, typing.Any], query or {}),
"/labels/search",
data=typing.cast(typing.Dict[str, typing.Any], search_query or {}),
headers=headers,
)
31 changes: 17 additions & 14 deletions src/rushdb/api/properties.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
import typing
from typing import List, Literal, Optional
from typing import List, Optional

from ..models.property import Property, PropertyValuesData
from ..models.search_query import SearchQuery
from ..models.transaction import Transaction
from .base import BaseAPI


class PropertyValuesQuery(SearchQuery, total=False):
"""Extended SearchQuery for property values endpoint with text search support."""

query: Optional[str] # For text search among values


class PropertiesAPI(BaseAPI):
"""API for managing properties in RushDB."""

def find(
self,
query: Optional[SearchQuery] = None,
search_query: Optional[SearchQuery] = None,
transaction: Optional[Transaction] = None,
) -> List[Property]:
"""List all properties."""
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"POST",
"/api/v1/properties/search",
typing.cast(typing.Dict[str, typing.Any], query or {}),
"/properties/search",
typing.cast(typing.Dict[str, typing.Any], search_query or {}),
headers,
)

Expand All @@ -32,7 +38,7 @@ def find_by_id(
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"GET", f"/api/v1/properties/{property_id}", headers=headers
"GET", f"/properties/{property_id}", headers=headers
)

def delete(
Expand All @@ -42,24 +48,21 @@ def delete(
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"DELETE", f"/api/v1/properties/{property_id}", headers=headers
"DELETE", f"/properties/{property_id}", headers=headers
)

def values(
self,
property_id: str,
sort: Optional[Literal["asc", "desc"]],
query: Optional[str],
skip: Optional[int],
limit: Optional[int],
search_query: Optional[PropertyValuesQuery] = None,
transaction: Optional[Transaction] = None,
) -> PropertyValuesData:
"""Get values data for a property."""
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"GET",
f"/api/v1/properties/{property_id}/values",
headers=headers,
params={"sort": sort, "skip": skip, "limit": limit, "query": query},
"POST",
f"/properties/{property_id}/values",
typing.cast(typing.Dict[str, typing.Any], search_query or {}),
headers,
)
42 changes: 17 additions & 25 deletions src/rushdb/api/records.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ def set(
) -> Dict[str, str]:
"""Update a record by ID."""
headers = Transaction._build_transaction_header(transaction)
return self.client._make_request(
"PUT", f"/api/v1/records/{record_id}", data, headers
)
return self.client._make_request("PUT", f"/records/{record_id}", data, headers)

def update(
self,
Expand All @@ -33,7 +31,7 @@ def update(
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"PATCH", f"/api/v1/records/{record_id}", data, headers
"PATCH", f"/records/{record_id}", data, headers
)

def create(
Expand Down Expand Up @@ -62,9 +60,7 @@ def create(
"data": data,
"options": options or {"returnResult": True, "suggestTypes": True},
}
response = self.client._make_request(
"POST", "/api/v1/records", payload, headers
)
response = self.client._make_request("POST", "/records", payload, headers)
return Record(self.client, response.get("data"))

def create_many(
Expand Down Expand Up @@ -93,7 +89,7 @@ def create_many(
"options": options or {"returnResult": True, "suggestTypes": True},
}
response = self.client._make_request(
"POST", "/api/v1/records/import/json", payload, headers
"POST", "/records/import/json", payload, headers
)
return [Record(self.client, record) for record in response.get("data")]

Expand All @@ -120,7 +116,7 @@ def attach(
if options:
payload.update(typing.cast(typing.Dict[str, typing.Any], options))
return self.client._make_request(
"POST", f"/api/v1/relationships/{source_id}", payload, headers
"POST", f"/relationships/{source_id}", payload, headers
)

def detach(
Expand All @@ -146,19 +142,19 @@ def detach(
if options:
payload.update(typing.cast(typing.Dict[str, typing.Any], options))
return self.client._make_request(
"PUT", f"/api/v1/relationships/{source_id}", payload, headers
"PUT", f"/relationships/{source_id}", payload, headers
)

def delete(
self, query: SearchQuery, transaction: Optional[Transaction] = None
self, search_query: SearchQuery, transaction: Optional[Transaction] = None
) -> Dict[str, str]:
"""Delete records matching the query."""
headers = Transaction._build_transaction_header(transaction)

return self.client._make_request(
"PUT",
"/api/v1/records/delete",
typing.cast(typing.Dict[str, typing.Any], query or {}),
"POST",
"/records/delete",
typing.cast(typing.Dict[str, typing.Any], search_query or {}),
headers,
)

Expand All @@ -172,18 +168,18 @@ def delete_by_id(

if isinstance(id_or_ids, list):
return self.client._make_request(
"PUT",
"/api/v1/records/delete",
"POST",
"/records/delete",
{"limit": 1000, "where": {"$id": {"$in": id_or_ids}}},
headers,
)
return self.client._make_request(
"DELETE", f"/api/v1/records/{id_or_ids}", None, headers
"DELETE", f"/records/{id_or_ids}", None, headers
)

def find(
self,
query: Optional[SearchQuery] = None,
search_query: Optional[SearchQuery] = None,
record_id: Optional[str] = None,
transaction: Optional[Transaction] = None,
) -> List[Record]:
Expand All @@ -192,15 +188,11 @@ def find(
try:
headers = Transaction._build_transaction_header(transaction)

path = (
f"/api/v1/records/{record_id}/search"
if record_id
else "/api/v1/records/search"
)
path = f"/records/{record_id}/search" if record_id else "/records/search"
response = self.client._make_request(
"POST",
path,
data=typing.cast(typing.Dict[str, typing.Any], query or {}),
data=typing.cast(typing.Dict[str, typing.Any], search_query or {}),
headers=headers,
)
return [Record(self.client, record) for record in response.get("data")]
Expand All @@ -224,7 +216,7 @@ def import_csv(
}

return self.client._make_request(
"POST", "/api/v1/records/import/csv", payload, headers
"POST", "/records/import/csv", payload, headers
)

@staticmethod
Expand Down
7 changes: 5 additions & 2 deletions src/rushdb/api/relationships.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class RelationsAPI(BaseAPI):

async def find(
self,
query: Optional[SearchQuery] = None,
search_query: Optional[SearchQuery] = None,
pagination: Optional[PaginationParams] = None,
transaction: Optional[Union[Transaction, str]] = None,
) -> List[Relationship]:
Expand All @@ -33,6 +33,9 @@ async def find(

Returns:
List of matching relations
:param transaction:
:param pagination:
:param search_query:
"""
# Build query string for pagination
query_params = {}
Expand All @@ -53,7 +56,7 @@ async def find(
response = self.client._make_request(
method="POST",
path=path,
data=typing.cast(typing.Dict[str, typing.Any], query or {}),
data=typing.cast(typing.Dict[str, typing.Any], search_query or {}),
headers=headers,
)

Expand Down
10 changes: 3 additions & 7 deletions src/rushdb/api/transactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,13 @@ def begin(self, ttl: Optional[int] = None) -> Transaction:
Returns:
Transaction object
"""
response = self.client._make_request("POST", "/api/v1/tx", {"ttl": ttl or 5000})
response = self.client._make_request("POST", "/tx", {"ttl": ttl or 5000})
return Transaction(self.client, response.get("data")["id"])

def _commit(self, transaction_id: str) -> None:
"""Internal method to commit a transaction."""
return self.client._make_request(
"POST", f"/api/v1/tx/{transaction_id}/commit", {}
)
return self.client._make_request("POST", f"/tx/{transaction_id}/commit", {})

def _rollback(self, transaction_id: str) -> None:
"""Internal method to rollback a transaction."""
return self.client._make_request(
"POST", f"/api/v1/tx/{transaction_id}/rollback", {}
)
return self.client._make_request("POST", f"/tx/{transaction_id}/rollback", {})
4 changes: 2 additions & 2 deletions src/rushdb/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
class RushDB:
"""Main client for interacting with RushDB."""

DEFAULT_BASE_URL = "https://api.rushdb.com"
DEFAULT_BASE_URL = "https://api.rushdb.com/api/v1"

def __init__(self, api_key: str, base_url: Optional[str] = None):
"""Initialize the RushDB client.

Args:
api_key: The API key for authentication
base_url: Optional base URL for the RushDB server (default: https://api.rushdb.com)
base_url: Optional base URL for the RushDB server (default: https://api.rushdb.com/api/v1)
"""
self.base_url = (base_url or self.DEFAULT_BASE_URL).rstrip("/")
self.api_key = api_key
Expand Down