aiogremlin.remote.driver_remote_connection   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 13
eloc 59
dl 0
loc 105
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A DriverRemoteConnection.__aenter__() 0 2 1
A DriverRemoteConnection.__init__() 0 4 1
A DriverRemoteConnection.using() 0 13 1
A DriverRemoteConnection.client() 0 3 1
A DriverRemoteConnection.__aexit__() 0 4 1
A DriverRemoteConnection.open() 0 30 4
A DriverRemoteConnection.config() 0 3 1
A DriverRemoteConnection.close() 0 7 2
A DriverRemoteConnection.submit() 0 6 1
1
import asyncio
2
from urllib.parse import urlparse
3
4
from aiogremlin.driver.cluster import Cluster
5
from gremlin_python.driver import serializer
6
from aiogremlin.remote.driver_remote_side_effects import (
7
    AsyncRemoteTraversalSideEffects)
8
from gremlin_python.driver.remote_connection import RemoteTraversal
9
10
11
__author__ = 'David M. Brown ([email protected])'
12
13
14
class DriverRemoteConnection:
15
    """
16
    Remote connection to a Gremlin Server. Do not instantiate directly,
17
    instead use :py:meth:`DriverRemoteConnection.open` or
18
    :py:meth:`DriverRemoteConnection.using`
19
20
    :param aiogremlin.driver.client.Client client:
21
    :param asyncio.BaseEventLoop loop:
22
    :param aiogremlin.driver.cluster.Cluster cluster:
23
    """
24
25
    def __init__(self, client, loop, *, cluster=None):
26
        self._client = client
27
        self._loop = loop
28
        self._cluster = cluster
29
30
    @property
31
    def client(self):
32
        return self._client
33
34
    @property
35
    def config(self):
36
        return self._cluster.config
37
38
    @classmethod
39
    async def using(cls, cluster, aliases=None):
40
        """
41
        Create a :py:class:`DriverRemoteConnection` using a specific
42
        :py:class:`Cluster<aiogremlin.driver.cluster.Cluster>`
43
44
        :param aiogremlin.driver.cluster.Cluster cluster:
45
        :param dict aliases: Optional mapping for aliases. Default is `None`.
46
            Also accepts `str` argument which will be assigned to `g`
47
        """
48
        client = await cluster.connect(aliases=aliases)
49
        loop = cluster._loop
50
        return cls(client, loop)
51
52
    @classmethod
53
    async def open(cls, url=None, aliases=None, loop=None, *,
54
                   graphson_reader=None, graphson_writer=None, **config):
55
        """
56
        :param str url: Optional url for host Gremlin Server
57
58
        :param dict aliases: Optional mapping for aliases. Default is `None`.
59
            Also accepts `str` argument which will be assigned to `g`
60
        :param asyncio.BaseEventLoop loop:
61
        :param graphson_reader: Custom graphson_reader
62
        :param graphson_writer: Custom graphson_writer
63
        :param config: Optional cluster configuration passed as kwargs or `dict`
64
        """
65
        if url:
66
            parsed_url = urlparse(url)
67
            config.update({
68
                'scheme': parsed_url.scheme,
69
                'hosts': [parsed_url.hostname],
70
                'port': parsed_url.port})
71
        if isinstance(aliases, str):
72
            aliases = {'g': aliases}
73
        if not loop:
74
            loop = asyncio.get_event_loop()
75
        message_serializer = serializer.GraphSONMessageSerializer(
76
            reader=graphson_reader,
77
            writer=graphson_writer)
78
        config.update({'message_serializer': message_serializer})
79
        cluster = await Cluster.open(loop, aliases=aliases, **config)
80
        client = await cluster.connect()
81
        return cls(client, loop, cluster=cluster)
82
83
    async def close(self):
84
        """
85
        Close underlying cluster if applicable. If created with
86
        :py:meth:`DriverRemoteConnection.using`, cluster is NOT closed.
87
        """
88
        if self._cluster:
89
            await self._cluster.close()
90
91
    async def submit(self, bytecode):
92
        """Submit bytecode to the Gremlin Server"""
93
        result_set = await self._client.submit(bytecode)
94
        side_effects = AsyncRemoteTraversalSideEffects(result_set.request_id,
95
                                                  self._client)
96
        return RemoteTraversal(result_set, side_effects)
97
98
    async def __aenter__(self):
99
        return self
100
101
    async def __aexit__(self, exc_type, exc, tb):
102
        await self.close()
103
        self._client = None
104
        self._cluster = None
105