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

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
27
```python
>>> import asyncio
>>> from aiogremlin import GremlinClient
```

The Gremlin Server responds with messages in chunks, `GremlinClient.submit` submits a script to the server, and returns a `GremlinResponse` object. This object provides two methods: `get` and `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)
davebshow's avatar
davebshow committed
33
34
35
36
37
38
39
40

# Use get.
>>> @asyncio.coroutine
... def get(gc):
...     resp = yield from gc.submit("x + x", bindings={"x": 4})
...     result = yield from resp.get()
...     return result
>>> result = loop.run_until_complete(get(gc))
davebshow's avatar
davebshow committed
41
>>> result
davebshow's avatar
davebshow committed
42
[Message(status_code=200, data=[8], message={}, metadata='')]
davebshow's avatar
davebshow committed
43
44
45
>>> resp = result[0]
>>> resp.status_code
200
davebshow's avatar
davebshow committed
46
47
48
>>> resp  # Named tuple.
Message(status_code=200, data=[8], message={}, metadata='')
>>> loop.run_until_complete(gc.close())  # Explicitly close client!!!
davebshow's avatar
davebshow committed
49
>>> loop.close()
davebshow's avatar
davebshow committed
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

# 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='')
```

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
73
```