gremlinpython 3.7.1__tar.gz → 3.7.3__tar.gz

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.
Files changed (42) hide show
  1. gremlinpython-3.7.3/NOTICE +5 -0
  2. {gremlinpython-3.7.1/gremlinpython.egg-info → gremlinpython-3.7.3}/PKG-INFO +5 -2
  3. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/__version__.py +2 -2
  4. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/aiohttp/transport.py +8 -2
  5. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/client.py +4 -2
  6. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/connection.py +17 -6
  7. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/driver_remote_connection.py +3 -1
  8. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/protocol.py +24 -22
  9. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/serializer.py +1 -1
  10. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/useragent.py +1 -1
  11. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/process/graph_traversal.py +41 -5
  12. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/process/traversal.py +2 -2
  13. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/io/graphbinaryV1.py +12 -3
  14. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/io/graphsonV2d0.py +25 -1
  15. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/io/graphsonV3d0.py +26 -1
  16. {gremlinpython-3.7.1 → gremlinpython-3.7.3/gremlinpython.egg-info}/PKG-INFO +5 -2
  17. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlinpython.egg-info/requires.txt +1 -1
  18. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/setup.cfg +0 -3
  19. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/setup.py +7 -9
  20. gremlinpython-3.7.1/NOTICE +0 -5
  21. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/LICENSE +0 -0
  22. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/MANIFEST.in +0 -0
  23. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/README.rst +0 -0
  24. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/__init__.py +0 -0
  25. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/__init__.py +0 -0
  26. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/aiohttp/__init__.py +0 -0
  27. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/remote_connection.py +0 -0
  28. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/request.py +0 -0
  29. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/resultset.py +0 -0
  30. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/driver/transport.py +0 -0
  31. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/process/__init__.py +0 -0
  32. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/process/anonymous_traversal.py +0 -0
  33. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/process/strategies.py +0 -0
  34. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/process/translator.py +0 -0
  35. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/statics.py +0 -0
  36. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/__init__.py +0 -0
  37. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/graph.py +0 -0
  38. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/io/__init__.py +0 -0
  39. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlin_python/structure/io/util.py +0 -0
  40. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlinpython.egg-info/SOURCES.txt +0 -0
  41. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlinpython.egg-info/dependency_links.txt +0 -0
  42. {gremlinpython-3.7.1 → gremlinpython-3.7.3}/gremlinpython.egg-info/top_level.txt +0 -0
