Code Monkey home page Code Monkey logo

tarantool-python's Introduction

Python driver for Tarantool

https://github.com/tarantool/tarantool-python/actions/workflows/testing.yml/badge.svg?branch=master https://github.com/tarantool/tarantool-python/actions/workflows/packing.yml/badge.svg?branch=master

This package is a pure-python client library for Tarantool.

Documentation | Downloads | PyPI | GitHub | Issue tracker

Download and install

With pip (recommended)

The recommended way to install the tarantool package is using pip.

$ pip3 install tarantool

With dnf

You can install python3-tarantool RPM package if you use Fedora (34, 35, 36).

Add the repository

$ curl -L https://tarantool.io/OtKysgx/release/2/installer.sh | bash

and then install the package

$ dnf install -y python3-tarantool

With apt

You can install python3-tarantool deb package if you use Debian (10, 11) or Ubuntu (20.04, 22.04).

Add the repository

$ curl -L https://tarantool.io/OtKysgx/release/2/installer.sh | bash

and then install the package

$ apt install -y python3-tarantool

ZIP archive

You can also download zip archive, unpack it and run:

$ make install

Development version

You can also install the development version of the package using pip.

$ pip3 install git+https://github.com/tarantool/tarantool-python.git@master

What is Tarantool?

Tarantool is an in-memory computing platform originally designed by VK and released under the terms of BSD license.

Features

  • ANSI SQL, including views, joins, referential and check constraints
  • Lua packages for non-blocking I/O, fibers, and HTTP
  • MessagePack data format and MessagePack-based client-server protocol
  • Two data engines:
    • memtx โ€“ in-memory storage engine with optional persistence
    • vinyl โ€“ on-disk storage engine to use with larger data sets
  • Secondary key and index iterator support (can be non-unique and composite)
  • Multiple index types: HASH, BITSET, TREE, RTREE
  • Asynchronous master-master replication
  • Authentication and access control

See More

NOTE

This driver is synchronous, so connection mustn't be shared between threads/processes.

If you're looking for an asynchronous Python driver based on asyncio, consider using asynctnt . See also the feature comparison table.

Run tests

On Linux:

$ make test

On Windows:

  • Setup a Linux machine with Tarantool installed. This machine will be referred to as remote in this instruction.
  • (On remote) Copy test/suites/lib/tarantool_python_ci.lua to /etc/tarantool/instances.available.
  • (On remote) Run tarantoolctl start tarantool_python_ci.
  • Set the following environment variables: * REMOTE_TARANTOOL_HOST=..., * REMOTE_TARANTOOL_CONSOLE_PORT=3302.
  • Run make test.

Build docs

To build documentation, first you must install its build requirements:

$ pip3 install -r docs/requirements.txt

Then run

$ make docs

You may host local documentation server with

$ python3 -m http.server --directory build/sphinx/html

Open localhost:8000 in your browser to read the docs.

License

BSD-2-Clause. See the LICENSE file.

tarantool-python's People

Contributors

amdrozdov avatar artembo avatar askalt avatar avtikhon avatar bekhzod91 avatar bigbes avatar coxx avatar curiousgeorgiy avatar denis-ignatenko avatar differentialorange avatar funny-falcon avatar grishnov avatar kbelyavs avatar kostja avatar ligurio avatar mejedi avatar monolithed avatar nshy avatar oleg-jukovec avatar olegrok avatar rtsisyk avatar runsfor avatar shveenkov avatar totktonada avatar unera avatar vemel avatar vmarunov avatar xhaskx avatar ylobankov avatar zimnukhov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tarantool-python's Issues

conn.update() is broken

From OPENTAR-33 in Mail.Ru JIRA.
version from github:

