@an5/adapters 0.1.0 → 0.1.2
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.
- package/README.md +5 -5
- package/package.json +1 -1
- package/python/base/metadata.py +4 -3
- package/python/table_client.py +9 -11
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ Adapters are runtime packages only. They do not import generated `an5Client` art
|
|
|
19
19
|
### TypeScript
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install an5
|
|
22
|
+
npm install @an5/adapters
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
### Python
|
|
@@ -39,7 +39,7 @@ dotnet add package An5Adapters
|
|
|
39
39
|
### TypeScript
|
|
40
40
|
|
|
41
41
|
```typescript
|
|
42
|
-
import { createAn5Adapter, setAdapterMetadata } from 'an5
|
|
42
|
+
import { createAn5Adapter, setAdapterMetadata } from '@an5/adapters';
|
|
43
43
|
|
|
44
44
|
setAdapterMetadata({
|
|
45
45
|
modelToTable: { User: 'dbo.users' },
|
|
@@ -120,7 +120,7 @@ db.Transaction(tx => {
|
|
|
120
120
|
### Google Sheets
|
|
121
121
|
|
|
122
122
|
```typescript
|
|
123
|
-
import { createAn5Adapter } from 'an5
|
|
123
|
+
import { createAn5Adapter } from '@an5/adapters';
|
|
124
124
|
|
|
125
125
|
const db = createAn5Adapter({
|
|
126
126
|
spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms',
|
|
@@ -160,7 +160,7 @@ await db.table('users').deleteAll();
|
|
|
160
160
|
### Integrated factory (auto-detect adapter)
|
|
161
161
|
|
|
162
162
|
```typescript
|
|
163
|
-
import { createAn5Adapter, createAdapter, An5Adapter } from 'an5
|
|
163
|
+
import { createAn5Adapter, createAdapter, An5Adapter } from '@an5/adapters';
|
|
164
164
|
|
|
165
165
|
// Auto-detects from connection string
|
|
166
166
|
const sqlDb = createAn5Adapter({ connectionString: 'sqlserver://localhost:1433;database=mydb;user=sa;password=pass' });
|
|
@@ -197,7 +197,7 @@ const sheetsDb3 = new An5Adapter({
|
|
|
197
197
|
Use the package root for normal applications:
|
|
198
198
|
|
|
199
199
|
```typescript
|
|
200
|
-
import { createAn5Adapter } from 'an5
|
|
200
|
+
import { createAn5Adapter } from '@an5/adapters';
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
Provider folders are still available to source-level consumers through `typescript/*`, but the public factory in `typescript/an5Adapter.ts` is the preferred entry point. The old `unified.ts` entry point has been removed because the factory now lives directly in `An5Adapter`.
|
package/package.json
CHANGED
package/python/base/metadata.py
CHANGED
|
@@ -4,6 +4,7 @@ model_to_table: Dict[str, str] = {}
|
|
|
4
4
|
model_fields: Dict[str, Any] = {}
|
|
5
5
|
|
|
6
6
|
def set_adapter_metadata(metadata: Dict[str, Any]) -> None:
|
|
7
|
-
|
|
8
|
-
model_to_table
|
|
9
|
-
model_fields
|
|
7
|
+
model_to_table.clear()
|
|
8
|
+
model_to_table.update(metadata.get("model_to_table") or metadata.get("modelToTable") or {})
|
|
9
|
+
model_fields.clear()
|
|
10
|
+
model_fields.update(metadata.get("model_fields") or metadata.get("modelFields") or {})
|
package/python/table_client.py
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import uuid
|
|
3
3
|
from typing import Dict, List, Optional
|
|
4
|
-
|
|
4
|
+
try:
|
|
5
|
+
from .base import DIALECT_MSSQL, DIALECT_POSTGRES, model_fields, _build_order_by, _parse_where, _quote, _quote_table, _resolve_table
|
|
6
|
+
except ImportError:
|
|
7
|
+
from base import DIALECT_MSSQL, DIALECT_POSTGRES, model_fields, _build_order_by, _parse_where, _quote, _quote_table, _resolve_table
|
|
5
8
|
|
|
6
9
|
# ─── Table Client ───────────────────────────────────────────────────────────────────
|
|
7
10
|
|
|
@@ -28,8 +31,8 @@ class AdapterTableClient:
|
|
|
28
31
|
return ""
|
|
29
32
|
if self._dialect == DIALECT_POSTGRES:
|
|
30
33
|
return f" LIMIT {take} OFFSET {skip}"
|
|
31
|
-
|
|
32
|
-
return f"{
|
|
34
|
+
order_prefix = "" if order_sql else " ORDER BY (SELECT NULL)"
|
|
35
|
+
return f"{order_prefix} OFFSET {skip} ROWS FETCH NEXT {take} ROWS ONLY"
|
|
33
36
|
|
|
34
37
|
def find_many(self, where=None, order_by=None, skip: int = 0, take: Optional[int] = None, select=None) -> List[Dict]:
|
|
35
38
|
params: Dict = {}
|
|
@@ -39,12 +42,9 @@ class AdapterTableClient:
|
|
|
39
42
|
query = f"SELECT * FROM {self._table_sql}{self._nolock}"
|
|
40
43
|
if where_sql:
|
|
41
44
|
query += f" WHERE {where_sql}"
|
|
42
|
-
if
|
|
43
|
-
query +=
|
|
44
|
-
|
|
45
|
-
if order_sql:
|
|
46
|
-
query += f" {order_sql}"
|
|
47
|
-
query += self._pagination(take, skip, order_sql)
|
|
45
|
+
if order_sql:
|
|
46
|
+
query += f" {order_sql}"
|
|
47
|
+
query += self._pagination(take, skip, order_sql)
|
|
48
48
|
return self._adapter.exec(query, list(params.values()))
|
|
49
49
|
|
|
50
50
|
def find_first(self, where=None, order_by=None, select=None) -> Optional[Dict]:
|
|
@@ -205,5 +205,3 @@ class AdapterTableClient:
|
|
|
205
205
|
|
|
206
206
|
scored.sort(key=lambda x: x[1])
|
|
207
207
|
return [{**row, "distance": dist} for row, dist in scored[:take]]
|
|
208
|
-
|
|
209
|
-
|