Created
February 23, 2017 16:23
-
-
Save Johnetordoff/deab5396e9b2e8066902074fa95b1954 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| =============================================== test session starts ================================================ | |
| platform darwin -- Python 3.5.3, pytest-2.8.2, py-1.4.32, pluggy-0.3.1 | |
| rootdir: /Users/johntordoff/waterbutler, inifile: | |
| plugins: cov-2.2.0, asyncio-0.3.0 | |
| collected 419 items | |
| tests/core/test_metadata.py ...... | |
| tests/core/test_path.py ........... | |
| tests/core/test_provider.py ....................................... | |
| tests/core/test_utils.py ....... | |
| tests/core/streams/test_base64encodestream.py .... | |
| tests/core/streams/test_formdatastream.py ........ | |
| tests/core/streams/test_jsonstream.py ...... | |
| tests/core/streams/test_multistream.py .... | |
| tests/core/streams/test_stringstream.py ...... | |
| tests/core/streams/test_zip.py .... | |
| tests/providers/box/test_provider.py ................... | |
| tests/providers/cloudfiles/test_provider.py ................. | |
| tests/providers/dataverse/test_provider.py ................ | |
| tests/providers/dropbox/test_provider.py ................. | |
| tests/providers/figshare/test_provider.py ............... | |
| tests/providers/filesystem/test_provider.py .............. | |
| tests/providers/github/test_metadata.py ..... | |
| tests/providers/github/test_path.py ... | |
| tests/providers/github/test_provider.py ......................... | |
| tests/providers/googledrive/test_metadata.py ...... | |
| tests/providers/googledrive/test_provider.py ......................... | |
| tests/providers/osfstorage/test_provider.py .......... | |
| tests/providers/osfstorage/test_tasks.py .......... | |
| tests/providers/owncloud/test_provider.py ........ | |
| tests/providers/s3/test_provider.py ........................................... | |
| tests/server/test_utils.py ......... | |
| tests/server/api/v0/test_copy.py FFFF | |
| tests/server/api/v0/test_crud.py ............F | |
| tests/server/api/v0/test_move.py FFF/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/py/_code/source.py:340: RuntimeWarning: coroutine 'BaseStream.read' was never awaited | |
| astnode = compile(content, "source", "exec", 1024) # 1024 for AST | |
| F | |
| tests/server/api/v0/test_revisions.py ... | |
| tests/server/api/v0/test_status.py . | |
| tests/server/api/v0/test_zip.py . | |
| tests/server/api/v1/test_create_mixin.py .......... | |
| tests/server/api/v1/test_fuzzing.py ....... | |
| tests/server/api/v1/test_metadata_mixin.py sssssssssssssssssssssssssssss | |
| tests/tasks/test_copy.py ..... | |
| tests/tasks/test_move.py ..... | |
| ===================================================== FAILURES ===================================================== | |
| _________________________________________ TestCopyHandler.test_calls_copy __________________________________________ | |
| self = <v0.test_copy.TestCopyHandler testMethod=test_calls_copy> | |
| @testing.gen_test | |
| def test_calls_copy(self): | |
| self.source_provider.copy = utils.MockCoroutine( | |
| return_value=(utils.MockFileMetadata(), False) | |
| ) | |
| yield self.http_client.fetch( | |
| self.get_url('/ops/copy'), | |
| method='POST', | |
| > body=json.dumps(self.payload()) | |
| ) | |
| tests/server/api/v0/test_copy.py:22: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...,request=<tornado.httpclient.HTTPRequest object at 0x10528c710>,request_time=0.010337114334106445,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,095][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,103][ERROR][tornado.application]: Uncaught exception POST /ops/copy (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50855', method='POST', uri='/ops/copy', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '221', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50855', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/copy.py", line 40, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,105][ERROR][tornado.access]: 500 POST /ops/copy (127.0.0.1) 4.33ms | |
| __________________________________________ TestCopyHandler.test_conflict ___________________________________________ | |
| self = <v0.test_copy.TestCopyHandler testMethod=test_conflict> | |
| @testing.gen_test | |
| def test_conflict(self): | |
| self.source_provider.copy = utils.MockCoroutine( | |
| return_value=(utils.MockFileMetadata(), True) | |
| ) | |
| payload = self.payload() | |
| payload['conflict'] = 'keep' | |
| resp = yield self.http_client.fetch( | |
| self.get_url('/ops/copy'), | |
| method='POST', | |
| > body=json.dumps(payload) | |
| ) | |
| tests/server/api/v0/test_copy.py:46: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...',request=<tornado.httpclient.HTTPRequest object at 0x105c4b6d8>,request_time=0.00590205192565918,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,248][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,253][ERROR][tornado.application]: Uncaught exception POST /ops/copy (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50858', method='POST', uri='/ops/copy', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '241', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50858', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/copy.py", line 40, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,254][ERROR][tornado.access]: 500 POST /ops/copy (127.0.0.1) 2.76ms | |
| ____________________________________ TestCopyHandler.test_intra_makes_callback _____________________________________ | |
| self = <v0.test_copy.TestCopyHandler testMethod=test_intra_makes_callback> | |
| @testing.gen_test | |
| def test_intra_makes_callback(self): | |
| self.source_provider.copy = utils.MockCoroutine( | |
| return_value=(utils.MockFileMetadata(), False) | |
| ) | |
| yield self.http_client.fetch( | |
| self.get_url('/ops/copy'), | |
| method='POST', | |
| > body=json.dumps(self.payload()) | |
| ) | |
| tests/server/api/v0/test_copy.py:95: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...request=<tornado.httpclient.HTTPRequest object at 0x105158828>,request_time=0.0055239200592041016,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,298][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,304][ERROR][tornado.application]: Uncaught exception POST /ops/copy (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50861', method='POST', uri='/ops/copy', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '221', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50861', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/copy.py", line 40, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,304][ERROR][tornado.access]: 500 POST /ops/copy (127.0.0.1) 2.39ms | |
| ___________________________________________ TestCopyHandler.test_rename ____________________________________________ | |
| self = <v0.test_copy.TestCopyHandler testMethod=test_rename> | |
| @testing.gen_test | |
| def test_rename(self): | |
| metadata = utils.MockFileMetadata() | |
| self.source_provider.copy = utils.MockCoroutine( | |
| return_value=(metadata, False) | |
| ) | |
| payload = self.payload() | |
| payload['rename'] = 'MyCoolFileGuys' | |
| resp = yield self.http_client.fetch( | |
| self.get_url('/ops/copy'), | |
| method='POST', | |
| > body=json.dumps(payload) | |
| ) | |
| tests/server/api/v0/test_copy.py:72: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...,request=<tornado.httpclient.HTTPRequest object at 0x105a68898>,request_time=0.005767107009887695,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,349][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,354][ERROR][tornado.application]: Uncaught exception POST /ops/copy (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50864', method='POST', uri='/ops/copy', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '249', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50864', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/copy.py", line 40, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,355][ERROR][tornado.access]: 500 POST /ops/copy (127.0.0.1) 2.41ms | |
| ___________________________________________ TestCrudHandler.test_upload ____________________________________________ | |
| self = <v0.test_crud.TestCrudHandler testMethod=test_upload> | |
| @testing.gen_test | |
| def test_upload(self): | |
| data = b'stone cold crazy' | |
| expected = utils.MockFileMetadata() | |
| self.mock_provider.upload = utils.MockCoroutine(return_value=(expected, True)) | |
| resp = yield self.http_client.fetch( | |
| self.get_url('/file?provider=queenhub&path=/roger.png'), | |
| method='PUT', | |
| body=data, | |
| ) | |
| calls = self.mock_provider.upload.call_args_list | |
| assert len(calls) == 1 | |
| args, kwargs = calls[0] | |
| assert isinstance(args[0], streams.RequestStreamReader) | |
| > streamed = asyncio.new_event_loop().run_until_complete(args[0].read()) | |
| tests/server/api/v0/test_crud.py:211: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py:454: in run_until_complete | |
| self.run_forever() | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| self = <_UnixSelectorEventLoop running=False closed=False debug=False> | |
| def run_forever(self): | |
| """Run until stop() is called.""" | |
| self._check_closed() | |
| if self.is_running(): | |
| raise RuntimeError('This event loop is already running') | |
| if events._get_running_loop() is not None: | |
| raise RuntimeError( | |
| > 'Cannot run the event loop while another loop is running') | |
| E RuntimeError: Cannot run the event loop while another loop is running | |
| /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py:411: RuntimeError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,506][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,512][INFO][tornado.access]: 201 PUT /file?provider=queenhub&path=/roger.png (127.0.0.1) 2.22ms | |
| _________________________________________ TestMoveHandler.test_calls_move __________________________________________ | |
| self = <v0.test_move.TestMoveHandler testMethod=test_calls_move> | |
| @testing.gen_test | |
| def test_calls_move(self): | |
| self.source_provider.move = utils.MockCoroutine( | |
| return_value=(utils.MockFileMetadata(), False) | |
| ) | |
| yield self.http_client.fetch( | |
| self.get_url('/ops/move'), | |
| method='POST', | |
| > body=json.dumps(self.payload()) | |
| ) | |
| tests/server/api/v0/test_move.py:22: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...',request=<tornado.httpclient.HTTPRequest object at 0x1059c92e8>,request_time=0.00570988655090332,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,590][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,595][ERROR][tornado.application]: Uncaught exception POST /ops/move (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50906', method='POST', uri='/ops/move', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '221', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50906', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/move.py", line 41, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,596][ERROR][tornado.access]: 500 POST /ops/move (127.0.0.1) 2.63ms | |
| __________________________________________ TestMoveHandler.test_conflict ___________________________________________ | |
| self = <v0.test_move.TestMoveHandler testMethod=test_conflict> | |
| @testing.gen_test | |
| def test_conflict(self): | |
| self.source_provider.move = utils.MockCoroutine( | |
| return_value=(utils.MockFileMetadata(), True) | |
| ) | |
| payload = self.payload() | |
| payload['conflict'] = 'keep' | |
| resp = yield self.http_client.fetch( | |
| self.get_url('/ops/move'), | |
| method='POST', | |
| > body=json.dumps(payload) | |
| ) | |
| tests/server/api/v0/test_move.py:46: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...,request=<tornado.httpclient.HTTPRequest object at 0x105ab9630>,request_time=0.006225109100341797,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,643][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,648][ERROR][tornado.application]: Uncaught exception POST /ops/move (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50909', method='POST', uri='/ops/move', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '241', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50909', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/move.py", line 41, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,649][ERROR][tornado.access]: 500 POST /ops/move (127.0.0.1) 2.62ms | |
| ____________________________________ TestMoveHandler.test_intra_makes_callback _____________________________________ | |
| self = <v0.test_move.TestMoveHandler testMethod=test_intra_makes_callback> | |
| @testing.gen_test | |
| def test_intra_makes_callback(self): | |
| self.source_provider.move = utils.MockCoroutine( | |
| return_value=(utils.MockFileMetadata(), False) | |
| ) | |
| yield self.http_client.fetch( | |
| self.get_url('/ops/move'), | |
| method='POST', | |
| > body=json.dumps(self.payload()) | |
| ) | |
| tests/server/api/v0/test_move.py:95: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...request=<tornado.httpclient.HTTPRequest object at 0x105f39518>,request_time=0.0057299137115478516,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,691][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,697][ERROR][tornado.application]: Uncaught exception POST /ops/move (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50912', method='POST', uri='/ops/move', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '221', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50912', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/move.py", line 41, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,698][ERROR][tornado.access]: 500 POST /ops/move (127.0.0.1) 2.30ms | |
| ___________________________________________ TestMoveHandler.test_rename ____________________________________________ | |
| self = <v0.test_move.TestMoveHandler testMethod=test_rename> | |
| @testing.gen_test | |
| def test_rename(self): | |
| metadata = utils.MockFileMetadata() | |
| self.source_provider.move = utils.MockCoroutine( | |
| return_value=(metadata, False) | |
| ) | |
| payload = self.payload() | |
| payload['rename'] = 'MyCoolFileGuys' | |
| resp = yield self.http_client.fetch( | |
| self.get_url('/ops/move'), | |
| method='POST', | |
| > body=json.dumps(payload) | |
| ) | |
| tests/server/api/v0/test_move.py:72: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py:1008: in run | |
| value = future.result() | |
| ../.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py:232: in result | |
| raise_exc_info(self._exc_info) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| exc_info = (<class 'tornado.httpclient.HTTPError'>, HTTPError(500, 'Internal Server Error', HTTPResponse(_body=None,buffer=<_io.B...request=<tornado.httpclient.HTTPRequest object at 0x105a0c4e0>,request_time=0.0064830780029296875,time_info={})), None) | |
| > ??? | |
| E tornado.httpclient.HTTPError: HTTP 500: Internal Server Error | |
| <string>:3: HTTPError | |
| ----------------------------------------------- Captured stderr call ----------------------------------------------- | |
| [2017-02-23 11:21:51,738][INFO][raven.contrib.tornado.AsyncSentryClient]: Raven is not configured (logging is disabled). Please see the documentation for more information. | |
| [2017-02-23 11:21:51,744][ERROR][tornado.application]: Uncaught exception POST /ops/move (127.0.0.1) | |
| HTTPServerRequest(protocol='http', host='localhost:50915', method='POST', uri='/ops/move', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': '249', 'Accept-Encoding': 'gzip', 'Host': 'localhost:50915', 'Connection': 'close'}) | |
| Traceback (most recent call last): | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/web.py", line 1445, in _execute | |
| result = yield result | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1008, in run | |
| value = future.result() | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/concurrent.py", line 232, in result | |
| raise_exc_info(self._exc_info) | |
| File "<string>", line 3, in raise_exc_info | |
| File "/Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/site-packages/tornado/gen.py", line 1017, in run | |
| yielded = self.gen.send(value) | |
| File "<string>", line 6, in _wrap_awaitable | |
| File "/Users/johntordoff/waterbutler/waterbutler/server/api/v0/move.py", line 41, in post | |
| conflict=self.json.get('conflict', 'replace'), | |
| TypeError: 'coroutine' object is not iterable | |
| [2017-02-23 11:21:51,745][ERROR][tornado.access]: 500 POST /ops/move (127.0.0.1) 2.83ms | |
| --------------------------------- coverage: platform darwin, python 3.5.3-final-0 ---------------------------------- | |
| /Users/johntordoff/.virtualenvs/waterbutler35/lib/python3.5/tokenize.py:604: RuntimeWarning: coroutine '__call__' was never awaited | |
| spos, epos, pos = (lnum, start), (lnum, end), end | |
| Name Stmts Miss Cover Missing | |
| ------------------------------------------------------------------------------------ | |
| waterbutler/__init__.py 2 0 100% | |
| waterbutler/auth/__init__.py 1 0 100% | |
| waterbutler/auth/osf/__init__.py 1 0 100% | |
| waterbutler/auth/osf/handler.py 62 32 48% 30, 34, 55-68, 72-92, 99, 103, 108, 120-121 | |
| waterbutler/auth/osf/settings.py 15 3 80% 15-17 | |
| waterbutler/constants.py 2 0 100% | |
| waterbutler/core/__init__.py 1 0 100% | |
| waterbutler/core/auth.py 4 1 75% 8 | |
| waterbutler/core/exceptions.py 80 9 89% 28, 119, 142, 148-150, 172-176 | |
| waterbutler/core/log_payload.py 20 1 95% 16 | |
| waterbutler/core/logging.py 10 10 0% 1-14 | |
| waterbutler/core/metadata.py 101 0 100% | |
| waterbutler/core/metrics.py 73 23 68% 9-22, 86, 90, 97, 143, 148-152, 175, 189-191 | |
| waterbutler/core/path.py 131 7 95% 48, 52, 63, 127, 224, 241, 261 | |
| waterbutler/core/provider.py 228 48 79% 38-42, 109-110, 167, 184-185, 225, 265, 278, 297-341, 362, 465, 498-503, 609, 612 | |
| waterbutler/core/remote_logging.py 108 71 34% 23-24, 41-42, 45-46, 52, 65-173, 182-199, 226-247, 251-302, 307-334, 338-341 | |
| waterbutler/core/signing.py 39 7 82% 24, 37-38, 61-62, 65-66 | |
| waterbutler/core/streams/__init__.py 12 0 100% | |
| waterbutler/core/streams/base.py 93 16 83% 14, 17, 20, 26, 31, 33-34, 41, 48, 88, 130-131, 134, 137, 140-141 | |
| waterbutler/core/streams/base64.py 32 1 97% 18 | |
| waterbutler/core/streams/file.py 34 2 94% 27-28 | |
| waterbutler/core/streams/http.py 99 19 81% 71, 150, 157, 161, 165, 169, 173, 179-180, 194, 197, 200-207 | |
| waterbutler/core/streams/json.py 11 0 100% | |
| waterbutler/core/streams/metadata.py 11 2 82% 11, 17 | |
| waterbutler/core/streams/zip.py 142 13 91% 60, 100, 135-138, 203-204, 208-209, 213-214, 218 | |
| waterbutler/core/utils.py 101 22 78% 49, 54, 84, 97-98, 113, 121-123, 129, 132-146, 174 | |
| waterbutler/providers/__init__.py 1 0 100% | |
| waterbutler/providers/box/__init__.py 1 0 100% | |
| waterbutler/providers/box/metadata.py 49 8 84% 73-74, 82-85, 91-92 | |
| waterbutler/providers/box/provider.py 221 76 66% 43, 50, 75, 96, 99-102, 117-118, 125, 131-156, 159, 166, 169, 172, 175-197, 200-221, 241, 256-257, 293-297, 367-375, 378-385, 389, 401-404, 407, 413-418, 432, 458-465, 472-475 | |
| waterbutler/providers/box/settings.py 4 0 100% | |
| waterbutler/providers/cloudfiles/__init__.py 1 0 100% | |
| waterbutler/providers/cloudfiles/metadata.py 43 10 77% 10, 25, 29, 33, 37, 41, 60, 64, 68, 76 | |
| waterbutler/providers/cloudfiles/provider.py 171 42 75% 53, 56, 67-79, 115, 135, 147-157, 198, 201, 204, 233-234, 245-253, 255-260, 269-273, 281-298, 316, 348 | |
| waterbutler/providers/cloudfiles/settings.py 4 0 100% | |
| waterbutler/providers/dataverse/__init__.py 1 0 100% | |
| waterbutler/providers/dataverse/metadata.py 50 5 90% 81, 85, 92, 96, 100 | |
| waterbutler/providers/dataverse/provider.py 114 15 87% 55, 87-97, 212-220, 233-234 | |
| waterbutler/providers/dataverse/settings.py 6 0 100% | |
| waterbutler/providers/dropbox/__init__.py 1 0 100% | |
| waterbutler/providers/dropbox/exceptions.py 9 2 78% 6-7 | |
| waterbutler/providers/dropbox/metadata.py 43 5 88% 31, 77, 81, 85, 89 | |
| waterbutler/providers/dropbox/provider.py 168 60 64% 102-105, 109, 125, 132, 140-176, 179-203, 219, 244, 254-257, 272, 285, 291-292, 299, 306, 317-329, 344, 347, 357-360 | |
| waterbutler/providers/dropbox/settings.py 4 0 100% | |
| waterbutler/providers/figshare/__init__.py 1 0 100% | |
| waterbutler/providers/figshare/metadata.py 83 14 83% 38, 44, 50, 58, 89, 118, 134, 138, 142, 160, 164, 168, 172, 176 | |
| waterbutler/providers/figshare/path.py 16 4 75% 18-20, 29 | |
| waterbutler/providers/figshare/provider.py 388 131 66% 84, 101, 103, 144, 151, 173, 178, 183-184, 194, 200, 264, 324-374, 397, 411, 452, 477-488, 503-505, 526, 537, 546-550, 573-592, 609, 612-614, 621, 625, 633, 663, 671, 675-680, 685-687, 710, 715-722, 782-797, 816, 820, 856-879, 892-899, 908, 926-928, 944-947, 958-960 | |
| waterbutler/providers/figshare/settings.py 11 0 100% | |
| waterbutler/providers/filesystem/__init__.py 1 0 100% | |
| waterbutler/providers/filesystem/metadata.py 34 6 82% 14, 50, 54, 58, 62, 66 | |
| waterbutler/providers/filesystem/provider.py 84 13 85% 44, 47-49, 52-54, 85-87, 92, 133, 136 | |
| waterbutler/providers/filesystem/settings.py 3 0 100% | |
| waterbutler/providers/github/__init__.py 1 0 100% | |
| waterbutler/providers/github/exceptions.py 5 2 60% 6-9 | |
| waterbutler/providers/github/metadata.py 71 5 93% 148, 152, 156, 160, 164 | |
| waterbutler/providers/github/path.py 18 4 78% 7-9, 31 | |
| waterbutler/providers/github/provider.py 370 183 51% 57-64, 77-78, 85-86, 95, 114-115, 142, 147-148, 151, 169, 172, 180, 183, 206-255, 271-285, 299-306, 349-372, 375-471, 479-503, 519-520, 537-543, 558, 568, 579-587, 590-598, 601-617, 621-628, 641-645, 648, 683-684, 687, 698-705, 708-717, 729-812, 821-827, 907-921 | |
| waterbutler/providers/github/settings.py 10 0 100% | |
| waterbutler/providers/googledrive/__init__.py 1 0 100% | |
| waterbutler/providers/googledrive/metadata.py 118 33 72% 46, 67-68, 75-76, 124, 128-132, 136-140, 144-148, 157, 161, 165, 169, 173-175, 179-183 | |
| waterbutler/providers/googledrive/provider.py 258 76 71% 68, 90-104, 107, 114, 117, 120-141, 144-162, 187, 224-229, 252, 316, 366-382, 406-407, 433, 451-480, 483-500, 517, 572-589 | |
| waterbutler/providers/googledrive/settings.py 5 0 100% | |
| waterbutler/providers/googledrive/utils.py 22 4 82% 40-42, 49 | |
| waterbutler/providers/osfstorage/__init__.py 2 0 100% | |
| waterbutler/providers/osfstorage/metadata.py 58 27 53% 29, 36, 40-51, 55-66, 70, 74, 78, 102, 106, 110, 114 | |
| waterbutler/providers/osfstorage/provider.py 222 57 74% 56, 78, 94, 101-103, 108-120, 130-137, 140, 143, 146, 149-172, 175-198, 227, 319, 392, 396-401, 415, 418, 422-432, 438-452, 455-460, 496-499 | |
| waterbutler/providers/osfstorage/settings.py 31 1 97% 18 | |
| waterbutler/providers/osfstorage/tasks/__init__.py 0 0 100% | |
| waterbutler/providers/osfstorage/tasks/backup.py 39 10 74% 17-21, 49-68 | |
| waterbutler/providers/osfstorage/tasks/exceptions.py 2 0 100% | |
| waterbutler/providers/osfstorage/tasks/parity.py 29 2 93% 23, 31 | |
| waterbutler/providers/osfstorage/tasks/utils.py 74 20 73% 21-25, 29-34, 47-62, 109, 118-120, 130 | |
| waterbutler/providers/owncloud/__init__.py 1 0 100% | |
| waterbutler/providers/owncloud/metadata.py 45 18 60% 14, 22-23, 29, 33, 37, 41, 48-50, 57-59, 65, 69, 73, 77, 81 | |
| waterbutler/providers/owncloud/provider.py 114 34 70% 59, 71, 84, 97, 101-103, 105, 131-132, 167-168, 248-261, 264, 267, 270, 273, 276, 288-310, 313-314 | |
| waterbutler/providers/owncloud/settings.py 5 5 0% 1-6 | |
| waterbutler/providers/owncloud/utils.py 31 3 90% 17, 41-42 | |
| waterbutler/providers/s3/__init__.py 1 0 100% | |
| waterbutler/providers/s3/metadata.py 61 14 77% 10, 31, 35, 39, 43, 47, 65, 69, 73, 77, 81, 94, 98, 127 | |
| waterbutler/providers/s3/provider.py 199 21 89% 70, 102, 105, 108, 114-136, 233-234, 292, 300, 364, 410, 448-454 | |
| waterbutler/providers/s3/settings.py 3 0 100% | |
| waterbutler/server/__init__.py 0 0 100% | |
| waterbutler/server/api/__init__.py 0 0 100% | |
| waterbutler/server/api/v0/__init__.py 8 0 100% | |
| waterbutler/server/api/v0/copy.py 18 8 56% 16-31, 44-52 | |
| waterbutler/server/api/v0/core.py 83 17 80% 23, 27, 54, 63, 80-81, 96-97, 109-110, 134-137, 142-146 | |
| waterbutler/server/api/v0/crud.py 78 0 100% | |
| waterbutler/server/api/v0/metadata.py 9 5 44% 12-19 | |
| waterbutler/server/api/v0/move.py 18 8 56% 16-31, 45-53 | |
| waterbutler/server/api/v0/revisions.py 9 0 100% | |
| waterbutler/server/api/v0/zip.py 11 0 100% | |
| waterbutler/server/api/v1/__init__.py 3 0 100% | |
| waterbutler/server/api/v1/core.py 23 4 83% 25-29 | |
| waterbutler/server/api/v1/provider/__init__.py 101 42 58% 24-30, 72, 76, 86, 93-95, 99-101, 107-111, 117-118, 126-132, 143-154, 157-178 | |
| waterbutler/server/api/v1/provider/create.py 47 12 74% 56-79, 89 | |
| waterbutler/server/api/v1/provider/metadata.py 63 49 22% 19-29, 32-41, 44-52, 55-95, 98-100, 105-110, 113-122 | |
| waterbutler/server/api/v1/provider/movecopy.py 55 28 49% 25, 42, 58-122 | |
| waterbutler/server/app.py 30 9 70% 40-62 | |
| waterbutler/server/auth.py 16 8 50% 16-20, 25-27 | |
| waterbutler/server/handlers.py 5 0 100% | |
| waterbutler/server/settings.py 19 1 95% 31 | |
| waterbutler/server/utils.py 59 8 86% 51, 55-56, 69, 80, 93, 98-101 | |
| waterbutler/settings.py 67 5 93% 46, 59, 90-91, 138 | |
| waterbutler/sizes.py 3 0 100% | |
| waterbutler/tasks/__init__.py 8 0 100% | |
| waterbutler/tasks/app.py 16 5 69% 18-25, 30-31 | |
| waterbutler/tasks/copy.py 27 0 100% | |
| waterbutler/tasks/core.py 75 43 43% 22-27, 44, 55, 60-78, 89-93, 103-128 | |
| waterbutler/tasks/exceptions.py 4 0 100% | |
| waterbutler/tasks/move.py 27 0 100% | |
| waterbutler/tasks/settings.py 21 0 100% | |
| ------------------------------------------------------------------------------------ | |
| TOTAL 5624 1449 74% |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment