README.md 3.35 KB
Newer Older
davebshow's avatar
davebshow committed
1
# aiogremlin 0.0.6 [(gizmo grew up)](https://pypi.python.org/pypi/gizmo/0.1.12)
davebshow's avatar
davebshow committed
2

davebshow's avatar
davebshow committed
3
`aiogremlin` is a **Python 3** driver for the the [Tinkerpop 3 Gremlin Server](http://www.tinkerpop.com/docs/3.0.0.M7/#gremlin-server). This module is built on [Asyncio](https://docs.python.org/3/library/asyncio.html). By default it uses the [aiohttp](http://aiohttp.readthedocs.org/en/v0.15.3/index.html) websocket client , but it is easy to plug in a different implementation. `aiogremlin` is currently in **alpha** mode, but all major functionality has test coverage.
davebshow's avatar
davebshow committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

## Getting started

Since Python 3.4 is not the default version on many systems, it's nice to create a virtualenv that uses Python 3.4 by default. Then use pip to install `aiogremlin`. Using virtualenvwrapper on Ubuntu 14.04:

```bash
$ mkvirtualenv -p /usr/bin/python3.4 aiogremlin
$ pip install aiogremlin
```

Fire up the Gremlin Server:

```bash
$ ./bin/gremlin-server.sh
```

davebshow's avatar
davebshow committed
20
The `GremlinClient` communicates asynchronously with the Gremlin Server using websockets. The majority of `GremlinClient` methods are an `asyncio.coroutine`, so you will also need to use `asyncio`:
davebshow's avatar
davebshow committed
21

davebshow's avatar
davebshow committed
22
23
24
25
26
```python
>>> import asyncio
>>> from aiogremlin import GremlinClient
```

davebshow's avatar
davebshow committed
27
The Gremlin Server responds with messages in chunks, `GremlinClient.submit` submits a script to the server, and returns a `GremlinResponse` object. This object provides the methods: `get` and the property `stream`. `get` collects all of the response messages and returns them as a Python list. `stream` returns an object of the type `GremlinResponseStream` that implements a method `read`. This allows you to read the response without loading all of the messages into memory.
davebshow's avatar
davebshow committed
28
29
30
31
32


```python
>>> loop = asyncio.get_event_loop()
>>> gc = GremlinClient('ws://localhost:8182/', loop=loop)
33
# Or even better, use the constructor function. This will init pool connections.
davebshow's avatar
davebshow committed
34
35
36
37
# ***Must be done inside a coroutine***
>>> gc = yield from create_client('ws://localhost:8182/', loop=loop)
# Or outside of a coroutine using the loop to help
>>> gc = loop.run_until_complete(create_client(loop=loop))
davebshow's avatar
davebshow committed
38
39
40
41
42
43
44

# Use get.
>>> @asyncio.coroutine
... def get(gc):
...     resp = yield from gc.submit("x + x", bindings={"x": 4})
...     result = yield from resp.get()
...     return result
45

davebshow's avatar
davebshow committed
46
>>> result = loop.run_until_complete(get(gc))
davebshow's avatar
davebshow committed
47
>>> result
davebshow's avatar
davebshow committed
48
[Message(status_code=200, data=[8], message={}, metadata='')]
49

davebshow's avatar
davebshow committed
50
51
52
>>> resp = result[0]
>>> resp.status_code
200
53

davebshow's avatar
davebshow committed
54
55
56
57
58
59
60
61
62
63
64
65
66
67
>>> resp  # Named tuple.
Message(status_code=200, data=[8], message={}, metadata='')

# Use stream.
>>> @asyncio.coroutine
... def stream(gc):
...     resp = yield from gc.submit("x + x", bindings={"x": 1})
...     while True:
...         result = yield from resp.stream.read()
...         if result is None:
...             break
...         print(result)
>>> loop.run_until_complete(stream(gc))
Message(status_code=200, data=[2], message={}, metadata='')
68
69
70

>>> loop.run_until_complete(gc.close())  # Explicitly close client!!!
>>> loop.close()
davebshow's avatar
davebshow committed
71
72
73
74
75
76
77
78
79
80
81
```

For convenience, `aiogremlin` also provides a method `execute`, which is equivalent to calling  `yield from submit()` and then `yield from get()` in the same coroutine.

```python
>>> loop = asyncio.get_event_loop()
>>> gc = GremlinClient('ws://localhost:8182/', loop=loop)
>>> execute = gc.execute("x + x", bindings={"x": 4})
>>> result = loop.run_until_complete(execute)
>>> result
[Message(status_code=200, data=[8], message={}, metadata='')]
davebshow's avatar
davebshow committed
82
```