singlestoredb 1.15.5__cp38-abi3-macosx_10_9_universal2.whl → 1.15.7__cp38-abi3-macosx_10_9_universal2.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 singlestoredb might be problematic. Click here for more details.
- _singlestoredb_accel.abi3.so +0 -0
- singlestoredb/__init__.py +1 -1
- singlestoredb/ai/__init__.py +3 -0
- singlestoredb/ai/chat.py +126 -7
- singlestoredb/ai/embeddings.py +100 -2
- singlestoredb/functions/ext/asgi.py +15 -19
- singlestoredb/management/inference_api.py +4 -0
- singlestoredb/tests/test_management.py +32 -24
- {singlestoredb-1.15.5.dist-info → singlestoredb-1.15.7.dist-info}/METADATA +1 -1
- {singlestoredb-1.15.5.dist-info → singlestoredb-1.15.7.dist-info}/RECORD +14 -14
- {singlestoredb-1.15.5.dist-info → singlestoredb-1.15.7.dist-info}/LICENSE +0 -0
- {singlestoredb-1.15.5.dist-info → singlestoredb-1.15.7.dist-info}/WHEEL +0 -0
- {singlestoredb-1.15.5.dist-info → singlestoredb-1.15.7.dist-info}/entry_points.txt +0 -0
- {singlestoredb-1.15.5.dist-info → singlestoredb-1.15.7.dist-info}/top_level.txt +0 -0
_singlestoredb_accel.abi3.so
CHANGED
|
Binary file
|
singlestoredb/__init__.py
CHANGED
singlestoredb/ai/__init__.py
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
from .chat import SingleStoreChat # noqa: F401
|
|
2
|
+
from .chat import SingleStoreChatFactory # noqa: F401
|
|
1
3
|
from .chat import SingleStoreChatOpenAI # noqa: F401
|
|
2
4
|
from .embeddings import SingleStoreEmbeddings # noqa: F401
|
|
5
|
+
from .embeddings import SingleStoreEmbeddingsFactory # noqa: F401
|
singlestoredb/ai/chat.py
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from typing import Any
|
|
3
|
+
from typing import Callable
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from typing import Union
|
|
3
6
|
|
|
4
|
-
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from singlestoredb import manage_workspaces
|
|
5
10
|
|
|
6
11
|
try:
|
|
7
12
|
from langchain_openai import ChatOpenAI
|
|
@@ -11,30 +16,144 @@ except ImportError:
|
|
|
11
16
|
'Please install it with `pip install langchain_openai`.',
|
|
12
17
|
)
|
|
13
18
|
|
|
19
|
+
try:
|
|
20
|
+
from langchain_aws import ChatBedrockConverse
|
|
21
|
+
except ImportError:
|
|
22
|
+
raise ImportError(
|
|
23
|
+
'Could not import langchain-aws python package. '
|
|
24
|
+
'Please install it with `pip install langchain-aws`.',
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
import boto3
|
|
28
|
+
from botocore import UNSIGNED
|
|
29
|
+
from botocore.config import Config
|
|
30
|
+
|
|
14
31
|
|
|
15
32
|
class SingleStoreChatOpenAI(ChatOpenAI):
|
|
16
|
-
def __init__(self, model_name: str, **kwargs: Any):
|
|
33
|
+
def __init__(self, model_name: str, api_key: Optional[str] = None, **kwargs: Any):
|
|
17
34
|
inference_api_manger = (
|
|
18
|
-
|
|
35
|
+
manage_workspaces().organizations.current.inference_apis
|
|
19
36
|
)
|
|
20
37
|
info = inference_api_manger.get(model_name=model_name)
|
|
38
|
+
token = (
|
|
39
|
+
api_key
|
|
40
|
+
if api_key is not None
|
|
41
|
+
else os.environ.get('SINGLESTOREDB_USER_TOKEN')
|
|
42
|
+
)
|
|
21
43
|
super().__init__(
|
|
22
44
|
base_url=info.connection_url,
|
|
23
|
-
api_key=
|
|
45
|
+
api_key=token,
|
|
24
46
|
model=model_name,
|
|
25
47
|
**kwargs,
|
|
26
48
|
)
|
|
27
49
|
|
|
28
50
|
|
|
29
51
|
class SingleStoreChat(ChatOpenAI):
|
|
30
|
-
def __init__(self, model_name: str, **kwargs: Any):
|
|
52
|
+
def __init__(self, model_name: str, api_key: Optional[str] = None, **kwargs: Any):
|
|
31
53
|
inference_api_manger = (
|
|
32
|
-
|
|
54
|
+
manage_workspaces().organizations.current.inference_apis
|
|
33
55
|
)
|
|
34
56
|
info = inference_api_manger.get(model_name=model_name)
|
|
57
|
+
token = (
|
|
58
|
+
api_key
|
|
59
|
+
if api_key is not None
|
|
60
|
+
else os.environ.get('SINGLESTOREDB_USER_TOKEN')
|
|
61
|
+
)
|
|
35
62
|
super().__init__(
|
|
36
63
|
base_url=info.connection_url,
|
|
37
|
-
api_key=
|
|
64
|
+
api_key=token,
|
|
38
65
|
model=model_name,
|
|
39
66
|
**kwargs,
|
|
40
67
|
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def SingleStoreChatFactory(
|
|
71
|
+
model_name: str,
|
|
72
|
+
api_key: Optional[str] = None,
|
|
73
|
+
streaming: bool = True,
|
|
74
|
+
http_client: Optional[httpx.Client] = None,
|
|
75
|
+
obo_token_getter: Optional[Callable[[], Optional[str]]] = None,
|
|
76
|
+
**kwargs: Any,
|
|
77
|
+
) -> Union[ChatOpenAI, ChatBedrockConverse]:
|
|
78
|
+
"""Return a chat model instance (ChatOpenAI or ChatBedrockConverse).
|
|
79
|
+
"""
|
|
80
|
+
inference_api_manager = (
|
|
81
|
+
manage_workspaces().organizations.current.inference_apis
|
|
82
|
+
)
|
|
83
|
+
info = inference_api_manager.get(model_name=model_name)
|
|
84
|
+
token_env = os.environ.get('SINGLESTOREDB_USER_TOKEN')
|
|
85
|
+
token = api_key if api_key is not None else token_env
|
|
86
|
+
|
|
87
|
+
if info.hosting_platform == 'Amazon':
|
|
88
|
+
# Instantiate Bedrock client
|
|
89
|
+
cfg_kwargs = {
|
|
90
|
+
'signature_version': UNSIGNED,
|
|
91
|
+
'retries': {'max_attempts': 1, 'mode': 'standard'},
|
|
92
|
+
}
|
|
93
|
+
if http_client is not None and http_client.timeout is not None:
|
|
94
|
+
cfg_kwargs['read_timeout'] = http_client.timeout
|
|
95
|
+
cfg_kwargs['connect_timeout'] = http_client.timeout
|
|
96
|
+
|
|
97
|
+
cfg = Config(**cfg_kwargs)
|
|
98
|
+
client = boto3.client(
|
|
99
|
+
'bedrock-runtime',
|
|
100
|
+
endpoint_url=info.connection_url,
|
|
101
|
+
region_name='us-east-1',
|
|
102
|
+
aws_access_key_id='placeholder',
|
|
103
|
+
aws_secret_access_key='placeholder',
|
|
104
|
+
config=cfg,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def _inject_headers(request: Any, **_ignored: Any) -> None:
|
|
108
|
+
"""Inject dynamic auth/OBO headers prior to Bedrock sending."""
|
|
109
|
+
if obo_token_getter is not None:
|
|
110
|
+
obo_val = obo_token_getter()
|
|
111
|
+
if obo_val:
|
|
112
|
+
request.headers['X-S2-OBO'] = obo_val
|
|
113
|
+
if token:
|
|
114
|
+
request.headers['Authorization'] = f'Bearer {token}'
|
|
115
|
+
request.headers.pop('X-Amz-Date', None)
|
|
116
|
+
request.headers.pop('X-Amz-Security-Token', None)
|
|
117
|
+
|
|
118
|
+
emitter = client._endpoint._event_emitter
|
|
119
|
+
emitter.register_first(
|
|
120
|
+
'before-send.bedrock-runtime.Converse',
|
|
121
|
+
_inject_headers,
|
|
122
|
+
)
|
|
123
|
+
emitter.register_first(
|
|
124
|
+
'before-send.bedrock-runtime.ConverseStream',
|
|
125
|
+
_inject_headers,
|
|
126
|
+
)
|
|
127
|
+
emitter.register_first(
|
|
128
|
+
'before-send.bedrock-runtime.InvokeModel',
|
|
129
|
+
_inject_headers,
|
|
130
|
+
)
|
|
131
|
+
emitter.register_first(
|
|
132
|
+
'before-send.bedrock-runtime.InvokeModelWithResponseStream',
|
|
133
|
+
_inject_headers,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
return ChatBedrockConverse(
|
|
137
|
+
model_id=model_name,
|
|
138
|
+
endpoint_url=info.connection_url,
|
|
139
|
+
region_name='us-east-1',
|
|
140
|
+
aws_access_key_id='placeholder',
|
|
141
|
+
aws_secret_access_key='placeholder',
|
|
142
|
+
disable_streaming=not streaming,
|
|
143
|
+
client=client,
|
|
144
|
+
**kwargs,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# OpenAI / Azure OpenAI path
|
|
148
|
+
openai_kwargs = dict(
|
|
149
|
+
base_url=info.connection_url,
|
|
150
|
+
api_key=token,
|
|
151
|
+
model=model_name,
|
|
152
|
+
streaming=streaming,
|
|
153
|
+
)
|
|
154
|
+
if http_client is not None:
|
|
155
|
+
openai_kwargs['http_client'] = http_client
|
|
156
|
+
return ChatOpenAI(
|
|
157
|
+
**openai_kwargs,
|
|
158
|
+
**kwargs,
|
|
159
|
+
)
|
singlestoredb/ai/embeddings.py
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from typing import Any
|
|
3
|
+
from typing import Callable
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from typing import Union
|
|
3
6
|
|
|
4
|
-
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from singlestoredb import manage_workspaces
|
|
5
10
|
|
|
6
11
|
try:
|
|
7
12
|
from langchain_openai import OpenAIEmbeddings
|
|
@@ -11,12 +16,24 @@ except ImportError:
|
|
|
11
16
|
'Please install it with `pip install langchain_openai`.',
|
|
12
17
|
)
|
|
13
18
|
|
|
19
|
+
try:
|
|
20
|
+
from langchain_aws import BedrockEmbeddings
|
|
21
|
+
except ImportError:
|
|
22
|
+
raise ImportError(
|
|
23
|
+
'Could not import langchain-aws python package. '
|
|
24
|
+
'Please install it with `pip install langchain-aws`.',
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
import boto3
|
|
28
|
+
from botocore import UNSIGNED
|
|
29
|
+
from botocore.config import Config
|
|
30
|
+
|
|
14
31
|
|
|
15
32
|
class SingleStoreEmbeddings(OpenAIEmbeddings):
|
|
16
33
|
|
|
17
34
|
def __init__(self, model_name: str, **kwargs: Any):
|
|
18
35
|
inference_api_manger = (
|
|
19
|
-
|
|
36
|
+
manage_workspaces().organizations.current.inference_apis
|
|
20
37
|
)
|
|
21
38
|
info = inference_api_manger.get(model_name=model_name)
|
|
22
39
|
super().__init__(
|
|
@@ -25,3 +42,84 @@ class SingleStoreEmbeddings(OpenAIEmbeddings):
|
|
|
25
42
|
model=model_name,
|
|
26
43
|
**kwargs,
|
|
27
44
|
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def SingleStoreEmbeddingsFactory(
|
|
48
|
+
model_name: str,
|
|
49
|
+
api_key: Optional[str] = None,
|
|
50
|
+
http_client: Optional[httpx.Client] = None,
|
|
51
|
+
obo_token_getter: Optional[Callable[[], Optional[str]]] = None,
|
|
52
|
+
**kwargs: Any,
|
|
53
|
+
) -> Union[OpenAIEmbeddings, BedrockEmbeddings]:
|
|
54
|
+
"""Return an embeddings model instance (OpenAIEmbeddings or BedrockEmbeddings).
|
|
55
|
+
"""
|
|
56
|
+
inference_api_manager = (
|
|
57
|
+
manage_workspaces().organizations.current.inference_apis
|
|
58
|
+
)
|
|
59
|
+
info = inference_api_manager.get(model_name=model_name)
|
|
60
|
+
token_env = os.environ.get('SINGLESTOREDB_USER_TOKEN')
|
|
61
|
+
token = api_key if api_key is not None else token_env
|
|
62
|
+
|
|
63
|
+
if info.hosting_platform == 'Amazon':
|
|
64
|
+
# Instantiate Bedrock client
|
|
65
|
+
cfg_kwargs = {
|
|
66
|
+
'signature_version': UNSIGNED,
|
|
67
|
+
'retries': {'max_attempts': 1, 'mode': 'standard'},
|
|
68
|
+
}
|
|
69
|
+
if http_client is not None and http_client.timeout is not None:
|
|
70
|
+
cfg_kwargs['read_timeout'] = http_client.timeout
|
|
71
|
+
cfg_kwargs['connect_timeout'] = http_client.timeout
|
|
72
|
+
|
|
73
|
+
cfg = Config(**cfg_kwargs)
|
|
74
|
+
client = boto3.client(
|
|
75
|
+
'bedrock-runtime',
|
|
76
|
+
endpoint_url=info.connection_url,
|
|
77
|
+
region_name='us-east-1',
|
|
78
|
+
aws_access_key_id='placeholder',
|
|
79
|
+
aws_secret_access_key='placeholder',
|
|
80
|
+
config=cfg,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def _inject_headers(request: Any, **_ignored: Any) -> None:
|
|
84
|
+
"""Inject dynamic auth/OBO headers prior to Bedrock sending."""
|
|
85
|
+
if obo_token_getter is not None:
|
|
86
|
+
obo_val = obo_token_getter()
|
|
87
|
+
if obo_val:
|
|
88
|
+
request.headers['X-S2-OBO'] = obo_val
|
|
89
|
+
if token:
|
|
90
|
+
request.headers['Authorization'] = f'Bearer {token}'
|
|
91
|
+
request.headers.pop('X-Amz-Date', None)
|
|
92
|
+
request.headers.pop('X-Amz-Security-Token', None)
|
|
93
|
+
|
|
94
|
+
emitter = client._endpoint._event_emitter
|
|
95
|
+
emitter.register_first(
|
|
96
|
+
'before-send.bedrock-runtime.InvokeModel',
|
|
97
|
+
_inject_headers,
|
|
98
|
+
)
|
|
99
|
+
emitter.register_first(
|
|
100
|
+
'before-send.bedrock-runtime.InvokeModelWithResponseStream',
|
|
101
|
+
_inject_headers,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return BedrockEmbeddings(
|
|
105
|
+
model_id=model_name,
|
|
106
|
+
endpoint_url=info.connection_url,
|
|
107
|
+
region_name='us-east-1',
|
|
108
|
+
aws_access_key_id='placeholder',
|
|
109
|
+
aws_secret_access_key='placeholder',
|
|
110
|
+
client=client,
|
|
111
|
+
**kwargs,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# OpenAI / Azure OpenAI path
|
|
115
|
+
openai_kwargs = dict(
|
|
116
|
+
base_url=info.connection_url,
|
|
117
|
+
api_key=token,
|
|
118
|
+
model=model_name,
|
|
119
|
+
)
|
|
120
|
+
if http_client is not None:
|
|
121
|
+
openai_kwargs['http_client'] = http_client
|
|
122
|
+
return OpenAIEmbeddings(
|
|
123
|
+
**openai_kwargs,
|
|
124
|
+
**kwargs,
|
|
125
|
+
)
|
|
@@ -42,6 +42,7 @@ import tempfile
|
|
|
42
42
|
import textwrap
|
|
43
43
|
import threading
|
|
44
44
|
import time
|
|
45
|
+
import traceback
|
|
45
46
|
import typing
|
|
46
47
|
import urllib
|
|
47
48
|
import uuid
|
|
@@ -709,21 +710,21 @@ class Application(object):
|
|
|
709
710
|
error_response_dict: Dict[str, Any] = dict(
|
|
710
711
|
type='http.response.start',
|
|
711
712
|
status=500,
|
|
712
|
-
headers=[(b'content-type', b'
|
|
713
|
+
headers=[(b'content-type', b'text/plain')],
|
|
713
714
|
)
|
|
714
715
|
|
|
715
716
|
# Timeout response start
|
|
716
717
|
timeout_response_dict: Dict[str, Any] = dict(
|
|
717
718
|
type='http.response.start',
|
|
718
719
|
status=504,
|
|
719
|
-
headers=[(b'content-type', b'
|
|
720
|
+
headers=[(b'content-type', b'text/plain')],
|
|
720
721
|
)
|
|
721
722
|
|
|
722
723
|
# Cancel response start
|
|
723
724
|
cancel_response_dict: Dict[str, Any] = dict(
|
|
724
725
|
type='http.response.start',
|
|
725
726
|
status=503,
|
|
726
|
-
headers=[(b'content-type', b'
|
|
727
|
+
headers=[(b'content-type', b'text/plain')],
|
|
727
728
|
)
|
|
728
729
|
|
|
729
730
|
# JSON response start
|
|
@@ -1247,12 +1248,10 @@ class Application(object):
|
|
|
1247
1248
|
'timeout': func_info['timeout'],
|
|
1248
1249
|
},
|
|
1249
1250
|
)
|
|
1250
|
-
body =
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
' seconds',
|
|
1255
|
-
),
|
|
1251
|
+
body = (
|
|
1252
|
+
'TimeoutError: Function call timed out after ' +
|
|
1253
|
+
str(func_info['timeout']) +
|
|
1254
|
+
' seconds'
|
|
1256
1255
|
).encode('utf-8')
|
|
1257
1256
|
await send(self.timeout_response_dict)
|
|
1258
1257
|
|
|
@@ -1265,11 +1264,7 @@ class Application(object):
|
|
|
1265
1264
|
'function_name': func_name.decode('utf-8'),
|
|
1266
1265
|
},
|
|
1267
1266
|
)
|
|
1268
|
-
body =
|
|
1269
|
-
dict(
|
|
1270
|
-
error='[CancelledError] Function call was cancelled',
|
|
1271
|
-
),
|
|
1272
|
-
).encode('utf-8')
|
|
1267
|
+
body = b'CancelledError: Function call was cancelled'
|
|
1273
1268
|
await send(self.cancel_response_dict)
|
|
1274
1269
|
|
|
1275
1270
|
except Exception as e:
|
|
@@ -1282,11 +1277,12 @@ class Application(object):
|
|
|
1282
1277
|
'exception_type': type(e).__name__,
|
|
1283
1278
|
},
|
|
1284
1279
|
)
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1280
|
+
msg = traceback.format_exc().strip().split(' File ')[-1]
|
|
1281
|
+
if msg.startswith('"/tmp/ipykernel_'):
|
|
1282
|
+
msg = 'Line ' + msg.split(', line ')[-1]
|
|
1283
|
+
else:
|
|
1284
|
+
msg = 'File ' + msg
|
|
1285
|
+
body = msg.encode('utf-8')
|
|
1290
1286
|
await send(self.error_response_dict)
|
|
1291
1287
|
|
|
1292
1288
|
finally:
|
|
@@ -23,6 +23,7 @@ class InferenceAPIInfo(object):
|
|
|
23
23
|
name: str
|
|
24
24
|
connection_url: str
|
|
25
25
|
project_id: str
|
|
26
|
+
hosting_platform: str
|
|
26
27
|
|
|
27
28
|
def __init__(
|
|
28
29
|
self,
|
|
@@ -31,12 +32,14 @@ class InferenceAPIInfo(object):
|
|
|
31
32
|
name: str,
|
|
32
33
|
connection_url: str,
|
|
33
34
|
project_id: str,
|
|
35
|
+
hosting_platform: str,
|
|
34
36
|
):
|
|
35
37
|
self.service_id = service_id
|
|
36
38
|
self.connection_url = connection_url
|
|
37
39
|
self.model_name = model_name
|
|
38
40
|
self.name = name
|
|
39
41
|
self.project_id = project_id
|
|
42
|
+
self.hosting_platform = hosting_platform
|
|
40
43
|
|
|
41
44
|
@classmethod
|
|
42
45
|
def from_dict(
|
|
@@ -62,6 +65,7 @@ class InferenceAPIInfo(object):
|
|
|
62
65
|
model_name=obj['modelName'],
|
|
63
66
|
name=obj['name'],
|
|
64
67
|
connection_url=obj['connectionURL'],
|
|
68
|
+
hosting_platform=obj['hostingPlatform'],
|
|
65
69
|
)
|
|
66
70
|
return out
|
|
67
71
|
|
|
@@ -873,12 +873,20 @@ class TestStage(unittest.TestCase):
|
|
|
873
873
|
def test_file_object(self):
|
|
874
874
|
st = self.wg.stage
|
|
875
875
|
|
|
876
|
-
|
|
877
|
-
st.mkdir('obj_test/nest_1')
|
|
876
|
+
obj_test_dir = f'obj_test_{id(self)}'
|
|
878
877
|
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
878
|
+
st.mkdir(obj_test_dir)
|
|
879
|
+
st.mkdir(f'{obj_test_dir}/nest_1')
|
|
880
|
+
|
|
881
|
+
obj_test_sql = f'obj_test_{id(self)}.sql'
|
|
882
|
+
obj_test_2_sql = f'obj_test_2_{id(self)}.sql'
|
|
883
|
+
|
|
884
|
+
f1 = st.upload_file(TEST_DIR / 'test.sql', obj_test_sql)
|
|
885
|
+
f2 = st.upload_file(
|
|
886
|
+
TEST_DIR / 'test.sql',
|
|
887
|
+
f'{obj_test_dir}/nest_1/{obj_test_sql}',
|
|
888
|
+
)
|
|
889
|
+
d2 = st.info(f'{obj_test_dir}/nest_1/')
|
|
882
890
|
|
|
883
891
|
# is_file / is_dir
|
|
884
892
|
assert not f1.is_dir()
|
|
@@ -889,17 +897,17 @@ class TestStage(unittest.TestCase):
|
|
|
889
897
|
assert not d2.is_file()
|
|
890
898
|
|
|
891
899
|
# abspath / basename / dirname / exists
|
|
892
|
-
assert f1.abspath() ==
|
|
893
|
-
assert f1.basename() ==
|
|
900
|
+
assert f1.abspath() == obj_test_sql
|
|
901
|
+
assert f1.basename() == obj_test_sql
|
|
894
902
|
assert f1.dirname() == '/'
|
|
895
903
|
assert f1.exists()
|
|
896
|
-
assert f2.abspath() == '
|
|
897
|
-
assert f2.basename() ==
|
|
898
|
-
assert f2.dirname() == '
|
|
904
|
+
assert f2.abspath() == f'{obj_test_dir}/nest_1/{obj_test_sql}'
|
|
905
|
+
assert f2.basename() == obj_test_sql
|
|
906
|
+
assert f2.dirname() == f'{obj_test_dir}/nest_1/'
|
|
899
907
|
assert f2.exists()
|
|
900
|
-
assert d2.abspath() == '
|
|
908
|
+
assert d2.abspath() == f'{obj_test_dir}/nest_1/'
|
|
901
909
|
assert d2.basename() == 'nest_1'
|
|
902
|
-
assert d2.dirname() == '
|
|
910
|
+
assert d2.dirname() == f'{obj_test_dir}/'
|
|
903
911
|
assert d2.exists()
|
|
904
912
|
|
|
905
913
|
# download
|
|
@@ -910,9 +918,9 @@ class TestStage(unittest.TestCase):
|
|
|
910
918
|
with self.assertRaises(IsADirectoryError):
|
|
911
919
|
d2.remove()
|
|
912
920
|
|
|
913
|
-
assert st.is_file(
|
|
921
|
+
assert st.is_file(obj_test_sql)
|
|
914
922
|
f1.remove()
|
|
915
|
-
assert not st.is_file(
|
|
923
|
+
assert not st.is_file(obj_test_sql)
|
|
916
924
|
|
|
917
925
|
# removedirs
|
|
918
926
|
with self.assertRaises(NotADirectoryError):
|
|
@@ -923,8 +931,8 @@ class TestStage(unittest.TestCase):
|
|
|
923
931
|
assert not st.exists(d2.path)
|
|
924
932
|
|
|
925
933
|
# rmdir
|
|
926
|
-
f1 = st.upload_file(TEST_DIR / 'test.sql',
|
|
927
|
-
d2 = st.mkdir('
|
|
934
|
+
f1 = st.upload_file(TEST_DIR / 'test.sql', obj_test_sql)
|
|
935
|
+
d2 = st.mkdir(f'{obj_test_dir}/nest_1')
|
|
928
936
|
|
|
929
937
|
assert st.exists(f1.path)
|
|
930
938
|
assert st.exists(d2.path)
|
|
@@ -937,20 +945,20 @@ class TestStage(unittest.TestCase):
|
|
|
937
945
|
|
|
938
946
|
d2.rmdir()
|
|
939
947
|
|
|
940
|
-
assert not st.exists('
|
|
941
|
-
assert not st.exists(
|
|
948
|
+
assert not st.exists(f'{obj_test_dir}/nest_1/')
|
|
949
|
+
assert not st.exists(obj_test_dir)
|
|
942
950
|
|
|
943
951
|
# mtime / ctime
|
|
944
952
|
assert f1.getmtime() > 0
|
|
945
953
|
assert f1.getctime() > 0
|
|
946
954
|
|
|
947
955
|
# rename
|
|
948
|
-
assert st.exists(
|
|
949
|
-
assert not st.exists(
|
|
950
|
-
f1.rename(
|
|
951
|
-
assert not st.exists(
|
|
952
|
-
assert st.exists(
|
|
953
|
-
assert f1.abspath() ==
|
|
956
|
+
assert st.exists(obj_test_sql)
|
|
957
|
+
assert not st.exists(obj_test_2_sql)
|
|
958
|
+
f1.rename(obj_test_2_sql)
|
|
959
|
+
assert not st.exists(obj_test_sql)
|
|
960
|
+
assert st.exists(obj_test_2_sql)
|
|
961
|
+
assert f1.abspath() == obj_test_2_sql
|
|
954
962
|
|
|
955
963
|
|
|
956
964
|
@pytest.mark.management
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
_singlestoredb_accel.abi3.so,sha256=
|
|
2
|
-
singlestoredb-1.15.
|
|
3
|
-
singlestoredb-1.15.
|
|
4
|
-
singlestoredb-1.15.
|
|
5
|
-
singlestoredb-1.15.
|
|
6
|
-
singlestoredb-1.15.
|
|
7
|
-
singlestoredb-1.15.
|
|
1
|
+
_singlestoredb_accel.abi3.so,sha256=8pD1GEJZQTnRnteVoJG9U1oJfe6vHgWC2koL52xF9G8,207264
|
|
2
|
+
singlestoredb-1.15.7.dist-info/RECORD,,
|
|
3
|
+
singlestoredb-1.15.7.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
|
|
4
|
+
singlestoredb-1.15.7.dist-info/WHEEL,sha256=_VEguvlLpUd-c8RbFMA4yMIVNMBv2LhpxYLCEQ-Bogk,113
|
|
5
|
+
singlestoredb-1.15.7.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
|
|
6
|
+
singlestoredb-1.15.7.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
|
|
7
|
+
singlestoredb-1.15.7.dist-info/METADATA,sha256=N42M0mnELo1khbLSdxNkFIQX6QBE0RNV6hgPdTwJjg4,5804
|
|
8
8
|
sqlx/magic.py,sha256=JsS9_9aBFaOt91Torm1JPN0c8qB2QmYJmNSKtbSQIY0,3509
|
|
9
9
|
sqlx/__init__.py,sha256=aBYiU8DZXCogvWu3yWafOz7bZS5WWwLZXj7oL0dXGyU,85
|
|
10
10
|
singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
|
|
11
11
|
singlestoredb/config.py,sha256=aBdMrPEaNSH-QLi1AXoQaSJsZ9f6ZXoFPN-74Trr6sQ,13935
|
|
12
12
|
singlestoredb/vectorstore.py,sha256=BZb8e7m02_XVHqOyu8tA94R6kHb3n-BC8F08JyJwDzY,8408
|
|
13
|
-
singlestoredb/__init__.py,sha256=
|
|
13
|
+
singlestoredb/__init__.py,sha256=UYEMO4CiO41DrAiO6xne5VttZqH7BvSD2Q-skkFRNeU,2272
|
|
14
14
|
singlestoredb/types.py,sha256=Qp_PWYjSYG6PRnmXAZZ7K2QehUqfoG4KSllI3O1stPE,10397
|
|
15
15
|
singlestoredb/connection.py,sha256=ELk3-UpM6RaB993aIt08MydKiiDnejHQ1s8EFiacrAI,46055
|
|
16
16
|
singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
|
|
@@ -45,7 +45,7 @@ singlestoredb/tests/test2.ipynb,sha256=yd1PE1VK-DwiRd6mYS4_0cPBtuVkvcDtycvTwD-Yn
|
|
|
45
45
|
singlestoredb/tests/test_ext_func_data.py,sha256=kyNklkX1RxSiahI0LZjpqhg3LGDs0iwv8iHuXW3AcSo,47515
|
|
46
46
|
singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
|
|
47
47
|
singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
-
singlestoredb/tests/test_management.py,sha256=
|
|
48
|
+
singlestoredb/tests/test_management.py,sha256=BK58UWs6L_9h1ePUNjnIJ1fVAEvBvC8rP7HtnfoANYQ,52205
|
|
49
49
|
singlestoredb/tests/test_udf.py,sha256=ycqSwwwCw3Mq4r0cyIylg63ReSjP4KbMX_7XqoYm-dg,29676
|
|
50
50
|
singlestoredb/tests/test_http.py,sha256=RXasTqBWRn__omj0eLFTJYIbZjd0PPdIV2d4Cqz0MC8,8580
|
|
51
51
|
singlestoredb/tests/utils.py,sha256=2A2tEdD3t8aXWUnHtAIcFlWrflsz2MlMcCbUDaAG29c,4995
|
|
@@ -69,7 +69,7 @@ singlestoredb/management/__init__.py,sha256=8q7i6-Cr9x-oZ8-NVAvTo_qtfHEndX4wx2g6
|
|
|
69
69
|
singlestoredb/management/export.py,sha256=yR-yZUE9USFrP5OR_5iLFqEc8GLiKDQypSEp08CmT5k,9083
|
|
70
70
|
singlestoredb/management/utils.py,sha256=QIhZCZSRaDbAG35xu1_n7ihmRXON8swc-gEK2FGYutI,13203
|
|
71
71
|
singlestoredb/management/cluster.py,sha256=vDefpp2IMZRawvueIqZK2pePWVNnPWb6Szrt8mO8gmg,14419
|
|
72
|
-
singlestoredb/management/inference_api.py,sha256=
|
|
72
|
+
singlestoredb/management/inference_api.py,sha256=px4JrziJQMwG73iNnYw_95np9DDrp5zo5mKz8c5EF9o,2742
|
|
73
73
|
singlestoredb/management/workspace.py,sha256=frVNqwfUgth1WWhcf5rZqz9nIcPkMtmCb5hKVx1h5SI,61953
|
|
74
74
|
singlestoredb/management/manager.py,sha256=k8JKPXyJVHI7gFwqIhxhUtQr_KdBCXw7Dw4GCdCtdKg,9352
|
|
75
75
|
singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
|
|
@@ -106,9 +106,9 @@ singlestoredb/docstring/tests/test_numpydoc.py,sha256=9qr9jHr4feTF1E09c8J6SHWSXU
|
|
|
106
106
|
singlestoredb/docstring/tests/test_google.py,sha256=2dVyFN-NjiuyUC3ZcGEm33aENAZNh9F7Eq_ErmyneIA,27955
|
|
107
107
|
singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
|
|
108
108
|
singlestoredb/http/connection.py,sha256=fCgh3PdYJNYVPMaUe_NlMb7ducxC06se1XfyqOpPpJw,39727
|
|
109
|
-
singlestoredb/ai/__init__.py,sha256
|
|
110
|
-
singlestoredb/ai/chat.py,sha256=
|
|
111
|
-
singlestoredb/ai/embeddings.py,sha256=
|
|
109
|
+
singlestoredb/ai/__init__.py,sha256=zNSUVDzDsyIfW7-obV5iRRhDjPqgPzG_EJJaT0_jtLw,284
|
|
110
|
+
singlestoredb/ai/chat.py,sha256=uI_j1sySFO4jpUA3bcUL0Gki0F3jEbLHAq0hQLxqv3w,5074
|
|
111
|
+
singlestoredb/ai/embeddings.py,sha256=yj9fQzwiocy78cBPfoOB9dok4gnWyE0IghCw7JIlTGI,4020
|
|
112
112
|
singlestoredb/mysql/protocol.py,sha256=PfdILK1oK2hlg1etmYZtrKf1obPlcLC7FyEJHEpIplc,14885
|
|
113
113
|
singlestoredb/mysql/cursors.py,sha256=aOLfHkj83aYZPOVuhJPkZ83CWByszIBRynq0fqSaWvY,27046
|
|
114
114
|
singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
|
|
@@ -156,7 +156,7 @@ singlestoredb/functions/dtypes.py,sha256=DgJaNXouJ2t-qIqDiQlUYU9IhkXXUTigWeE_MAc
|
|
|
156
156
|
singlestoredb/functions/utils.py,sha256=1L0Phgzq0XdWK3ecfOOydq4zV955yCwpDoAaCYRGldk,10769
|
|
157
157
|
singlestoredb/functions/signature.py,sha256=h2vFVNP07d5a3gi7zMiM_sztDUNK_HlJWR-Rl3nMxPA,45545
|
|
158
158
|
singlestoredb/functions/ext/timer.py,sha256=-PR__KbhwAMW4PXJ4fGri2FfrU0jRyz6e6yvmySmjaw,2706
|
|
159
|
-
singlestoredb/functions/ext/asgi.py,sha256=
|
|
159
|
+
singlestoredb/functions/ext/asgi.py,sha256=C6UJXunHY-dISp4k4CH-poEt8dyzqIjLQpuj06_ttRA,72268
|
|
160
160
|
singlestoredb/functions/ext/arrow.py,sha256=WB7n1ACslyd8nlbFzUvlbxn1BVuEjA9-BGBEqCWlSOo,9061
|
|
161
161
|
singlestoredb/functions/ext/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
|
|
162
162
|
singlestoredb/functions/ext/utils.py,sha256=oU2NVmkjcS0QHLfdB8SBiRylVq-r0VzTy8nxGvAgjow,6938
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|