@@ -0,0 +1,5 @@
1
+ Apache TinkerPop
2
+ Copyright 2015-2024 The Apache Software Foundation.
3
+
4
+ This product includes software developed at
5
+ The Apache Software Foundation (http://www.apache.org/).
@@ -1,14 +1,17 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gremlinpython
3
- Version: 3.7.1
3
+ Version: 3.7.3
4
4
  Summary: Gremlin-Python for Apache TinkerPop
5
- Home-page: http://tinkerpop.apache.org
5
+ Home-page: https://tinkerpop.apache.org
6
+ Maintainer: Apache TinkerPop
7
+ Maintainer-email: dev@tinkerpop.apache.org
6
8
  License: Apache 2
7
9
  Platform: UNKNOWN
8
10
  Classifier: Intended Audience :: Developers
9
11
  Classifier: License :: OSI Approved :: Apache Software License
10
12
  Classifier: Natural Language :: English
11
13
  Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.9
12
15
  Description-Content-Type: text/x-rst
13
16
  Provides-Extra: kerberos
14
17
  Provides-Extra: ujson
@@ -16,5 +16,5 @@ KIND, either express or implied. See the License for the
16
16
  specific language governing permissions and limitations
17
17
  under the License.
18
18
  '''
19
- version = '3.7.1'
20
- timestamp = 1701721127
19
+ version = '3.7.3'
20
+ timestamp = 1730223986
@@ -29,7 +29,8 @@ __author__ = 'Lyndon Bauto (lyndonb@bitquilltech.com)'
29
29
  class AiohttpTransport(AbstractBaseTransport):
30
30
  nest_asyncio_applied = False
31
31
 
32
- def __init__(self, call_from_event_loop=None, read_timeout=None, write_timeout=None, **kwargs):
32
+ def __init__(self, call_from_event_loop=None, read_timeout=None, write_timeout=None, enable_compression=False,
33
+ **kwargs):
33
34
  if call_from_event_loop is not None and call_from_event_loop and not AiohttpTransport.nest_asyncio_applied:
34
35
  """
35
36
  The AiohttpTransport implementation uses the asyncio event loop. Because of this, it cannot be called
@@ -50,10 +51,13 @@ class AiohttpTransport(AbstractBaseTransport):
50
51
  self._aiohttp_kwargs = kwargs
51
52
  self._write_timeout = write_timeout
52
53
  self._read_timeout = read_timeout
54
+ self._enable_compression = enable_compression
53
55
  if "max_content_length" in self._aiohttp_kwargs:
54
56
  self._aiohttp_kwargs["max_msg_size"] = self._aiohttp_kwargs.pop("max_content_length")
55
57
  if "ssl_options" in self._aiohttp_kwargs:
56
58
  self._aiohttp_kwargs["ssl"] = self._aiohttp_kwargs.pop("ssl_options")
59
+ if self._enable_compression and "compress" not in self._aiohttp_kwargs:
60
+ self._aiohttp_kwargs["compress"] = 15 # enable per-message deflate compression with 32k sliding window size
57
61
 
58
62
  def __del__(self):
59
63
  # Close will only actually close if things are left open, so this is safe to call.
@@ -211,7 +215,9 @@ class AiohttpHTTPTransport(AbstractBaseTransport):
211
215
  # Inner function to perform async read.
212
216
  async def async_read():
213
217
  async with async_timeout.timeout(self._read_timeout):
214
- return await self._http_req_resp.read()
218
+ return {"content": await self._http_req_resp.read(),
219
+ "ok": self._http_req_resp.ok,
220
+ "status": self._http_req_resp.status}
215
221
 
216
222
  return self._loop.run_until_complete(async_read())
217
223
 
@@ -44,7 +44,8 @@ class Client:
44
44
  transport_factory=None, pool_size=None, max_workers=None,
45
45
  message_serializer=None, username="", password="",
46
46
  kerberized_service="", headers=None, session=None,
47
- enable_user_agent_on_connect=True, **transport_kwargs):
47
+ enable_user_agent_on_connect=True, enable_compression=False,
48
+ **transport_kwargs):
48
49
  log.info("Creating Client with url '%s'", url)
49
50
 
50
51
  # check via url that we are using http protocol
@@ -55,6 +56,7 @@ class Client:
55
56
  self._headers = headers
56
57
  self._enable_user_agent_on_connect = enable_user_agent_on_connect
57
58
  self._traversal_source = traversal_source
59
+ self._enable_compression = enable_compression
58
60
  if not self._use_http and "max_content_length" not in transport_kwargs:
59
61
  transport_kwargs["max_content_length"] = 10 * 1024 * 1024
60
62
  if message_serializer is None:
@@ -77,7 +79,7 @@ class Client:
77
79
  if self._use_http:
78
80
  return AiohttpHTTPTransport(**transport_kwargs)
79
81
  else:
80
- return AiohttpTransport(**transport_kwargs)
82
+ return AiohttpTransport(enable_compression=enable_compression, **transport_kwargs)
81
83
  self._transport_factory = transport_factory
82
84
  if protocol_factory is None:
83
85
  def protocol_factory():
@@ -39,9 +39,7 @@ class Connection:
39
39
  self._inited = False
40
40
  self._enable_user_agent_on_connect = enable_user_agent_on_connect
41
41
  if self._enable_user_agent_on_connect:
42
- if self._headers is None:
43
- self._headers = dict()
44
- self._headers[useragent.userAgentHeader] = useragent.userAgent
42
+ self.__add_header(useragent.userAgentHeader, useragent.userAgent)
45
43
 
46
44
  def connect(self):
47
45
  if self._transport:
@@ -58,10 +56,11 @@ class Connection:
58
56
  def write(self, request_message):
59
57
  if not self._inited:
60
58
  self.connect()
61
- request_id = str(uuid.uuid4())
62
59
  if request_message.args.get("requestId"):
63
- request_id = request_message.args.get("requestId")
64
- uuid.UUID(request_id) # Checks for proper UUID or else server will return an error.
60
+ request_id = str(request_message.args.get("requestId"))
61
+ uuid.UUID(request_id) # Checks for proper UUID or else server will return an error.
62
+ else:
63
+ request_id = str(uuid.uuid4())
65
64
  result_set = resultset.ResultSet(queue.Queue(), request_id)
66
65
  self._results[request_id] = result_set
67
66
  # Create write task
@@ -93,3 +92,15 @@ class Connection:
93
92
  break
94
93
  finally:
95
94
  self._pool.put_nowait(self)
95
+
96
+ def __add_header(self, key, value):
97
+ if self._headers is None:
98
+ self._headers = dict()
99
+ # Headers may be a list of pairs
100
+ if isinstance(self._headers, list):
101
+ for pair in self._headers:
102
+ if pair[0] == key:
103
+ self._headers.remove(pair)
104
+ self._headers.append((key, value))
105
+ else:
106
+ self._headers[key] = value
@@ -39,7 +39,7 @@ class DriverRemoteConnection(RemoteConnection):
39
39
  username="", password="", kerberized_service='',
40
40
  message_serializer=None, graphson_reader=None,
41
41
  graphson_writer=None, headers=None, session=None,
42
- enable_user_agent_on_connect=True, **transport_kwargs):
42
+ enable_user_agent_on_connect=True, enable_compression=False, **transport_kwargs):
43
43
  log.info("Creating DriverRemoteConnection with url '%s'", str(url))
44
44
  self.__url = url
45
45
  self.__traversal_source = traversal_source
@@ -56,6 +56,7 @@ class DriverRemoteConnection(RemoteConnection):
56
56
  self.__headers = headers
57
57
  self.__session = session
58
58
  self.__enable_user_agent_on_connect = enable_user_agent_on_connect
59
+ self.__enable_compression = enable_compression
59
60
  self.__transport_kwargs = transport_kwargs
60
61
 
61
62
  # keeps a list of sessions that have been spawned from this DriverRemoteConnection
@@ -78,6 +79,7 @@ class DriverRemoteConnection(RemoteConnection):
78
79
  headers=headers,
79
80
  session=session,
80
81
  enable_user_agent_on_connect=enable_user_agent_on_connect,
82
+ enable_compression=enable_compression,
81
83
  **transport_kwargs)
82
84
  self._url = self._client._url
83
85
  self._traversal_source = self._client._traversal_source
@@ -223,35 +223,37 @@ class GremlinServerHTTPProtocol(AbstractBaseProtocol):
223
223
 
224
224
  self._transport.write(message)
225
225
 
226
- def data_received(self, message, results_dict):
226
+ def data_received(self, response, results_dict):
227
227
  # if Gremlin Server cuts off then we get a None for the message
228
- if message is None:
228
+ if response is None:
229
229
  log.error("Received empty message from server.")
230
230
  raise GremlinServerError({'code': 500,
231
231
  'message': 'Server disconnected - please try to reconnect', 'attributes': {}})
232
232
 
233
- message = self._message_serializer.deserialize_message(message)
234
- request_id = message['requestId']
235
- result_set = results_dict[request_id] if request_id in results_dict else ResultSet(None, None)
236
- status_code = message['status']['code']
237
- aggregate_to = message['result']['meta'].get('aggregateTo', 'list')
238
- data = message['result']['data']
239
- result_set.aggregate_to = aggregate_to
240
-
241
- if status_code == 204:
242
- result_set.stream.put_nowait([])
243
- del results_dict[request_id]
244
- return status_code
245
- elif status_code in [200, 206]:
246
- result_set.stream.put_nowait(data)
247
- if status_code == 200:
248
- result_set.status_attributes = message['status']['attributes']
233
+ if response['ok']:
234
+ message = self._message_serializer.deserialize_message(response['content'])
235
+ request_id = message['requestId']
236
+ result_set = results_dict[request_id] if request_id in results_dict else ResultSet(None, None)
237
+ status_code = message['status']['code']
238
+ aggregate_to = message['result']['meta'].get('aggregateTo', 'list')
239
+ data = message['result']['data']
240
+ result_set.aggregate_to = aggregate_to
241
+
242
+ if status_code == 204:
243
+ result_set.stream.put_nowait([])
249
244
  del results_dict[request_id]
250
- return status_code
245
+ return status_code
246
+ elif status_code in [200, 206]:
247
+ result_set.stream.put_nowait(data)
248
+ if status_code == 200:
249
+ result_set.status_attributes = message['status']['attributes']
250
+ del results_dict[request_id]
251
+ return status_code
251
252
  else:
252
253
  # This message is going to be huge and kind of hard to read, but in the event of an error,
253
254
  # it can provide invaluable info, so space it out appropriately.
254
255
  log.error("\r\nReceived error message '%s'\r\n\r\nWith results dictionary '%s'",
255
- str(message), str(results_dict))
256
- del results_dict[request_id]
257
- raise GremlinServerError(message['status'])
256
+ str(response['content']), str(results_dict))
257
+ body = json.loads(response['content'])
258
+ del results_dict[body['requestId']]
259
+ raise GremlinServerError({'code': response['status'], 'message': body['message'], 'attributes': {}})
@@ -240,7 +240,7 @@ class GraphBinarySerializersV1(object):
240
240
  def finalize_message(self, message, mime_len, mime_type):
241
241
  ba = bytearray()
242
242
 
243
- request_id = uuid.UUID(message['requestId'])
243
+ request_id = uuid.UUID(str(message['requestId']))
244
244
  ba.extend(self.header_pack(mime_len, mime_type, 0x81,
245
245
  (request_id.int >> 64) & self.max_int64, request_id.int & self.max_int64))
246
246
 
@@ -18,7 +18,7 @@
18
18
  #
19
19
  import platform
20
20
 
21
- gremlin_version = "3.7.1" # DO NOT MODIFY - Configured automatically by Maven Replacer Plugin
21
+ gremlin_version = "3.7.3" # DO NOT MODIFY - Configured automatically by Maven Replacer Plugin
22
22
 
23
23
  def _generate_user_agent():
24
24
  application_name = "NotAvailable"
@@ -659,6 +659,10 @@ class GraphTraversal(Traversal):
659
659
  self.bytecode.add_step("lTrim", *args)
660
660
  return self
661
661
 
662
+ def l_trim(self, *args):
663
+ self.bytecode.add_step("lTrim", *args)
664
+ return self
665
+
662
666
  def map(self, *args):
663
667
  self.bytecode.add_step("map", *args)
664
668
  return self
@@ -841,6 +845,10 @@ class GraphTraversal(Traversal):
841
845
  self.bytecode.add_step("rTrim", *args)
842
846
  return self
843
847
 
848
+ def r_trim(self, *args):
849
+ self.bytecode.add_step("rTrim", *args)
850
+ return self
851
+
844
852
  def sack(self, *args):
845
853
  self.bytecode.add_step("sack", *args)
846
854
  return self
@@ -1413,7 +1421,15 @@ class __(object, metaclass=MagicType):
1413
1421
 
1414
1422
  @classmethod
1415
1423
  def ltrim(cls, *args):
1416
- return cls.graph_traversal(None, None, Bytecode()).ltrim(*args)
1424
+ warnings.warn(
1425
+ "gremlin_python.process.__.ltrim will be replaced by "
1426
+ "gremlin_python.process.__.l_trim.",
1427
+ DeprecationWarning)
1428
+ return cls.l_trim(*args)
1429
+
1430
+ @classmethod
1431
+ def l_trim(cls, *args):
1432
+ return cls.graph_traversal(None, None, Bytecode()).l_trim(*args)
1417
1433
 
1418
1434
  @classmethod
1419
1435
  def map(cls, *args):
@@ -1557,7 +1573,15 @@ class __(object, metaclass=MagicType):
1557
1573
 
1558
1574
  @classmethod
1559
1575
  def rTrim(cls, *args):
1560
- return cls.graph_traversal(None, None, Bytecode()).rTrim(*args)
1576
+ warnings.warn(
1577
+ "gremlin_python.process.__.rTrim will be replaced by "
1578
+ "gremlin_python.process.__.r_trim.",
1579
+ DeprecationWarning)
1580
+ return cls.r_trim(*args)
1581
+
1582
+ @classmethod
1583
+ def r_trim(cls, *args):
1584
+ return cls.graph_traversal(None, None, Bytecode()).r_trim(*args)
1561
1585
 
1562
1586
  @classmethod
1563
1587
  def sack(cls, *args):
@@ -1751,7 +1775,7 @@ class Transaction:
1751
1775
  def rollback(self):
1752
1776
  with self.__mutex:
1753
1777
  # Verify transaction is open, close session and return result of transaction's rollback.
1754
- self.__verify_transaction_state(True, "Cannot commit a transaction that is not started.")
1778
+ self.__verify_transaction_state(True, "Cannot rollback a transaction that is not started.")
1755
1779
  return self.__close_session(self._session_based_connection.rollback())
1756
1780
 
1757
1781
  # Commits the current transaction.
@@ -2084,7 +2108,11 @@ def loops(*args):
2084
2108
 
2085
2109
 
2086
2110
  def ltrim(*args):
2087
- return __.ltrim(*args)
2111
+ return __.l_trim(*args)
2112
+
2113
+
2114
+ def l_trim(*args):
2115
+ return __.l_trim(*args)
2088
2116
 
2089
2117
 
2090
2118
  def map(*args):
@@ -2204,7 +2232,11 @@ def reverse(*args):
2204
2232
 
2205
2233
 
2206
2234
  def rTrim(*args):
2207
- return __.rTrim(*args)
2235
+ return __.r_trim(*args)
2236
+
2237
+
2238
+ def r_trim(*args):
2239
+ return __.r_trim(*args)
2208
2240
 
2209
2241
 
2210
2242
  def sack(*args):
@@ -2485,6 +2517,8 @@ statics.add_static('loops', loops)
2485
2517
 
2486
2518
  statics.add_static('ltrim', ltrim)
2487
2519
 
2520
+ statics.add_static('l_trim', l_trim)
2521
+
2488
2522
  statics.add_static('map', map)
2489
2523
 
2490
2524
  statics.add_static('match', match)
@@ -2545,6 +2579,8 @@ statics.add_static('reverse', reverse)
2545
2579
 
2546
2580
  statics.add_static('rTrim', rTrim)
2547
2581
 
2582
+ statics.add_static('r_trim', r_trim)
2583
+
2548
2584
  statics.add_static('sack', sack)
2549
2585
 
2550
2586
  statics.add_static('sample', sample)
@@ -214,9 +214,9 @@ statics.add_static('shuffle', Order.shuffle)
214
214
  statics.add_static('asc', Order.asc)
215
215
  statics.add_static('desc', Order.desc)
216
216
 
217
- Pick = Enum('Pick', ' any none')
217
+ Pick = Enum('Pick', ' any_ none')
218
218
 
219
- statics.add_static('any', Pick.any)
219
+ statics.add_static('any_', Pick.any_)
220
220
  statics.add_static('none', Pick.none)
221
221
 
222
222
  Pop = Enum('Pop', ' all_ first last mixed')
@@ -603,7 +603,9 @@ class EdgeIO(_GraphBinaryTypeIO):
603
603
  inv = Vertex(r.read_object(b), r.to_object(b, DataType.string, False))
604
604
  outv = Vertex(r.read_object(b), r.to_object(b, DataType.string, False))
605
605
  b.read(2)
606
- properties = r.read_object(b)
606
+ props = r.read_object(b)
607
+ # null properties are returned as empty lists
608
+ properties = [] if props is None else props
607
609
  edge = Edge(edgeid, outv, edgelbl, inv, properties)
608
610
  return edge
609
611
 
@@ -682,7 +684,12 @@ class VertexIO(_GraphBinaryTypeIO):
682
684
 
683
685
  @classmethod
684
686
  def _read_vertex(cls, b, r):
685
- vertex = Vertex(r.read_object(b), r.to_object(b, DataType.string, False), r.read_object(b))
687
+ vertex_id = r.read_object(b)
688
+ vertex_label = r.to_object(b, DataType.string, False)
689
+ props = r.read_object(b)
690
+ # null properties are returned as empty lists
691
+ properties = [] if props is None else props
692
+ vertex = Vertex(vertex_id, vertex_label, properties)
686
693
  return vertex
687
694
 
688
695
 
@@ -709,7 +716,9 @@ class VertexPropertyIO(_GraphBinaryTypeIO):
709
716
  def _read_vertexproperty(cls, b, r):
710
717
  vp = VertexProperty(r.read_object(b), r.to_object(b, DataType.string, False), r.read_object(b), None)
711
718
  b.read(2)
712
- vp.properties = r.read_object(b)
719
+ properties = r.read_object(b)
720
+ # null properties are returned as empty lists
721
+ vp.properties = [] if properties is None else properties
713
722
  return vp
714
723
 
715
724
 
@@ -30,7 +30,7 @@ from aenum import Enum
30
30
  from isodate import parse_duration, duration_isoformat
31
31
 
32
32
  from gremlin_python import statics
33
- from gremlin_python.statics import FloatType, FunctionType, IntType, LongType, TypeType, SingleByte, ByteBufferType, SingleChar
33
+ from gremlin_python.statics import FloatType, FunctionType, ShortType, IntType, LongType, TypeType, SingleByte, ByteBufferType, SingleChar
34
34
  from gremlin_python.process.traversal import Binding, Bytecode, P, TextP, Traversal, Traverser, TraversalStrategy
35
35
  from gremlin_python.structure.graph import Edge, Property, Vertex, VertexProperty, Path
36
36
  from gremlin_python.structure.io.util import SymbolUtil
@@ -498,6 +498,30 @@ class Int32IO(Int64IO):
498
498
  return GraphSONUtil.typed_value(cls.graphson_base_type, n)
499
499
 
500
500
 
501
+ class Int16IO(Int64IO):
502
+ python_type = ShortType
503
+ graphson_type = "gx:Int16"
504
+ graphson_base_type = "Int16"
505
+
506
+ @classmethod
507
+ def dictify(cls, n, writer):
508
+ # if we exceed Java int range then we need a long
509
+ if isinstance(n, bool):
510
+ return n
511
+ elif n < -9223372036854775808 or n > 9223372036854775807:
512
+ return GraphSONUtil.typed_value("BigInteger", str(n), "gx")
513
+ elif n < -2147483648 or n > 2147483647:
514
+ return GraphSONUtil.typed_value("Int64", n)
515
+ elif n < -32768 or n > 32767:
516
+ return GraphSONUtil.typed_value("Int32", n)
517
+ else:
518
+ return GraphSONUtil.typed_value(cls.graphson_base_type, n, "gx")
519
+
520
+ @classmethod
521
+ def objectify(cls, v, _):
522
+ return int.__new__(ShortType, v)
523
+
524
+
501
525
  class ByteIO(_NumberIO):
502
526
  python_type = SingleByte
503
527
  graphson_type = "gx:Byte"
@@ -29,7 +29,7 @@ from aenum import Enum
29
29
  from isodate import parse_duration, duration_isoformat
30
30
 
31
31
  from gremlin_python import statics
32
- from gremlin_python.statics import FloatType, FunctionType, IntType, LongType, TypeType, DictType, ListType, SetType, SingleByte, ByteBufferType, SingleChar
32
+ from gremlin_python.statics import FloatType, FunctionType, ShortType, IntType, LongType, TypeType, DictType, ListType, SetType, SingleByte, ByteBufferType, SingleChar
33
33
  from gremlin_python.process.traversal import Binding, Bytecode, Direction, P, TextP, Traversal, Traverser, TraversalStrategy, T
34
34
  from gremlin_python.structure.graph import Edge, Property, Vertex, VertexProperty, Path
35
35
  from gremlin_python.structure.io.util import HashableDict, SymbolUtil
@@ -597,6 +597,31 @@ class Int32IO(Int64IO):
597
597
  else:
598
598
  return GraphSONUtil.typed_value(cls.graphson_base_type, n)
599
599
 
600
+
601
+ class Int16IO(Int64IO):
602
+ python_type = ShortType
603
+ graphson_type = "gx:Int16"
604
+ graphson_base_type = "Int16"
605
+
606
+ @classmethod
607
+ def dictify(cls, n, writer):
608
+ # if we exceed Java int range then we need a long
609
+ if isinstance(n, bool):
610
+ return n
611
+ elif n < -9223372036854775808 or n > 9223372036854775807:
612
+ return GraphSONUtil.typed_value("BigInteger", str(n), "gx")
613
+ elif n < -2147483648 or n > 2147483647:
614
+ return GraphSONUtil.typed_value("Int64", n)
615
+ elif n < -32768 or n > 32767:
616
+ return GraphSONUtil.typed_value("Int32", n)
617
+ else:
618
+ return GraphSONUtil.typed_value(cls.graphson_base_type, n, "gx")
619
+
620
+ @classmethod
621
+ def objectify(cls, v, _):
622
+ return int.__new__(ShortType, v)
623
+
624
+
600
625
  class ByteIO(_NumberIO):
601
626
  python_type = SingleByte
602
627
  graphson_type = "gx:Byte"
@@ -1,14 +1,17 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gremlinpython
3
- Version: 3.7.1
3
+ Version: 3.7.3
4
4
  Summary: Gremlin-Python for Apache TinkerPop
5
- Home-page: http://tinkerpop.apache.org
5
+ Home-page: https://tinkerpop.apache.org
6
+ Maintainer: Apache TinkerPop
7
+ Maintainer-email: dev@tinkerpop.apache.org
6
8
  License: Apache 2
7
9
  Platform: UNKNOWN
8
10
  Classifier: Intended Audience :: Developers
9
11
  Classifier: License :: OSI Approved :: Apache Software License
10
12
  Classifier: Natural Language :: English
11
13
  Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.9
12
15
  Description-Content-Type: text/x-rst
13
16
  Provides-Extra: kerberos
14
17
  Provides-Extra: ujson
@@ -1,8 +1,8 @@
1
1
  nest_asyncio
2
2
  aiohttp<4.0.0,>=3.8.0
3
3
  aenum<4.0.0,>=1.4.5
4
- six<2.0.0,>=1.10.0
5
4
  isodate<1.0.0,>=0.6.0
5
+ async-timeout<5.0.0,>=4.0.3
6
6
 
7
7
  [kerberos]
8
8
  kerberos<2.0.0,>=1.3.0
@@ -1,6 +1,3 @@
1
- [bdist_wheel]
2
- universal = 1
3
-
4
1
  [aliases]
5
2
  test = pytest
6
3
 
@@ -18,7 +18,6 @@ under the License.
18
18
  """
19
19
  import codecs
20
20
  import os
21
- import sys
22
21
  import time
23
22
  from setuptools import setup
24
23
 
@@ -48,13 +47,10 @@ install_requires = [
48
47
  'nest_asyncio',
49
48
  'aiohttp>=3.8.0,<4.0.0',
50
49
  'aenum>=1.4.5,<4.0.0',
51
- 'six>=1.10.0,<2.0.0',
52
- 'isodate>=0.6.0,<1.0.0'
50
+ 'isodate>=0.6.0,<1.0.0',
51
+ 'async-timeout>=4.0.3,<5.0.0'
53
52
  ]
54
53
 
55
- if sys.version_info < (3, 5):
56
- install_requires += ['pyparsing>=2.4.7,<3.0.0']
57
-
58
54
  setup(
59
55
  name='gremlinpython',
60
56
  version=version,
@@ -62,8 +58,10 @@ setup(
62
58
  'gremlin_python.driver.aiohttp', 'gremlin_python.process',
63
59
  'gremlin_python.structure', 'gremlin_python.structure.io'],
64
60
  license='Apache 2',
65
- url='http://tinkerpop.apache.org',
61
+ url='https://tinkerpop.apache.org',
66
62
  description='Gremlin-Python for Apache TinkerPop',
63
+ maintainer='Apache TinkerPop',
64
+ maintainer_email='dev@tinkerpop.apache.org',
67
65
  long_description=codecs.open("README.rst", "r", "UTF-8").read(),
68
66
  long_description_content_type='text/x-rst',
69
67
  test_suite="tests",
@@ -74,7 +72,6 @@ setup(
74
72
  ],
75
73
  tests_require=[
76
74
  'pytest>=4.6.4,<7.2.0',
77
- 'mock>=3.0.5,<5.0.0',
78
75
  'radish-bdd==0.13.4',
79
76
  'PyHamcrest>=1.9.0,<3.0.0',
80
77
  'PyYAML>=5.3'
@@ -89,5 +86,6 @@ setup(
89
86
  "License :: OSI Approved :: Apache Software License",
90
87
  "Natural Language :: English",
91
88
  "Programming Language :: Python :: 3"
92
- ]
89
+ ],
90
+ python_requires='>=3.9'
93
91
  )
@@ -1,5 +0,0 @@
1
- Apache TinkerPop
2
- Copyright 2015-2023 The Apache Software Foundation.
3
-
4
- This product includes software developed at
5
- The Apache Software Foundation (http://www.apache.org/).
File without changes
File without changes
File without changes