crate 1.0.0__py3-none-any.whl → 1.0.0.dev1__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.
- crate/client/__init__.py +3 -3
- crate/client/blob.py +7 -9
- crate/client/connection.py +52 -58
- crate/client/converter.py +10 -15
- crate/client/cursor.py +51 -55
- crate/client/exceptions.py +3 -5
- crate/client/http.py +160 -192
- crate/client/test_connection.py +98 -0
- crate/client/test_cursor.py +341 -0
- crate/client/test_exceptions.py +14 -0
- crate/client/test_http.py +678 -0
- crate/client/test_util.py +69 -0
- crate/client/tests.py +340 -0
- crate/testing/__init__.py +1 -0
- crate/testing/layer.py +102 -140
- crate/testing/settings.py +51 -0
- crate/testing/test_datetime_old.py +90 -0
- crate/testing/test_layer.py +290 -0
- crate/testing/tests.py +34 -0
- crate/testing/util.py +5 -80
- crate-1.0.0.dev1-py3.9-nspkg.pth +1 -0
- {crate-1.0.0.dist-info → crate-1.0.0.dev1.dist-info}/LICENSE +70 -0
- {crate-1.0.0.dist-info → crate-1.0.0.dev1.dist-info}/METADATA +21 -19
- {crate-1.0.0.dist-info → crate-1.0.0.dev1.dist-info}/NOTICE +1 -1
- crate-1.0.0.dev1.dist-info/RECORD +29 -0
- {crate-1.0.0.dist-info → crate-1.0.0.dev1.dist-info}/WHEEL +1 -1
- crate-1.0.0.dev1.dist-info/top_level.txt +1 -0
- crate/__init__.py +0 -0
- crate-1.0.0.dist-info/RECORD +0 -18
- /crate-1.0.0.dist-info/top_level.txt → /crate-1.0.0.dev1.dist-info/namespace_packages.txt +0 -0
@@ -0,0 +1,290 @@
|
|
1
|
+
# -*- coding: utf-8; -*-
|
2
|
+
#
|
3
|
+
# Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
|
4
|
+
# license agreements. See the NOTICE file distributed with this work for
|
5
|
+
# additional information regarding copyright ownership. Crate licenses
|
6
|
+
# this file to you under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License. You may
|
8
|
+
# obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
14
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
15
|
+
# License for the specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
#
|
18
|
+
# However, if you have executed another commercial license agreement
|
19
|
+
# with Crate these terms will supersede the license and you may use the
|
20
|
+
# software solely pursuant to the terms of the relevant commercial agreement.
|
21
|
+
import json
|
22
|
+
import os
|
23
|
+
import tempfile
|
24
|
+
import urllib
|
25
|
+
from verlib2 import Version
|
26
|
+
from unittest import TestCase, mock
|
27
|
+
from io import BytesIO
|
28
|
+
|
29
|
+
import urllib3
|
30
|
+
|
31
|
+
import crate
|
32
|
+
from .layer import CrateLayer, prepend_http, http_url_from_host_port, wait_for_http_url
|
33
|
+
from .settings import crate_path
|
34
|
+
|
35
|
+
|
36
|
+
class LayerUtilsTest(TestCase):
|
37
|
+
|
38
|
+
def test_prepend_http(self):
|
39
|
+
host = prepend_http('localhost')
|
40
|
+
self.assertEqual('http://localhost', host)
|
41
|
+
host = prepend_http('http://localhost')
|
42
|
+
self.assertEqual('http://localhost', host)
|
43
|
+
host = prepend_http('https://localhost')
|
44
|
+
self.assertEqual('https://localhost', host)
|
45
|
+
host = prepend_http('http')
|
46
|
+
self.assertEqual('http://http', host)
|
47
|
+
|
48
|
+
def test_http_url(self):
|
49
|
+
url = http_url_from_host_port(None, None)
|
50
|
+
self.assertEqual(None, url)
|
51
|
+
url = http_url_from_host_port('localhost', None)
|
52
|
+
self.assertEqual(None, url)
|
53
|
+
url = http_url_from_host_port(None, 4200)
|
54
|
+
self.assertEqual(None, url)
|
55
|
+
url = http_url_from_host_port('localhost', 4200)
|
56
|
+
self.assertEqual('http://localhost:4200', url)
|
57
|
+
url = http_url_from_host_port('https://crate', 4200)
|
58
|
+
self.assertEqual('https://crate:4200', url)
|
59
|
+
|
60
|
+
def test_wait_for_http(self):
|
61
|
+
log = BytesIO(b'[i.c.p.h.CrateNettyHttpServerTransport] [crate] publish_address {127.0.0.1:4200}')
|
62
|
+
addr = wait_for_http_url(log)
|
63
|
+
self.assertEqual('http://127.0.0.1:4200', addr)
|
64
|
+
log = BytesIO(b'[i.c.p.h.CrateNettyHttpServerTransport] [crate] publish_address {}')
|
65
|
+
addr = wait_for_http_url(log=log, timeout=1)
|
66
|
+
self.assertEqual(None, addr)
|
67
|
+
|
68
|
+
@mock.patch.object(crate.testing.layer, "_download_and_extract", lambda uri, directory: None)
|
69
|
+
def test_layer_from_uri(self):
|
70
|
+
"""
|
71
|
+
The CrateLayer can also be created by providing an URI that points to
|
72
|
+
a CrateDB tarball.
|
73
|
+
"""
|
74
|
+
with urllib.request.urlopen("https://crate.io/versions.json") as response:
|
75
|
+
versions = json.loads(response.read().decode())
|
76
|
+
version = versions["crate_testing"]
|
77
|
+
|
78
|
+
self.assertGreaterEqual(Version(version), Version("4.5.0"))
|
79
|
+
|
80
|
+
uri = "https://cdn.crate.io/downloads/releases/crate-{}.tar.gz".format(version)
|
81
|
+
layer = CrateLayer.from_uri(uri, name="crate-by-uri", http_port=42203)
|
82
|
+
self.assertIsInstance(layer, CrateLayer)
|
83
|
+
|
84
|
+
@mock.patch.dict('os.environ', {}, clear=True)
|
85
|
+
def test_java_home_env_not_set(self):
|
86
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
87
|
+
layer = CrateLayer('java-home-test', tmpdir)
|
88
|
+
# JAVA_HOME must not be set to `None`, since it would be interpreted as a
|
89
|
+
# string 'None', and therefore intepreted as a path
|
90
|
+
self.assertEqual(layer.env['JAVA_HOME'], '')
|
91
|
+
|
92
|
+
@mock.patch.dict('os.environ', {}, clear=True)
|
93
|
+
def test_java_home_env_set(self):
|
94
|
+
java_home = '/usr/lib/jvm/java-11-openjdk-amd64'
|
95
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
96
|
+
os.environ['JAVA_HOME'] = java_home
|
97
|
+
layer = CrateLayer('java-home-test', tmpdir)
|
98
|
+
self.assertEqual(layer.env['JAVA_HOME'], java_home)
|
99
|
+
|
100
|
+
@mock.patch.dict('os.environ', {}, clear=True)
|
101
|
+
def test_java_home_env_override(self):
|
102
|
+
java_11_home = '/usr/lib/jvm/java-11-openjdk-amd64'
|
103
|
+
java_12_home = '/usr/lib/jvm/java-12-openjdk-amd64'
|
104
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
105
|
+
os.environ['JAVA_HOME'] = java_11_home
|
106
|
+
layer = CrateLayer('java-home-test', tmpdir, env={'JAVA_HOME': java_12_home})
|
107
|
+
self.assertEqual(layer.env['JAVA_HOME'], java_12_home)
|
108
|
+
|
109
|
+
|
110
|
+
class LayerTest(TestCase):
|
111
|
+
|
112
|
+
def test_basic(self):
|
113
|
+
"""
|
114
|
+
This layer starts and stops a ``Crate`` instance on a given host, port,
|
115
|
+
a given crate node name and, optionally, a given cluster name::
|
116
|
+
"""
|
117
|
+
|
118
|
+
port = 44219
|
119
|
+
transport_port = 44319
|
120
|
+
|
121
|
+
layer = CrateLayer('crate',
|
122
|
+
crate_home=crate_path(),
|
123
|
+
host='127.0.0.1',
|
124
|
+
port=port,
|
125
|
+
transport_port=transport_port,
|
126
|
+
cluster_name='my_cluster'
|
127
|
+
)
|
128
|
+
|
129
|
+
# The working directory is defined on layer instantiation.
|
130
|
+
# It is sometimes required to know it before starting the layer.
|
131
|
+
self.assertRegex(layer.wdPath(), r".+/crate_layer/crate")
|
132
|
+
|
133
|
+
# Start the layer.
|
134
|
+
layer.start()
|
135
|
+
|
136
|
+
# The urls of the crate servers to be instantiated can be obtained
|
137
|
+
# via `crate_servers`.
|
138
|
+
self.assertEqual(layer.crate_servers, ["http://127.0.0.1:44219"])
|
139
|
+
|
140
|
+
# Access the CrateDB instance on the HTTP interface.
|
141
|
+
|
142
|
+
http = urllib3.PoolManager()
|
143
|
+
|
144
|
+
stats_uri = "http://127.0.0.1:{0}/".format(port)
|
145
|
+
response = http.request('GET', stats_uri)
|
146
|
+
self.assertEqual(response.status, 200)
|
147
|
+
|
148
|
+
# The layer can be shutdown using its `stop()` method.
|
149
|
+
layer.stop()
|
150
|
+
|
151
|
+
def test_dynamic_http_port(self):
|
152
|
+
"""
|
153
|
+
It is also possible to define a port range instead of a static HTTP port for the layer.
|
154
|
+
|
155
|
+
Crate will start with the first available port in the given range and the test
|
156
|
+
layer obtains the chosen port from the startup logs of the Crate process.
|
157
|
+
Note, that this feature requires a logging configuration with at least loglevel
|
158
|
+
``INFO`` on ``http``.
|
159
|
+
"""
|
160
|
+
port = '44200-44299'
|
161
|
+
layer = CrateLayer('crate', crate_home=crate_path(), port=port)
|
162
|
+
layer.start()
|
163
|
+
self.assertRegex(layer.crate_servers[0], r"http://127.0.0.1:442\d\d")
|
164
|
+
layer.stop()
|
165
|
+
|
166
|
+
def test_default_settings(self):
|
167
|
+
"""
|
168
|
+
Starting a CrateDB layer leaving out optional parameters will apply the following
|
169
|
+
defaults.
|
170
|
+
|
171
|
+
The default http port is the first free port in the range of ``4200-4299``,
|
172
|
+
the default transport port is the first free port in the range of ``4300-4399``,
|
173
|
+
the host defaults to ``127.0.0.1``.
|
174
|
+
|
175
|
+
The command to call is ``bin/crate`` inside the ``crate_home`` path.
|
176
|
+
The default config file is ``config/crate.yml`` inside ``crate_home``.
|
177
|
+
The default cluster name will be auto generated using the HTTP port.
|
178
|
+
"""
|
179
|
+
layer = CrateLayer('crate_defaults', crate_home=crate_path())
|
180
|
+
layer.start()
|
181
|
+
self.assertEqual(layer.crate_servers[0], "http://127.0.0.1:4200")
|
182
|
+
layer.stop()
|
183
|
+
|
184
|
+
def test_additional_settings(self):
|
185
|
+
"""
|
186
|
+
The ``Crate`` layer can be started with additional settings as well.
|
187
|
+
Add a dictionary for keyword argument ``settings`` which contains your settings.
|
188
|
+
Those additional setting will override settings given as keyword argument.
|
189
|
+
|
190
|
+
The settings will be handed over to the ``Crate`` process with the ``-C`` flag.
|
191
|
+
So the setting ``threadpool.bulk.queue_size: 100`` becomes
|
192
|
+
the command line flag: ``-Cthreadpool.bulk.queue_size=100``::
|
193
|
+
"""
|
194
|
+
layer = CrateLayer(
|
195
|
+
'custom',
|
196
|
+
crate_path(),
|
197
|
+
port=44401,
|
198
|
+
settings={
|
199
|
+
"cluster.graceful_stop.min_availability": "none",
|
200
|
+
"http.port": 44402
|
201
|
+
}
|
202
|
+
)
|
203
|
+
layer.start()
|
204
|
+
self.assertEqual(layer.crate_servers[0], "http://127.0.0.1:44402")
|
205
|
+
self.assertIn("-Ccluster.graceful_stop.min_availability=none", layer.start_cmd)
|
206
|
+
layer.stop()
|
207
|
+
|
208
|
+
def test_verbosity(self):
|
209
|
+
"""
|
210
|
+
The test layer hides the standard output of Crate per default. To increase the
|
211
|
+
verbosity level the additional keyword argument ``verbose`` needs to be set
|
212
|
+
to ``True``::
|
213
|
+
"""
|
214
|
+
layer = CrateLayer('crate',
|
215
|
+
crate_home=crate_path(),
|
216
|
+
verbose=True)
|
217
|
+
layer.start()
|
218
|
+
self.assertTrue(layer.verbose)
|
219
|
+
layer.stop()
|
220
|
+
|
221
|
+
def test_environment_variables(self):
|
222
|
+
"""
|
223
|
+
It is possible to provide environment variables for the ``Crate`` testing
|
224
|
+
layer.
|
225
|
+
"""
|
226
|
+
layer = CrateLayer('crate',
|
227
|
+
crate_home=crate_path(),
|
228
|
+
env={"CRATE_HEAP_SIZE": "300m"})
|
229
|
+
|
230
|
+
layer.start()
|
231
|
+
|
232
|
+
sql_uri = layer.crate_servers[0] + "/_sql"
|
233
|
+
|
234
|
+
http = urllib3.PoolManager()
|
235
|
+
response = http.urlopen('POST', sql_uri,
|
236
|
+
body='{"stmt": "select heap[\'max\'] from sys.nodes"}')
|
237
|
+
json_response = json.loads(response.data.decode('utf-8'))
|
238
|
+
|
239
|
+
self.assertEqual(json_response["rows"][0][0], 314572800)
|
240
|
+
|
241
|
+
layer.stop()
|
242
|
+
|
243
|
+
def test_cluster(self):
|
244
|
+
"""
|
245
|
+
To start a cluster of ``Crate`` instances, give each instance the same
|
246
|
+
``cluster_name``. If you want to start instances on the same machine then
|
247
|
+
use value ``_local_`` for ``host`` and give every node different ports::
|
248
|
+
"""
|
249
|
+
cluster_layer1 = CrateLayer(
|
250
|
+
'crate1',
|
251
|
+
crate_path(),
|
252
|
+
host='_local_',
|
253
|
+
cluster_name='my_cluster',
|
254
|
+
)
|
255
|
+
cluster_layer2 = CrateLayer(
|
256
|
+
'crate2',
|
257
|
+
crate_path(),
|
258
|
+
host='_local_',
|
259
|
+
cluster_name='my_cluster',
|
260
|
+
settings={"discovery.initial_state_timeout": "10s"}
|
261
|
+
)
|
262
|
+
|
263
|
+
# If we start both layers, they will, after a small amount of time, find each other
|
264
|
+
# and form a cluster.
|
265
|
+
cluster_layer1.start()
|
266
|
+
cluster_layer2.start()
|
267
|
+
|
268
|
+
# We can verify that by checking the number of nodes a node knows about.
|
269
|
+
http = urllib3.PoolManager()
|
270
|
+
|
271
|
+
def num_cluster_nodes(crate_layer):
|
272
|
+
sql_uri = crate_layer.crate_servers[0] + "/_sql"
|
273
|
+
response = http.urlopen('POST', sql_uri, body='{"stmt":"select count(*) from sys.nodes"}')
|
274
|
+
json_response = json.loads(response.data.decode('utf-8'))
|
275
|
+
return json_response["rows"][0][0]
|
276
|
+
|
277
|
+
# We might have to wait a moment before the cluster is finally created.
|
278
|
+
num_nodes = num_cluster_nodes(cluster_layer1)
|
279
|
+
import time
|
280
|
+
retries = 0
|
281
|
+
while num_nodes < 2: # pragma: no cover
|
282
|
+
time.sleep(1)
|
283
|
+
num_nodes = num_cluster_nodes(cluster_layer1)
|
284
|
+
retries += 1
|
285
|
+
if retries == 30:
|
286
|
+
break
|
287
|
+
self.assertEqual(num_nodes, 2)
|
288
|
+
|
289
|
+
cluster_layer1.stop()
|
290
|
+
cluster_layer2.stop()
|
crate/testing/tests.py
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# vi: set encoding=utf-8
|
2
|
+
# -*- coding: utf-8; -*-
|
3
|
+
#
|
4
|
+
# Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
|
5
|
+
# license agreements. See the NOTICE file distributed with this work for
|
6
|
+
# additional information regarding copyright ownership. Crate licenses
|
7
|
+
# this file to you under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License. You may
|
9
|
+
# obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
15
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
16
|
+
# License for the specific language governing permissions and limitations
|
17
|
+
# under the License.
|
18
|
+
#
|
19
|
+
# However, if you have executed another commercial license agreement
|
20
|
+
# with Crate these terms will supersede the license and you may use the
|
21
|
+
# software solely pursuant to the terms of the relevant commercial agreement.
|
22
|
+
|
23
|
+
import unittest
|
24
|
+
from .test_layer import LayerUtilsTest, LayerTest
|
25
|
+
|
26
|
+
|
27
|
+
makeSuite = unittest.TestLoader().loadTestsFromTestCase
|
28
|
+
|
29
|
+
|
30
|
+
def test_suite():
|
31
|
+
suite = unittest.TestSuite()
|
32
|
+
suite.addTest(makeSuite(LayerUtilsTest))
|
33
|
+
suite.addTest(makeSuite(LayerTest))
|
34
|
+
return suite
|
crate/testing/util.py
CHANGED
@@ -1,75 +1,4 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
|
4
|
-
# license agreements. See the NOTICE file distributed with this work for
|
5
|
-
# additional information regarding copyright ownership. Crate licenses
|
6
|
-
# this file to you under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License. You may
|
8
|
-
# obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
14
|
-
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
15
|
-
# License for the specific language governing permissions and limitations
|
16
|
-
# under the License.
|
17
|
-
#
|
18
|
-
# However, if you have executed another commercial license agreement
|
19
|
-
# with Crate these terms will supersede the license and you may use the
|
20
|
-
# software solely pursuant to the terms of the relevant commercial agreement.
|
21
|
-
import unittest
|
22
|
-
|
23
|
-
|
24
|
-
class ClientMocked:
|
25
|
-
active_servers = ["http://localhost:4200"]
|
26
|
-
|
27
|
-
def __init__(self):
|
28
|
-
self.response = {}
|
29
|
-
self._server_infos = ("http://localhost:4200", "my server", "2.0.0")
|
30
|
-
|
31
|
-
def sql(self, stmt=None, parameters=None, bulk_parameters=None):
|
32
|
-
return self.response
|
33
|
-
|
34
|
-
def server_infos(self, server):
|
35
|
-
return self._server_infos
|
36
|
-
|
37
|
-
def set_next_response(self, response):
|
38
|
-
self.response = response
|
39
|
-
|
40
|
-
def set_next_server_infos(self, server, server_name, version):
|
41
|
-
self._server_infos = (server, server_name, version)
|
42
|
-
|
43
|
-
def close(self):
|
44
|
-
pass
|
45
|
-
|
46
|
-
|
47
|
-
class ParametrizedTestCase(unittest.TestCase):
|
48
|
-
"""
|
49
|
-
TestCase classes that want to be parametrized should
|
50
|
-
inherit from this class.
|
51
|
-
|
52
|
-
https://eli.thegreenplace.net/2011/08/02/python-unit-testing-parametrized-test-cases
|
53
|
-
"""
|
54
|
-
|
55
|
-
def __init__(self, methodName="runTest", param=None):
|
56
|
-
super(ParametrizedTestCase, self).__init__(methodName)
|
57
|
-
self.param = param
|
58
|
-
|
59
|
-
@staticmethod
|
60
|
-
def parametrize(testcase_klass, param=None):
|
61
|
-
"""Create a suite containing all tests taken from the given
|
62
|
-
subclass, passing them the parameter 'param'.
|
63
|
-
"""
|
64
|
-
testloader = unittest.TestLoader()
|
65
|
-
testnames = testloader.getTestCaseNames(testcase_klass)
|
66
|
-
suite = unittest.TestSuite()
|
67
|
-
for name in testnames:
|
68
|
-
suite.addTest(testcase_klass(name, param=param))
|
69
|
-
return suite
|
70
|
-
|
71
|
-
|
72
|
-
class ExtraAssertions(unittest.TestCase):
|
1
|
+
class ExtraAssertions:
|
73
2
|
"""
|
74
3
|
Additional assert methods for unittest.
|
75
4
|
|
@@ -83,13 +12,9 @@ class ExtraAssertions(unittest.TestCase):
|
|
83
12
|
r = issubclass(cls, superclass)
|
84
13
|
except TypeError:
|
85
14
|
if not isinstance(cls, type):
|
86
|
-
self.fail(
|
87
|
-
|
88
|
-
)
|
15
|
+
self.fail(self._formatMessage(msg,
|
16
|
+
'%r is not a class' % (cls,)))
|
89
17
|
raise
|
90
18
|
if not r:
|
91
|
-
self.fail(
|
92
|
-
|
93
|
-
msg, "%r is not a subclass of %r" % (cls, superclass)
|
94
|
-
)
|
95
|
-
)
|
19
|
+
self.fail(self._formatMessage(msg,
|
20
|
+
'%r is not a subclass of %r' % (cls, superclass)))
|
@@ -0,0 +1 @@
|
|
1
|
+
import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('crate',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('crate', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('crate', [os.path.dirname(p)])));m = m or sys.modules.setdefault('crate', types.ModuleType('crate'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
|
@@ -176,3 +176,73 @@
|
|
176
176
|
of your accepting any such warranty or additional liability.
|
177
177
|
|
178
178
|
END OF TERMS AND CONDITIONS
|
179
|
+
|
180
|
+
APPENDIX: How to apply the Apache License to your work.
|
181
|
+
|
182
|
+
To apply the Apache License to your work, attach the following
|
183
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
184
|
+
replaced with your own identifying information. (Don't include
|
185
|
+
the brackets!) The text should be enclosed in the appropriate
|
186
|
+
comment syntax for the file format. We also recommend that a
|
187
|
+
file or class name and description of purpose be included on the
|
188
|
+
same "printed page" as the copyright notice for easier
|
189
|
+
identification within third-party archives.
|
190
|
+
|
191
|
+
Copyright [yyyy] [name of copyright owner]
|
192
|
+
|
193
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
194
|
+
you may not use this file except in compliance with the License.
|
195
|
+
You may obtain a copy of the License at
|
196
|
+
|
197
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
198
|
+
|
199
|
+
Unless required by applicable law or agreed to in writing, software
|
200
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
201
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
202
|
+
See the License for the specific language governing permissions and
|
203
|
+
limitations under the License.
|
204
|
+
|
205
|
+
|
206
|
+
===============================================================================
|
207
|
+
|
208
|
+
For the `docs` directory:
|
209
|
+
|
210
|
+
The source files for the documentation are licensed under the Apache License
|
211
|
+
Version 2.0. These source files are used by the project maintainers to build
|
212
|
+
online documentation for end-users:
|
213
|
+
|
214
|
+
<https://crate.io/docs/clients/python/en/latest/>
|
215
|
+
|
216
|
+
If you want to make contributions to the documentation, it may be necessary for
|
217
|
+
you to build the documentation yourself by following the instructions in the
|
218
|
+
`DEVELOP.rst` file. If you do this, a number of third-party software components
|
219
|
+
are necessary.
|
220
|
+
|
221
|
+
We do not ship the source code for these optional third-party software
|
222
|
+
components or their dependencies, so we cannot make any guarantees about the
|
223
|
+
licensing status of these components.
|
224
|
+
|
225
|
+
However, for convenience, the documentation build system explicitly references
|
226
|
+
the following software components (grouped by license):
|
227
|
+
|
228
|
+
PSF License:
|
229
|
+
|
230
|
+
- Python 3 <https://docs.python.org/3/license.html>
|
231
|
+
|
232
|
+
MIT License:
|
233
|
+
|
234
|
+
- pip <https://pypi.org/project/pip/>
|
235
|
+
- setuptools <https://pypi.org/project/setuptools/>
|
236
|
+
- sphinx-autobuild <https://pypi.org/project/sphinx-autobuild/>
|
237
|
+
|
238
|
+
BSD License:
|
239
|
+
|
240
|
+
- alabaster <https://pypi.org/project/alabaster/>
|
241
|
+
- sphinx <https://pypi.org/project/Sphinx/>
|
242
|
+
|
243
|
+
Apache License 2.0:
|
244
|
+
|
245
|
+
- crate-docs-theme <https://pypi.org/project/crate-docs-theme/>
|
246
|
+
|
247
|
+
Please note that each of these components may specify its own dependencies and
|
248
|
+
those dependencies may be licensed differently.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: crate
|
3
|
-
Version: 1.0.0
|
3
|
+
Version: 1.0.0.dev1
|
4
4
|
Summary: CrateDB Python Client
|
5
5
|
Home-page: https://github.com/crate/crate-python
|
6
6
|
Author: Crate.io
|
@@ -21,7 +21,6 @@ Classifier: Programming Language :: Python :: 3.9
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.10
|
22
22
|
Classifier: Programming Language :: Python :: 3.11
|
23
23
|
Classifier: Programming Language :: Python :: 3.12
|
24
|
-
Classifier: Programming Language :: Python :: 3.13
|
25
24
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
26
25
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
27
26
|
Classifier: Topic :: Database
|
@@ -29,24 +28,25 @@ Requires-Python: >=3.6
|
|
29
28
|
Description-Content-Type: text/x-rst
|
30
29
|
License-File: LICENSE
|
31
30
|
License-File: NOTICE
|
32
|
-
Requires-Dist: urllib3
|
33
|
-
Requires-Dist: verlib2
|
31
|
+
Requires-Dist: urllib3<2.3
|
32
|
+
Requires-Dist: verlib2==0.2.0
|
34
33
|
Provides-Extra: doc
|
35
|
-
Requires-Dist:
|
36
|
-
Requires-Dist:
|
34
|
+
Requires-Dist: sphinx<8,>=3.5; extra == "doc"
|
35
|
+
Requires-Dist: crate-docs-theme>=0.26.5; extra == "doc"
|
37
36
|
Provides-Extra: test
|
38
|
-
Requires-Dist:
|
39
|
-
Requires-Dist:
|
40
|
-
Requires-Dist:
|
41
|
-
Requires-Dist:
|
42
|
-
Requires-Dist:
|
43
|
-
Requires-Dist:
|
44
|
-
Requires-Dist:
|
45
|
-
Requires-Dist:
|
46
|
-
Requires-Dist:
|
47
|
-
Requires-Dist:
|
48
|
-
Requires-Dist:
|
49
|
-
Requires-Dist:
|
37
|
+
Requires-Dist: tox<5,>=3; extra == "test"
|
38
|
+
Requires-Dist: zope.testing<6,>=4; extra == "test"
|
39
|
+
Requires-Dist: zope.testrunner<7,>=5; extra == "test"
|
40
|
+
Requires-Dist: zc.customdoctests<2,>=1.0.1; extra == "test"
|
41
|
+
Requires-Dist: certifi; extra == "test"
|
42
|
+
Requires-Dist: createcoverage<2,>=1; extra == "test"
|
43
|
+
Requires-Dist: dask[dataframe]; extra == "test"
|
44
|
+
Requires-Dist: stopit<2,>=1.1.2; extra == "test"
|
45
|
+
Requires-Dist: flake8<8,>=4; extra == "test"
|
46
|
+
Requires-Dist: pandas<2.3; extra == "test"
|
47
|
+
Requires-Dist: pueblo>=0.0.7; extra == "test"
|
48
|
+
Requires-Dist: pytz; extra == "test"
|
49
|
+
Requires-Dist: backports.zoneinfo<1; python_version < "3.9" and extra == "test"
|
50
50
|
|
51
51
|
=====================
|
52
52
|
CrateDB Python Client
|
@@ -56,7 +56,7 @@ CrateDB Python Client
|
|
56
56
|
:target: https://github.com/crate/crate-python/actions?workflow=Tests
|
57
57
|
:alt: Build status
|
58
58
|
|
59
|
-
.. image:: https://codecov.io/gh/crate/crate-python/branch/
|
59
|
+
.. image:: https://codecov.io/gh/crate/crate-python/branch/master/graph/badge.svg
|
60
60
|
:target: https://app.codecov.io/gh/crate/crate-python
|
61
61
|
:alt: Coverage
|
62
62
|
|
@@ -152,3 +152,5 @@ GitHub`_. We appreciate contributions of any kind.
|
|
152
152
|
.. _sqlalchemy-cratedb documentation: https://cratedb.com/docs/sqlalchemy-cratedb/
|
153
153
|
.. _StackOverflow: https://stackoverflow.com/tags/cratedb
|
154
154
|
.. _support channels: https://cratedb.com/support/
|
155
|
+
|
156
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
crate-1.0.0.dev1-py3.9-nspkg.pth,sha256=nqN0-lx5dVfXKgm9N7WRgI0lrvtTYi2PUOtTjfAMtjY,534
|
2
|
+
crate/client/__init__.py,sha256=GnUvV93BwWcsazbCFyfnF4MqJivTNZOcEzHcR3sAzDc,1308
|
3
|
+
crate/client/_pep440.py,sha256=iwY5wopxbgbwsT0ImANrwN3V_ZYQHhSr7lEdVT5dQRM,42
|
4
|
+
crate/client/blob.py,sha256=plTwGEULg5s1VdKIMW6a0Zljdkng7xw0WXkXyiwNaSU,3496
|
5
|
+
crate/client/connection.py,sha256=5vmtGZF20vxoeExHTeQ-DqJX4BPNT8ebzH_HOvdcqdE,8432
|
6
|
+
crate/client/converter.py,sha256=9_-FBp8l9LwCfBsoWO0YOW0ASkwJ-le-YJFfJMLKCew,4301
|
7
|
+
crate/client/cursor.py,sha256=qnrNM9QDQgo9RFVGU7HPmCxK15EFUWiOxW3BNlZcuNw,10758
|
8
|
+
crate/client/exceptions.py,sha256=or3D-AzKRKKgrOa8lAUIk6CFObdXvXZmfV1MMlzNP8o,2409
|
9
|
+
crate/client/http.py,sha256=aA6L-9i7-UovLKG3ICymRq7S0KPOIZiNejv1jzPrn4A,22559
|
10
|
+
crate/client/test_connection.py,sha256=sGsnqgpxe9sgD6TllVbQGHozf4Binrzxe_ydfAQJgWE,3670
|
11
|
+
crate/client/test_cursor.py,sha256=Q9Npq55zTY4g51kf3P7DnmTsYdv0iRwqDptKOj9ffxA,12858
|
12
|
+
crate/client/test_exceptions.py,sha256=LdTfl4mV5fjxROKeo6_x2xtff0b3tWy4IPN3BLDhVeA,352
|
13
|
+
crate/client/test_http.py,sha256=LvUC0QeAhH2-LJDfp2zVT6OEVTG6GKqid6qUTM9rjGY,23534
|
14
|
+
crate/client/test_util.py,sha256=k8j3Ya1fPwdfrbRkUNsqxqcyoi5Rj7O_r4HpOEdK_yA,2508
|
15
|
+
crate/client/tests.py,sha256=dWNezqJdr0YBZNgxrChFTbaNh_DTesU2vNgm2UGxDE0,11165
|
16
|
+
crate/testing/__init__.py,sha256=UnxmjVrk-eNORsitiM48W0pB6yfsaErOak8RYh_ELt8,10
|
17
|
+
crate/testing/layer.py,sha256=-AvRsTysqncns5IqUFWKZFppC3KwQxDJt0tnBWjxlMs,13382
|
18
|
+
crate/testing/settings.py,sha256=YTqod79NO4Lv_agPgMLGlB_fMe6baAhLXFKBZnuytBk,1652
|
19
|
+
crate/testing/test_datetime_old.py,sha256=SI0HzI8CfcbOYIj9MJz_XACrnwWyMQCZzM_Gu5PUDkI,3799
|
20
|
+
crate/testing/test_layer.py,sha256=S0QgY7TgD52EyYWrMoSLUfRVjVzw-oiUdR-g5fJ_zmQ,11512
|
21
|
+
crate/testing/tests.py,sha256=4YcBkpRnihPHPJnr6wPcmORfzkI7FSVL2TCm4MdzUss,1327
|
22
|
+
crate/testing/util.py,sha256=qtc72rKfvfTA9VMKjE2JSukffobd7ffCcddoTiAdO6A,690
|
23
|
+
crate-1.0.0.dev1.dist-info/LICENSE,sha256=1QGh4tR_JmDKn33ztoDv2UkER0Q4Zh1kC5J3vMWwRso,12854
|
24
|
+
crate-1.0.0.dev1.dist-info/METADATA,sha256=6NMZWvLEo0YVfyez5stR6m1-crw1MIdzr-ucOuXMJv8,5371
|
25
|
+
crate-1.0.0.dev1.dist-info/NOTICE,sha256=vwbBS8sykCOndA1kjuu8dUInljH27kk3lcPBzQ2SMns,1159
|
26
|
+
crate-1.0.0.dev1.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
27
|
+
crate-1.0.0.dev1.dist-info/namespace_packages.txt,sha256=2wP2HlpxdhgTLMl9ipi168xkm6FMq9_2bf0xGGxF_OI,6
|
28
|
+
crate-1.0.0.dev1.dist-info/top_level.txt,sha256=2wP2HlpxdhgTLMl9ipi168xkm6FMq9_2bf0xGGxF_OI,6
|
29
|
+
crate-1.0.0.dev1.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
crate
|
crate/__init__.py
DELETED
File without changes
|
crate-1.0.0.dist-info/RECORD
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
crate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
crate/client/__init__.py,sha256=6WP0UuWjaIA_y4COlsstRTIUjvkMIxtIz7qQtXjnUzQ,1308
|
3
|
-
crate/client/_pep440.py,sha256=iwY5wopxbgbwsT0ImANrwN3V_ZYQHhSr7lEdVT5dQRM,42
|
4
|
-
crate/client/blob.py,sha256=aMo6ZNHGT3Zq_yR3gcpd3CKrJvfqUAhExhKtHUwC5Io,3460
|
5
|
-
crate/client/connection.py,sha256=80v9_--YilDAaIQpejf3G_TWGz9iwUkixwHAL66sDm0,8098
|
6
|
-
crate/client/converter.py,sha256=Qci0MNcpz1jAnjquG8Ld9LI84_iHVInrv4HMb8r5zzg,4313
|
7
|
-
crate/client/cursor.py,sha256=Mlk-TVLzM4zSSr7GxcHK4Mjbt1KQeMfNFNrPBtGjk-c,10741
|
8
|
-
crate/client/exceptions.py,sha256=wMyJmOB3RP5kuPeW9f0fEb-1AKZcGSTyIGvN0HqpqUw,2557
|
9
|
-
crate/client/http.py,sha256=ddp_VSTcrMNStPjSG0CmdtRUO8dgaQZfNR_ltfs9DxI,22625
|
10
|
-
crate/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
crate/testing/layer.py,sha256=jvHRWTRE4Zal211UO0HWPFcbprAcaGB3WyAUDR7BKFQ,13376
|
12
|
-
crate/testing/util.py,sha256=BPEZ8DavXwyOTCmOQnP5QjQlapEw3harzKK4w2HOTA4,3264
|
13
|
-
crate-1.0.0.dist-info/LICENSE,sha256=s_w3FXmAYQuatqsgvyYLnGyC_13KOqp3W1DUEXO9RpY,10175
|
14
|
-
crate-1.0.0.dist-info/METADATA,sha256=k7Ca_N8e85QarM1eCWHgdoct44Ff3E-qEZEN9feWIE4,5379
|
15
|
-
crate-1.0.0.dist-info/NOTICE,sha256=jfWOHkoZKjNATGXMfgpMJdL38ki_ZZTgR6M9CUUJxrM,1159
|
16
|
-
crate-1.0.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
17
|
-
crate-1.0.0.dist-info/top_level.txt,sha256=2wP2HlpxdhgTLMl9ipi168xkm6FMq9_2bf0xGGxF_OI,6
|
18
|
-
crate-1.0.0.dist-info/RECORD,,
|
File without changes
|