>>> import tarantool
>>> tnt=tarantool.connect('127.0.0.1', 33213)
>>> tnt.update(0, 'foo', [(1, '=', 200)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/mru-mpnc/env/lib/python2.7/site-packages/tarantool/connection.py", line 276, in update
    request = RequestUpdate(space_name, key, op_list, return_tuple)
TypeError: __init__() takes exactly 6 arguments (5 given)

version from pip install: OK

Support dict output

Need add support as dict output as MySQLdb.connect('localhost', 'user','password').cursor(MySQLdb.cursors.DictCursor) based on schema. For example:

>>> import tarantool
>>> schema = {
        0: { # Space description
            'name': 'users', # Space name
            'default_type': tarantool.STR, # Type that used to decode fields that are not listed below
            'fields': {
                0: ('numfield', tarantool.NUM), # (field name, field type)
                1: ('num64field', tarantool.NUM64),
                2: ('strfield', tarantool.STR),
                #2: { 'name': 'strfield', 'type': tarantool.STR }, # Alternative syntax
                #2: tarantool.STR # Alternative syntax
            },
            'indexes': {
                0: ('pk', [0]), # (name, [field_no])
                #0: { 'name': 'pk', 'fields': [0]}, # Alternative syntax
                #0: [0], # Alternative syntax
            }
        }
    }
>>> connection = tarantool.connect(host = 'localhost', port=33013, schema = schema)
>>> demo = connection.space('users', tarantool.cursors.DictCursor) # I don't know best way. It only use at example.
>>> demo.insert((0, 12, u'this is unicode string'))
>>> demo.select(0)
[{'numfiedl': 0, 'num64field':12, 'strfield': u'this is unicode string'}]

Missed yaml module

Errror:

ImportError: No module named 'yaml'

requirements.txt should contain: PyYAML module.

Server crashes when calling a stored function

Server crashes when calling a stored function from python client.
But it's not crashes when calling a function from the command line client. It seems RequestCall forms some "packet of death" and python client has a defect (as well as the server).

socket.error after tarantool restart

I'm using tarantool 1.5 with stable branch (0.3.6 version) of python driver.
After tarantool restart I got Connection reset by peer error in line https://github.com/tarantool/tarantool-python/blob/stable/src/tarantool/connection.py#L150 and Broken pipe in line https://github.com/tarantool/tarantool-python/blob/stable/src/tarantool/connection.py#L172
Reconnect with connection.connect() helps, but it's better to fix in driver.
Tried to do it by myself but I'm confused with libc magic and self._recv https://github.com/tarantool/tarantool-python/blob/stable/src/tarantool/connection.py#L189 which always is None

Implement named indexes

It is possible to pass a list (or mapping) of index names when creating Space instance.
In this case in Space.select() the index can be specified by its name.

>>> user = server.space(0, named_index={"username":1})
>>> user.select("root", index="username")

Implement exceptions as Connection class attributes

PEP-0249 proposing to implement exceptions as attributes of Connection class:

All exception classes defined by the DB API standard should be
exposed on the Connection objects as attributes (in addition
to being available at module scope).

These attributes simplify error handling in multi-connection
environments.

DatabaseError: (55, "Read access denied for user 'guest' to space '_space'")

ะ”ะฐะฒะฝะพ ะฝะต ะธัะฟะพะปัŒะทะพะฒะฐะป, ั€ะตัˆะธะป ะฟะพะดะบะปัŽั‡ะธั‚ัŒ, ะธ ะฝะต ะฟะพะปัƒั‡ะธะปะพััŒ.
ะžัˆะธะฑะบะฐ ะฒั‹ะฒะฐะปะธะฒะฐะตั‚ัั ะฟั€ะธ ัั‚ะฐะฝะดะฐั€ั‚ะฝะพะผ ะธ ั€ะฐะฝะตะต (ะฝะฐ ะตั‰ะต ะฟะตั€ะฒั‹ั… ะฒะตั€ัะธัั…) ั€ะฐะฑะพั‚ะฐะฒัˆะตะผ ะฟั€ะธะผะตั€ะต:

import tarantool
server = tarantool.Connection("localhost", 3301)
server.space('myspace')

ะ˜ ั‚ะพะณะดะฐ ะฒั‹ะฒะฐะปะธะฒะฐะตั‚ัั ะพัˆะธะฑะบะฐ. ะ’ ะฐะดะผะธะฝ ะบะพะฝัะพะปะธ ะฒัะต ะฝะพั€ะผะฐะปัŒะฝะพ. ะ˜ ะฝัƒะถะฝะพะต ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะพ ะธ _space ะฝะฐั…ะพะดัั‚ัั ะธ ะพั‚ะพะฑั€ะฐะถะฐัŽั‚ัั.

unexpected keyword argument 'return_tuple'

#!/usr/bin/env python

import sys
sys.path.append("./lib/tarantool-python/src")

import tarantool
server = tarantool.connect("localhost", 33013)
server.space(0).select(0)
roman@work:/data/work/tarantool/master/test$ ./test.py 
Traceback (most recent call last):
  File "./test.py", line 7, in <module>
    server = tarantool.connect("localhost", 33013)
  File "./lib/tarantool-python/src/tarantool/__init__.py", line 50, in connect
    return_tuple=return_tuple)
TypeError: __init__() got an unexpected keyword argument 'return_tuple'

Reconnect on each request

I noticed that my test program reconnects on each request. Debugging and code analysis reveals this code in connection.py as the culprit:

205             def check():  # Check that connection is alive
206                 buf = ctypes.create_string_buffer(2)
207                 self._sys_recv(self._socket.fileno(), buf, 1,
208                         socket.MSG_DONTWAIT | socket.MSG_PEEK)
209  ->             if ctypes.get_errno() == errno.EAGAIN:
210                     ctypes.set_errno(0)
211                     return errno.EAGAIN
212                 return (ctypes.get_errno() if ctypes.get_errno()
213                         else errno.ECONNRESET)

self._sys_recv() always returns EFAULT (Bad address) for me, so connection is always considered dead. I'm not a Python expert, but could it be a bug in the way _sys_recv() is defined/used?

Request size is encoded as variable-length MP_UINT

The protocol specification at http://tarantool.org/doc/box-protocol.html mandates a fixed 5-byte MP_UINT value for the BODY + HEADER SIZE field in a message header. That's how responses are encoded by the Tarantool server and requests are encoded by other drivers (I checked tarantool-php).

tarantool-python, however, encodes this field as a variable-length MP_UINT, so it can take 1 to 5 bytes, depending on the request size. The server handles it correctly, it does not enforce the fixed 5-byte field length and accepts an arbitrary MP_UINT. tarantool-python expects a fixed 5-byte field in responses (from Connection._read_response):

        # Read packet length
        length = msgpack.unpackb(self._recv(5))
        # Read the packet
        return self._recv(length)

Even though it works when talking to the server (because it always replies with a fixed 5-bytes size values), it's still a violation of the protocol spec. For example, if a proxy wants to reply to a PING request by echoing PING packet data in response (which would be correct assuming clients encode PING requests correctly), tarantool-python does not accept such a response. In other words, it sends garbage out, but expects valid replies back in.

CALL method doesn't work at branch msgpack

Example of call:

In [6]: server.call("test", ())
Out[6]: ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-51d1248d1373> in <module>()
----> 1 server.call("test", ())

/home/zloidemon/virtual/venv/local/lib/python2.7/site-packages/IPython/core/displayhook.pyc in __call__(self, result)
    245             self.start_displayhook()
    246             self.write_output_prompt()
--> 247             format_dict, md_dict = self.compute_format_data(result)
    248             self.write_format_data(format_dict, md_dict)
    249             self.update_user_ns(result)

/home/zloidemon/virtual/venv/local/lib/python2.7/site-packages/IPython/core/displayhook.pyc in compute_format_data(self, result)
    155
    156         """
--> 157         return self.shell.display_formatter.format(result)
    158
    159     def write_format_data(self, format_dict, md_dict=None):

/home/zloidemon/virtual/venv/local/lib/python2.7/site-packages/IPython/core/formatters.pyc in format(self, obj, include, exclude)
    150             md = None
    151             try:
--> 152                 data = formatter(obj)
    153             except:
    154                 # FIXME: log the exception

/home/zloidemon/virtual/venv/local/lib/python2.7/site-packages/IPython/core/formatters.pyc in __call__(self, obj)
    479                 type_pprinters=self.type_printers,
    480                 deferred_pprinters=self.deferred_printers)
--> 481             printer.pretty(obj)
    482             printer.flush()
    483             return stream.getvalue()

/home/zloidemon/virtual/venv/local/lib/python2.7/site-packages/IPython/lib/pretty.pyc in pretty(self, obj)
    345                 if cls in self.type_pprinters:
    346                     # printer registered in self.type_pprinters
--> 347                     return self.type_pprinters[cls](obj, self, cycle)
    348                 else:
    349                     # deferred printer

/home/zloidemon/virtual/venv/local/lib/python2.7/site-packages/IPython/lib/pretty.pyc in inner(obj, p, cycle)
    519         if basetype is not None and typ is not basetype and typ.__repr__ != basetype.__repr__:
    520             # If the subclass provides its own repr, use it instead.
--> 521             return p.text(typ.__repr__(obj))
    522
    523         if cycle:

/home/zloidemon/virtual/tarantool-python/src/tarantool/response.py in __repr__(self)
    138         # If there was an SELECT request - return list representation even it
    139         # is empty
--> 140         if(self._request_type == REQUEST_TYPE_SELECT or len(self)):
    141             return super(Response, self).__repr__()
    142

AttributeError: 'Response' object has no attribute '_request_type'

Add tarantool-python to Tarantool buildbot

  • Write RPM specs/DEB rules and push they to the repository. Please use package name that confirms official distributive naming conventions (e.g. tarantool-python or python-tarantool)
  • Add this project to build bot (http://build.tarantool.org/)
  • Check that module build and can be installed from tarantool.org repository

Dont work on windows

OS - Microsoft Windows Server 2012 Standard
Python - 2.7

>>import tarantool

Traceback (most recent call last):
  File "C:\LogsParser\parser.py", line 1, in <module>
    import tarantool
  File "C:\Python27\lib\site-packages\tarantool\__init__.py", line 6, in <module>
    from tarantool.connection import Connection
  File "C:\Python27\lib\site-packages\tarantool\connection.py", line 50, in <module>
    class Connection(object):
  File "C:\Python27\lib\site-packages\tarantool\connection.py", line 63, in Connection
    use_errno=True)(_libc.recv)
  File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'recv' not found

Python3 doesn't work

Error:

    class Error(StandardError):
NameError: name 'StandardError' is not defined

I found already committed patch to sources with fixed issue. Would you like bump version and upload to pypi latest version?

Connector requires weird CALL permission to fetch space schema

Traceback (most recent call last):
  File "./test.py", line 5, in <module>
    server.space(256).select()
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 430, in space
    return Space(self, space_name)
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/space.py", line 27, in __init__
    self.space_no = self.connection.schema.get_space(space_name).sid
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/schema.py", line 74, in get_space
    space)
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 250, in call
    response = self._send_request(request)
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 225, in _send_request
    request)
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 169, in _send_request_wo_reconnect
    response = Response(self, self._read_response())
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/response.py", line 60, in __init__
    raise DatabaseError(self._return_code, self._return_message)
tarantool.error.DatabaseError: (53, "Execute access denied for user 'guest' to function 'box.space._space.index.primary:s'")

PyPi issues

pip install 0.3.0 version of python tarantool connector while it have to install 0.3.2

$ pip install tarantool
Downloading/unpacking tarantool
  Downloading tarantool-0.3.0.zip
  Running setup.py egg_info for package tarantool

Installing collected packages: tarantool
  Running setup.py install for tarantool

Successfully installed tarantool

ะะฐั€ัƒัˆะตะฝะธะต ะพะฑั€ะฐั‚ะฝะพะน ัะพะฒะผะตัั‚ะธะผะพัั‚ะธ ะผะตะถะดัƒ 0.3.1 ะธ 0.3

ะŸั€ะพะฟะฐะป ะฟะฐั€ะฐะผะตั‚ั€ field_types ัƒ ะผะตั‚ะพะดะพะฒ ะพะฑัŠะตะบั‚ะพะฒ ัะพะตะดะธะฝะตะฝะธั ะธ ัะฟะตะนัะฐ. ะะฐะฟั€ะธะผะตั€, ัƒ select.

Implement select_range() method

It would be cool to have

>>> space.select_range(<key>, <limit>, <index_no>)

instead of

>>> server.call("box.select_range",  (<space_no>, <index_no>, <limit>, <key>))

return_tuple in conn.insert/replace/store does not work

Please add return to conn.insert, conn.replace and conn.store

    def replace(self, space_name, values, return_tuple=None):
..
        -->> return self._insert(space_name, values, (
            BOX_RETURN_TUPLE if return_tuple else 0) | BOX_REPLACE)

Test are broken on Tarantool 1.6

test/lib/tarantool-python$ ./setup.py test
Traceback (most recent call last):
  File "/data/work/tarantool/master/test/lib/tarantool-python/tests/suites/test_dml.py", line 119, in test_07_call
    self.assertEqual(self.con.call('box.cjson.decode', '[123, 234, 345]'), [(123, 234, 345)])
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 275, in call
    response = self._send_request(request)
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 250, in _send_request
    request)
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/connection.py", line 182, in _send_request_wo_reconnect
    response = Response(self, self._read_response())
  File "/data/work/tarantool/master/test/lib/tarantool-python/tarantool/response.py", line 67, in __init__
    raise DatabaseError(self._return_code, self._return_message)
DatabaseError: (8450, "Procedure 'box.cjson.decode' is not defined")

Wrong exception if slab arena is full

tarantool log:

2014-10-07 16:52:38.883 [16796] 102/iproto salloc.cc:378 E> ER_MEMORY_ISSUE: Failed to allocate 38 bytes in slab allocator for tuple
2014-10-07 16:52:42.351 [16796] 102/iproto salloc.cc:378 E> ER_MEMORY_ISSUE: Failed to allocate 38 bytes in slab allocator for tuple

traceback:

Traceback (most recent call last):
  File "load.py", line 23, in <module>
    r.save(validate=True)
  File "/home/sergeyorlov/work/tarantism/tarantism/model.py", line 74, in save
    self.insert(data)
  File "/home/sergeyorlov/work/tarantism/tarantism/model.py", line 81, in insert
    return self.get_space().insert(values)
  File "/home/sergeyorlov/.virtualenvs/tarantism/local/lib/python2.7/site-packages/tarantool/space.py", line 89, in insert
    BOX_RETURN_TUPLE if return_tuple else 0) | BOX_ADD)
  File "/home/sergeyorlov/.virtualenvs/tarantism/local/lib/python2.7/site-packages/tarantool/connection.py", line 278, in _insert
    return self._send_request(request, space_name)
  File "/home/sergeyorlov/.virtualenvs/tarantism/local/lib/python2.7/site-packages/tarantool/connection.py", line 227, in _send_request
    request, space_name, field_defs, default_type)
  File "/home/sergeyorlov/.virtualenvs/tarantism/local/lib/python2.7/site-packages/tarantool/connection.py", line 169, in _send_request_wo_reconnect
    self, header, body, space_name, field_defs, default_type)
  File "/home/sergeyorlov/.virtualenvs/tarantism/local/lib/python2.7/site-packages/tarantool/response.py", line 138, in __init__
    self._unpack_body(body)
  File "/home/sergeyorlov/.virtualenvs/tarantism/local/lib/python2.7/site-packages/tarantool/response.py", line 237, in _unpack_body
    "<%ds" % (tuple_size), buff, offset + 4)[0]
struct.error: unpack_from requires a buffer of at least 1948279913 bytes

must be DatabaseError

Authentication is not documented

Authentication support is not documented in the manual, though it is supported and tested in the test suite (test_dml.py):

    def test_00_00_authenticate(self):
        self.assertIsNone(self.srv.admin("box.schema.user.create('test', { password = 'test' })"))
        self.assertIsNone(self.srv.admin("box.schema.user.grant('test', 'execute,read,write', 'universe')"))
        self.assertEqual(self.con.authenticate('test', 'test'), [])

soft automatic schema reload

Now that the iproto protocol has sc_schema_id, fix the driver to perform "soft" schema reload.

  • load the current schema automatically when connection is established
  • include sc_schema_id in queries
  • if the response is ER_SCHEMA_CHANGED, reload the schema and re-issue the query.

tarantool/tarantool#1183

Incomplete list of supported Space.update() operations in the manual

The manual says:

The following update operations are supported by Tarantool:
    โ€ข ``'='`` โ€“ assign new value to the field
    โ€ข ``'+'`` โ€“ add argument to the field (*both arguments are treated as signed 32-bit ints*)
    โ€ข ``'^'`` โ€“ bitwise AND (*only for 32-bit integers*)
    โ€ข ``'|'`` โ€“ bitwise XOR (*only for 32-bit integers*)
    โ€ข ``'&'`` โ€“ bitwise OR  (*only for 32-bit integers*)
    โ€ข ``'splice'`` โ€“ implementation of `Perl splice <http://perldoc.perl.org/functions/splice.html>`_ function

The above is missing the following supported operations: '-' (subtraction), '#' (delete) and '!' (insert).

ะ’ ะดะพะบะต ะฝะฐะดะพ ะฟะพะฟั€ะฐะฒะธั‚ัŒ ั€ะฐะทะดะตะป Inserting and replacing records

ะขะฐะผ ะฝะฐะฟะธัะฐะฝะพ, ั‡ั‚ะพ Insert ะทะฐะผะตั‰ะฐะตั‚ ััƒั‰ะตัั‚ะฒัƒัŽั‰ะธะน ัะปะตะผะตะฝั‚, ะฐ ะฟั€ะพ Replace ะฝะธั‡ะตะณะพ ะฝะต ัะบะฐะทะฐะฝะพ. ะŸั€ะธ ัั‚ะพะผ Insert ั€ัƒะณะฐะตั‚ัั ะฝะฐ ะดัƒะฑะปะธ. ะ Replace ะพั‚ั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ ะบะฐะบ ั€ะฐะท ั‚ะฐะบ, ะบะฐะบ ะฝะฐะฟะธัะฐะฝะพ ะฒ ั€ะฐะทะดะตะปะต.
http://pythonhosted.org//tarantool/guide.en.html#inserting-and-replacing-records

Wrong Space.update() examples in the manual

All Space.update() examples in the manual use the following syntax:

Space.update(key, [(fieldno, op, value)])

However, the actual syntax expected by the driver is:

Space.update(key, [(op, fieldno, value)])

Reconnect loop is recursive

box/call.test.py                                Traceback (most recent call last):
  File "/data/work/tarantool/lua-modularization/test/lib/test.py", line 111, in run
    self.execute(server)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool_server.py", line 107, in execute
    execfile(self.name, dict(locals(), **server.__dict__))
  File "box/call.test.py", line 6, in <module>
    sql.authenticate('test', 'test')
  File "/data/work/tarantool/lua-modularization/test/lib/box_connection.py", line 48, in authenticate
    self.py_con.authenticate(user, password)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 274, in authenticate
    return self._opt_reconnect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 195, in _opt_reconnect
    self.connect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 123, in connect
    self.authenticate(self.user, self.password)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 278, in authenticate
    return self._send_request(request)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 223, in _send_request
    self._opt_reconnect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 202, in _opt_reconnect
    self.connect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 123, in connect
    self.authenticate(self.user, self.password)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 278, in authenticate
    return self._send_request(request)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 223, in _send_request
    self._opt_reconnect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 202, in _opt_reconnect
    self.connect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 123, in connect
    self.authenticate(self.user, self.password)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 278, in authenticate
    return self._send_request(request)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 223, in _send_request
    self._opt_reconnect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 202, in _opt_reconnect
    self.connect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 123, in connect
    self.authenticate(self.user, self.password)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 278, in authenticate
    return self._send_request(request)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 223, in _send_request
    self._opt_reconnect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 202, in _opt_reconnect
    self.connect()
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 123, in connect
    self.authenticate(self.user, self.password)
  File "/data/work/tarantool/lua-modularization/test/lib/tarantool-python/tarantool/connection.py", line 278, in authenticate
....
  File "/data/work/tarantool/lua-modularization/test/lib/msgpack-python/msgpack/fallback.py", line 608, in _pack
    nest_limit - 1)
  File "/data/work/tarantool/lua-modularization/test/lib/msgpack-python/msgpack/fallback.py", line 702, in _fb_pack_map_pairs
    self._pack(v, nest_limit - 1)
  File "/data/work/tarantool/lua-modularization/test/lib/msgpack-python/msgpack/fallback.py", line 604, in _pack
    self._pack(obj[i], nest_limit - 1)
  File "/data/work/tarantool/lua-modularization/test/lib/msgpack-python/msgpack/fallback.py", line 519, in _pack
    if isinstance(obj, int_types):
RuntimeError: maximum recursion depth exceeded while calling a Python object

Source code is not PEP8 compliant

pep8 log:

src/tarantool/__init__.py:8:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:9:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:10:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:11:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:14:30: E121 continuation line indentation is not a multiple of four
src/tarantool/__init__.py:15:30: E121 continuation line indentation is not a multiple of four
src/tarantool/__init__.py:16:30: E121 continuation line indentation is not a multiple of four
src/tarantool/__init__.py:17:30: E121 continuation line indentation is not a multiple of four
src/tarantool/__init__.py:18:30: E121 continuation line indentation is not a multiple of four
src/tarantool/__init__.py:19:30: E121 continuation line indentation is not a multiple of four
src/tarantool/__init__.py:21:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:22:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:23:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:24:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:25:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:26:29: E126 continuation line over-indented for hanging indent
src/tarantool/__init__.py:28:1: E302 expected 2 blank lines, found 1
src/tarantool/__init__.py:34:80: E501 line too long (90 > 79 characters)
src/tarantool/__init__.py:48:80: E501 line too long (151 > 79 characters)
src/tarantool/__init__.py:49:1: W391 blank line at end of file
src/tarantool/connection.py:15:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:16:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:17:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:18:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:19:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:20:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:21:21: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:25:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:26:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:27:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:28:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:29:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:30:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:31:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:32:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:33:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:34:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:36:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:37:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:38:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:39:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:40:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:41:29: E126 continuation line over-indented for hanging indent
src/tarantool/connection.py:44:1: E302 expected 2 blank lines, found 1
src/tarantool/connection.py:48:80: E501 line too long (82 > 79 characters)
src/tarantool/connection.py:49:80: E501 line too long (100 > 79 characters)
src/tarantool/connection.py:64:80: E501 line too long (103 > 79 characters)
src/tarantool/connection.py:66:80: E501 line too long (94 > 79 characters)
src/tarantool/connection.py:84:80: E501 line too long (139 > 79 characters)
src/tarantool/connection.py:112:80: E501 line too long (92 > 79 characters)
src/tarantool/connection.py:130:16: E221 multiple spaces before operator
src/tarantool/connection.py:141:61: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:141:63: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:141:80: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:141:80: E501 line too long (109 > 79 characters)
src/tarantool/connection.py:141:82: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:141:101: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:141:103: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:149:80: E501 line too long (91 > 79 characters)
src/tarantool/connection.py:153:80: E501 line too long (89 > 79 characters)
src/tarantool/connection.py:167:21: E261 at least two spaces before inline comment
src/tarantool/connection.py:187:46: E228 missing whitespace around modulo operator
src/tarantool/connection.py:187:80: E501 line too long (101 > 79 characters)
src/tarantool/connection.py:192:48: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:192:50: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:192:67: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:192:69: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:192:80: E501 line too long (96 > 79 characters)
src/tarantool/connection.py:192:88: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:192:90: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:205:9: E303 too many blank lines (2)
src/tarantool/connection.py:206:80: E501 line too long (97 > 79 characters)
src/tarantool/connection.py:218:80: E501 line too long (97 > 79 characters)
src/tarantool/connection.py:223:80: E501 line too long (127 > 79 characters)
src/tarantool/connection.py:225:80: E501 line too long (105 > 79 characters)
src/tarantool/connection.py:244:58: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:244:60: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:245:49: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:245:51: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:246:51: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:246:53: E251 unexpected spaces around keyword / parameter equals
src/tarantool/connection.py:263:80: E501 line too long (108 > 79 characters)
src/tarantool/connection.py:265:80: E501 line too long (97 > 79 characters)
src/tarantool/connection.py:272:80: E501 line too long (97 > 79 characters)
src/tarantool/connection.py:277:80: E501 line too long (81 > 79 characters)
src/tarantool/connection.py:281:80: E501 line too long (108 > 79 characters)
src/tarantool/connection.py:283:80: E501 line too long (97 > 79 characters)
src/tarantool/connection.py:290:80: E501 line too long (83 > 79 characters)
src/tarantool/connection.py:299:80: E501 line too long (108 > 79 characters)
src/tarantool/connection.py:301:80: E501 line too long (97 > 79 characters)
src/tarantool/connection.py:308:80: E501 line too long (93 > 79 characters)
src/tarantool/connection.py:319:80: E501 line too long (91 > 79 characters)
src/tarantool/connection.py:342:80: E501 line too long (83 > 79 characters)
src/tarantool/connection.py:343:80: E501 line too long (102 > 79 characters)
src/tarantool/connection.py:344:80: E501 line too long (91 > 79 characters)
src/tarantool/connection.py:377:80: E501 line too long (82 > 79 characters)
src/tarantool/connection.py:398:80: E501 line too long (84 > 79 characters)
src/tarantool/connection.py:411:80: E501 line too long (121 > 79 characters)
src/tarantool/connection.py:441:80: E501 line too long (81 > 79 characters)
src/tarantool/connection.py:444:58: E261 at least two spaces before inline comment
src/tarantool/connection.py:449:62: E261 at least two spaces before inline comment
src/tarantool/connection.py:450:80: E501 line too long (87 > 79 characters)
src/tarantool/connection.py:454:54: E261 at least two spaces before inline comment
src/tarantool/connection.py:455:80: E501 line too long (84 > 79 characters)
src/tarantool/connection.py:458:80: E501 line too long (127 > 79 characters)
src/tarantool/connection.py:466:80: E501 line too long (101 > 79 characters)
src/tarantool/const.py:28:18: E221 multiple spaces before operator
src/tarantool/const.py:29:18: E221 multiple spaces before operator
src/tarantool/const.py:31:17: E221 multiple spaces before operator
src/tarantool/const.py:32:8: E221 multiple spaces before operator
src/tarantool/const.py:33:12: E221 multiple spaces before operator
src/tarantool/const.py:44:80: E501 line too long (82 > 79 characters)
src/tarantool/error.py:37:80: E501 line too long (81 > 79 characters)
src/tarantool/error.py:42:1: E303 too many blank lines (3)
src/tarantool/error.py:44:80: E501 line too long (84 > 79 characters)
src/tarantool/error.py:87:5: E303 too many blank lines (2)
src/tarantool/error.py:93:80: E501 line too long (116 > 79 characters)
src/tarantool/error.py:100:58: E228 missing whitespace around modulo operator
src/tarantool/error.py:109:23: E703 statement ends with a semicolon
src/tarantool/error.py:118:80: E501 line too long (86 > 79 characters)
src/tarantool/error.py:129:80: E501 line too long (87 > 79 characters)
src/tarantool/error.py:143:29: E261 at least two spaces before inline comment
src/tarantool/error.py:147:1: W391 blank line at end of file
src/tarantool/request.py:10:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:11:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:12:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:13:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:14:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:15:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:16:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:17:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:18:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:19:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:20:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:21:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:22:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:23:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:24:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:25:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:26:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:27:29: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:29:1: E302 expected 2 blank lines, found 1
src/tarantool/request.py:31:80: E501 line too long (88 > 79 characters)
src/tarantool/request.py:32:80: E501 line too long (89 > 79 characters)
src/tarantool/request.py:34:80: E501 line too long (101 > 79 characters)
src/tarantool/request.py:38:80: E501 line too long (80 > 79 characters)
src/tarantool/request.py:41:80: E501 line too long (101 > 79 characters)
src/tarantool/request.py:41:101: E502 the backslash is redundant between brackets
src/tarantool/request.py:55:5: E303 too many blank lines (2)
src/tarantool/request.py:75:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:76:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:77:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:82:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:83:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:84:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:85:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:90:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:91:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:92:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:93:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:94:25: E126 continuation line over-indented for hanging indent
src/tarantool/request.py:101:37: E228 missing whitespace around modulo operator
src/tarantool/request.py:101:80: E501 line too long (99 > 79 characters)
src/tarantool/request.py:122:42: E251 unexpected spaces around keyword / parameter equals
src/tarantool/request.py:122:44: E251 unexpected spaces around keyword / parameter equals
src/tarantool/request.py:135:46: E251 unexpected spaces around keyword / parameter equals
src/tarantool/request.py:135:48: E251 unexpected spaces around keyword / parameter equals
src/tarantool/request.py:135:63: E251 unexpected spaces around keyword / parameter equals
src/tarantool/request.py:135:65: E251 unexpected spaces around keyword / parameter equals
src/tarantool/request.py:146:80: E501 line too long (86 > 79 characters)
src/tarantool/request.py:148:1: E302 expected 2 blank lines, found 1
src/tarantool/request.py:160:57: E261 at least two spaces before inline comment
src/tarantool/request.py:160:80: E501 line too long (80 > 79 characters)
src/tarantool/request.py:188:80: E501 line too long (87 > 79 characters)
src/tarantool/request.py:206:80: E501 line too long (80 > 79 characters)
src/tarantool/request.py:208:80: E501 line too long (98 > 79 characters)
src/tarantool/request.py:209:80: E501 line too long (95 > 79 characters)
src/tarantool/request.py:210:80: E501 line too long (93 > 79 characters)
src/tarantool/request.py:211:80: E501 line too long (88 > 79 characters)
src/tarantool/request.py:212:80: E501 line too long (88 > 79 characters)
src/tarantool/request.py:213:80: E501 line too long (88 > 79 characters)
src/tarantool/request.py:214:80: E501 line too long (88 > 79 characters)
src/tarantool/request.py:215:80: E501 line too long (87 > 79 characters)
src/tarantool/request.py:219:80: E501 line too long (107 > 79 characters)
src/tarantool/request.py:226:80: E501 line too long (85 > 79 characters)
src/tarantool/request.py:227:80: E501 line too long (86 > 79 characters)
src/tarantool/request.py:237:80: E501 line too long (91 > 79 characters)
src/tarantool/request.py:238:80: E501 line too long (88 > 79 characters)
src/tarantool/request.py:240:80: E501 line too long (99 > 79 characters)
src/tarantool/request.py:241:80: E501 line too long (94 > 79 characters)
src/tarantool/request.py:246:80: E501 line too long (96 > 79 characters)
src/tarantool/request.py:266:80: E501 line too long (97 > 79 characters)
src/tarantool/request.py:270:80: E501 line too long (86 > 79 characters)
src/tarantool/request.py:270:86: E502 the backslash is redundant between brackets
src/tarantool/request.py:271:33: E128 continuation line under-indented for visual indent
src/tarantool/request.py:271:34: E225 missing whitespace around operator
src/tarantool/request.py:271:63: E228 missing whitespace around modulo operator
src/tarantool/request.py:271:80: E501 line too long (114 > 79 characters)
src/tarantool/request.py:273:80: E501 line too long (89 > 79 characters)
src/tarantool/request.py:290:80: E501 line too long (87 > 79 characters)
src/tarantool/response.py:8:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:9:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:10:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:11:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:12:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:13:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:14:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:15:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:16:29: E126 continuation line over-indented for hanging indent
src/tarantool/response.py:21:1: E303 too many blank lines (3)
src/tarantool/response.py:24:1: E302 expected 2 blank lines, found 1
src/tarantool/response.py:32:80: E501 line too long (83 > 79 characters)
src/tarantool/response.py:35:80: E501 line too long (83 > 79 characters)
src/tarantool/response.py:54:57: E228 missing whitespace around modulo operator
src/tarantool/response.py:54:80: E501 line too long (80 > 79 characters)
src/tarantool/response.py:57:5: E303 too many blank lines (2)
src/tarantool/response.py:66:80: E501 line too long (118 > 79 characters)
src/tarantool/response.py:66:108: E228 missing whitespace around modulo operator
src/tarantool/response.py:69:5: E303 too many blank lines (2)
src/tarantool/response.py:84:1: E303 too many blank lines (3)
src/tarantool/response.py:86:80: E501 line too long (91 > 79 characters)
src/tarantool/response.py:87:80: E501 line too long (87 > 79 characters)
src/tarantool/response.py:91:54: E251 unexpected spaces around keyword / parameter equals
src/tarantool/response.py:91:56: E251 unexpected spaces around keyword / parameter equals
src/tarantool/response.py:91:73: E251 unexpected spaces around keyword / parameter equals
src/tarantool/response.py:91:75: E251 unexpected spaces around keyword / parameter equals
src/tarantool/response.py:91:80: E501 line too long (102 > 79 characters)
src/tarantool/response.py:91:94: E251 unexpected spaces around keyword / parameter equals
src/tarantool/response.py:91:96: E251 unexpected spaces around keyword / parameter equals
src/tarantool/response.py:104:80: E501 line too long (117 > 79 characters)
src/tarantool/response.py:123:64: E221 multiple spaces before operator
src/tarantool/response.py:123:80: E501 line too long (92 > 79 characters)
src/tarantool/response.py:128:5: E303 too many blank lines (2)
src/tarantool/response.py:147:5: E303 too many blank lines (2)
src/tarantool/response.py:161:80: E501 line too long (98 > 79 characters)
src/tarantool/response.py:164:51: E228 missing whitespace around modulo operator
src/tarantool/response.py:171:5: E303 too many blank lines (2)
src/tarantool/response.py:187:80: E501 line too long (82 > 79 characters)
src/tarantool/response.py:188:80: E501 line too long (81 > 79 characters)
src/tarantool/response.py:200:80: E501 line too long (82 > 79 characters)
src/tarantool/response.py:206:80: E501 line too long (102 > 79 characters)
src/tarantool/response.py:209:80: E501 line too long (95 > 79 characters)
src/tarantool/response.py:210:80: E501 line too long (91 > 79 characters)
src/tarantool/response.py:212:80: E501 line too long (81 > 79 characters)
src/tarantool/response.py:215:55: E228 missing whitespace around modulo operator
src/tarantool/response.py:215:80: E501 line too long (87 > 79 characters)
src/tarantool/response.py:218:33: E128 continuation line under-indented for visual indent
src/tarantool/response.py:218:80: E501 line too long (82 > 79 characters)
src/tarantool/response.py:221:80: E501 line too long (92 > 79 characters)
src/tarantool/response.py:224:5: E303 too many blank lines (2)
src/tarantool/response.py:233:80: E501 line too long (97 > 79 characters)
src/tarantool/response.py:236:80: E501 line too long (88 > 79 characters)
src/tarantool/response.py:241:5: E303 too many blank lines (2)
src/tarantool/response.py:251:5: E303 too many blank lines (2)
src/tarantool/response.py:257:80: E501 line too long (102 > 79 characters)
src/tarantool/response.py:258:80: E501 line too long (97 > 79 characters)
src/tarantool/response.py:263:5: E303 too many blank lines (2)
src/tarantool/response.py:268:80: E501 line too long (92 > 79 characters)
src/tarantool/response.py:280:80: E501 line too long (86 > 79 characters)
src/tarantool/response.py:285:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:15:29: E126 continuation line over-indented for hanging indent
src/tarantool/schema.py:16:29: E126 continuation line over-indented for hanging indent
src/tarantool/schema.py:17:29: E126 continuation line over-indented for hanging indent
src/tarantool/schema.py:19:1: E302 expected 2 blank lines, found 1
src/tarantool/schema.py:40:80: E501 line too long (106 > 79 characters)
src/tarantool/schema.py:45:80: E501 line too long (91 > 79 characters)
src/tarantool/schema.py:78:60: E228 missing whitespace around modulo operator
src/tarantool/schema.py:101:60: E228 missing whitespace around modulo operator
src/tarantool/schema.py:115:80: E501 line too long (86 > 79 characters)
src/tarantool/schema.py:116:69: E228 missing whitespace around modulo operator
src/tarantool/schema.py:116:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:120:73: E228 missing whitespace around modulo operator
src/tarantool/schema.py:120:80: E501 line too long (91 > 79 characters)
src/tarantool/schema.py:121:80: E501 line too long (115 > 79 characters)
src/tarantool/schema.py:122:68: E228 missing whitespace around modulo operator
src/tarantool/schema.py:122:80: E501 line too long (86 > 79 characters)
src/tarantool/schema.py:144:53: E228 missing whitespace around modulo operator
src/tarantool/schema.py:178:80: E501 line too long (80 > 79 characters)
src/tarantool/schema.py:186:80: E501 line too long (103 > 79 characters)
src/tarantool/schema.py:186:82: E228 missing whitespace around modulo operator
src/tarantool/schema.py:188:73: E228 missing whitespace around modulo operator
src/tarantool/schema.py:194:78: E228 missing whitespace around modulo operator
src/tarantool/schema.py:194:80: E501 line too long (96 > 79 characters)
src/tarantool/schema.py:210:80: E501 line too long (113 > 79 characters)
src/tarantool/schema.py:210:92: E228 missing whitespace around modulo operator
src/tarantool/schema.py:212:73: E228 missing whitespace around modulo operator
src/tarantool/schema.py:218:78: E228 missing whitespace around modulo operator
src/tarantool/schema.py:218:80: E501 line too long (96 > 79 characters)
src/tarantool/schema.py:221:40: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:221:42: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:228:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:241:57: E228 missing whitespace around modulo operator
src/tarantool/schema.py:254:80: E501 line too long (120 > 79 characters)
src/tarantool/schema.py:254:99: E228 missing whitespace around modulo operator
src/tarantool/schema.py:263:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:266:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:278:52: E228 missing whitespace around modulo operator
src/tarantool/schema.py:280:43: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:280:45: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:280:62: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:280:64: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:280:80: E501 line too long (91 > 79 characters)
src/tarantool/schema.py:280:83: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:280:85: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:291:80: E501 line too long (127 > 79 characters)
src/tarantool/schema.py:312:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:318:80: E501 line too long (86 > 79 characters)
src/tarantool/schema.py:322:52: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:322:54: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:322:71: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:322:73: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:322:80: E501 line too long (100 > 79 characters)
src/tarantool/schema.py:322:92: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:322:94: E251 unexpected spaces around keyword / parameter equals
src/tarantool/schema.py:333:80: E501 line too long (127 > 79 characters)
src/tarantool/schema.py:337:80: E501 line too long (94 > 79 characters)
src/tarantool/schema.py:354:80: E501 line too long (87 > 79 characters)
src/tarantool/schema.py:360:80: E501 line too long (90 > 79 characters)
src/tarantool/schema.py:386:30: E211 whitespace before '('
src/tarantool/schema.py:393:29: E201 whitespace after '['
src/tarantool/space.py:12:80: E501 line too long (80 > 79 characters)
src/tarantool/space.py:32:80: E501 line too long (108 > 79 characters)
src/tarantool/space.py:34:80: E501 line too long (97 > 79 characters)
src/tarantool/space.py:47:80: E501 line too long (97 > 79 characters)
src/tarantool/space.py:60:80: E501 line too long (97 > 79 characters)
src/tarantool/space.py:65:80: E501 line too long (80 > 79 characters)
src/tarantool/space.py:74:80: E501 line too long (121 > 79 characters)
src/tarantool/space.py:90:80: E501 line too long (101 > 79 characters)
src/tarantool/space.py:100:80: E501 line too long (97 > 79 characters)
src/tarantool/space.py:105:80: E501 line too long (127 > 79 characters)
src/tarantool/space.py:107:80: E501 line too long (105 > 79 characters)

Remember response time for queries

If Response instanse will have attribute that contains the time spent on each request, it will be possible to collect some statistics over many requests.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.