Control: tags 977054 + patch
Control: tags 977054 + pending
Dear maintainer,
I've prepared an NMU for aiorwlock (versioned as 1.0.0-0.1) and uploaded
it to DELAYED/1. Please feel free to tell me if I should cancel it.
cu
Adrian
diff -Nru aiorwlock-0.6.0/aiorwlock/__init__.py aiorwlock-1.0.0/aiorwlock/__init__.py
--- aiorwlock-0.6.0/aiorwlock/__init__.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/aiorwlock/__init__.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,31 +1,25 @@
import asyncio
-import sys
-
+import warnings
from collections import deque
-from asyncio import Task, Future # noqa
-from typing import Any, List, Tuple, Optional, Callable # noqa
-
-try:
- from typing import Deque
-except ImportError:
- Deque = deque # type: ignore
-
+from typing import Any, Deque, List, Optional, Tuple
Loop = asyncio.AbstractEventLoop
OptLoop = Optional[Loop]
+# silence LGTM service alerts
+Future = asyncio.Future
+Task = asyncio.Task
-__version__ = '0.6.0'
-__all__ = ['RWLock']
-
-PY_35 = sys.version_info >= (3, 5, 3)
+__version__ = '1.0.0'
+__all__ = ('RWLock',)
-def current_task(loop: OptLoop = None) -> 'Task[Any]':
- _loop = loop or asyncio.get_event_loop() # type: Loop
+def _current_task(loop: OptLoop = None) -> 'Task[Any]':
+ _loop: Loop = loop or asyncio.get_event_loop()
if hasattr(asyncio, 'current_task'):
t = asyncio.current_task(loop=_loop)
else:
+ # remove once python 3.6 deprecated
t = asyncio.Task.current_task(loop=_loop)
if t is None:
raise RuntimeError('Loop is not running')
@@ -40,15 +34,15 @@
_RL = 1
_WL = 2
- def __init__(self, fast: bool, loop: OptLoop):
+ def __init__(self, fast: bool, loop: Loop):
self._do_yield = not fast
- self._loop = loop or asyncio.get_event_loop() # type: Loop
- self._read_waiters = deque() # type: Deque[Future[None]]
- self._write_waiters = deque() # type: Deque[Future[None]]
- self._r_state = 0 # type: int
- self._w_state = 0 # type: int
+ self._loop: Loop = loop
+ self._read_waiters: Deque[Future[None]] = deque()
+ self._write_waiters: Deque[Future[None]] = deque()
+ self._r_state: int = 0
+ self._w_state: int = 0
# tasks will be few, so a list is not inefficient
- self._owning = [] # type: List[Tuple[Task[Any], int]]
+ self._owning: List[Tuple[Task[Any], int]] = []
@property
def read_locked(self) -> bool:
@@ -58,23 +52,33 @@
def write_locked(self) -> bool:
return self._w_state > 0
+ async def _yield_after_acquire(self, lock_type: int) -> None:
+ if self._do_yield:
+ try:
+ await asyncio.sleep(0.0, loop=self._loop)
+ except asyncio.CancelledError:
+ self._release(lock_type)
+ self._wake_up()
+ raise
+
# Acquire the lock in read mode.
async def acquire_read(self) -> bool:
- me = current_task(loop=self._loop)
+ me = _current_task(loop=self._loop)
if (me, self._RL) in self._owning or (me, self._WL) in self._owning:
self._r_state += 1
self._owning.append((me, self._RL))
- if self._do_yield:
- await asyncio.sleep(0.0, loop=self._loop)
+ await self._yield_after_acquire(self._RL)
return True
- if (not self._write_waiters and
- self._r_state >= 0 and self._w_state == 0):
+ if (
+ not self._write_waiters
+ and self._r_state >= 0
+ and self._w_state == 0
+ ):
self._r_state += 1
self._owning.append((me, self._RL))
- if self._do_yield:
- await asyncio.sleep(0.0, loop=self._loop)
+ await self._yield_after_acquire(self._RL)
return True
fut = self._loop.create_future()
@@ -95,13 +99,12 @@
# Acquire the lock in write mode. A 'waiting' count is maintained,
# ensuring that 'readers' will yield to writers.
async def acquire_write(self) -> bool:
- me = current_task(loop=self._loop)
+ me = _current_task(loop=self._loop)
if (me, self._WL) in self._owning:
self._w_state += 1
self._owning.append((me, self._WL))
- if self._do_yield:
- await asyncio.sleep(0.0, loop=self._loop)
+ await self._yield_after_acquire(self._WL)
return True
elif (me, self._RL) in self._owning:
if self._r_state > 0:
@@ -110,8 +113,7 @@
if self._r_state == 0 and self._w_state == 0:
self._w_state += 1
self._owning.append((me, self._WL))
- if self._do_yield:
- await asyncio.sleep(0.0, loop=self._loop)
+ await self._yield_after_acquire(self._WL)
return True
fut = self._loop.create_future()
@@ -137,7 +139,7 @@
def _release(self, lock_type: int) -> None:
# assert lock_type in (self._RL, self._WL)
- me = current_task(loop=self._loop)
+ me = _current_task(loop=self._loop)
try:
self._owning.remove((me, lock_type))
except ValueError:
@@ -174,10 +176,10 @@
class _ContextManagerMixin:
-
def __enter__(self) -> None:
raise RuntimeError(
- '"await" should be used as context manager expression')
+ '"await" should be used as context manager expression'
+ )
def __exit__(self, *args: Any) -> None:
# This must exist because __enter__ exists, even though that
@@ -202,7 +204,6 @@
# Lock objects to access the _RWLockCore in reader or writer mode
class _ReaderLock(_ContextManagerMixin):
-
def __init__(self, lock: _RWLockCore) -> None:
self._lock = lock
@@ -222,7 +223,6 @@
class _WriterLock(_ContextManagerMixin):
-
def __init__(self, lock: _RWLockCore):
self._lock = lock
@@ -251,7 +251,25 @@
core = _RWLockCore
def __init__(self, *, fast: bool = False, loop: OptLoop = None) -> None:
- self._loop = loop or asyncio.get_event_loop() # type: Loop
+ if loop is None:
+ loop = asyncio.get_event_loop()
+ else:
+ warnings.warn(
+ 'Passing "loop" argument '
+ 'is deprecated since aiorwlock 1.0 and scheduled for removal '
+ 'in aiorwlock 2.0',
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ if not loop.is_running():
+ warnings.warn(
+ 'Instantiation of RWLock outside of async function context '
+ 'is deprecated since aiorwlock 1.0 and scheduled for removal '
+ 'in aiorwlock 2.0',
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ self._loop: Loop = loop
core = self.core(fast, self._loop)
self._reader_lock = _ReaderLock(core)
self._writer_lock = _WriterLock(core)
diff -Nru aiorwlock-0.6.0/CHANGES.rst aiorwlock-1.0.0/CHANGES.rst
--- aiorwlock-0.6.0/CHANGES.rst 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/CHANGES.rst 2020-10-23 11:09:58.000000000 +0300
@@ -1,6 +1,20 @@
Changes
-------
+1.0.0 (2020-12-32)
+^^^^^^^^^^^^^^^^^^
+
+* Fix a bug with cancelation during acquire #170 (thanks @romasku)
+
+* Deprecate passing explicit `loop` argument to `RWLock` constuctor
+
+* Deprecate creation of `RWLock` instance outside of async function context
+
+* Minimal supported version is Python 3.6
+
+* The library works with Python 3.8 and Python 3.9 seamlessly
+
+
0.6.0 (2018-12-18)
^^^^^^^^^^^^^^^^^^
* Wake up all readers after writer releases lock #60 (thanks @ranyixu)
diff -Nru aiorwlock-0.6.0/CONTRIBUTORS.txt aiorwlock-1.0.0/CONTRIBUTORS.txt
--- aiorwlock-0.6.0/CONTRIBUTORS.txt 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/CONTRIBUTORS.txt 1970-01-01 02:00:00.000000000 +0200
@@ -1,3 +0,0 @@
-Acknowledgements
-----------------
-Andrew Svetlov https://github.com/asvetlov
\ No newline at end of file
diff -Nru aiorwlock-0.6.0/debian/changelog aiorwlock-1.0.0/debian/changelog
--- aiorwlock-0.6.0/debian/changelog 2019-07-10 16:24:28.000000000 +0300
+++ aiorwlock-1.0.0/debian/changelog 2021-02-10 01:45:28.000000000 +0200
@@ -1,3 +1,11 @@
+aiorwlock (1.0.0-0.1) unstable; urgency=high
+
+ * Non-maintainer upload.
+ * New upstream release.
+ - Fixes FTBFS with pytest 6. (Closes: #977054)
+
+ -- Adrian Bunk <[email protected]> Wed, 10 Feb 2021 01:45:28 +0200
+
aiorwlock (0.6.0-2) unstable; urgency=medium
* Upload to unstable.
diff -Nru aiorwlock-0.6.0/examples/context_manager.py aiorwlock-1.0.0/examples/context_manager.py
--- aiorwlock-0.6.0/examples/context_manager.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/examples/context_manager.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,4 +1,5 @@
import asyncio
+
import aiorwlock
diff -Nru aiorwlock-0.6.0/examples/simple.py aiorwlock-1.0.0/examples/simple.py
--- aiorwlock-0.6.0/examples/simple.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/examples/simple.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,4 +1,5 @@
import asyncio
+
import aiorwlock
diff -Nru aiorwlock-0.6.0/.github/workflows/ci.yml aiorwlock-1.0.0/.github/workflows/ci.yml
--- aiorwlock-0.6.0/.github/workflows/ci.yml 1970-01-01 02:00:00.000000000 +0200
+++ aiorwlock-1.0.0/.github/workflows/ci.yml 2020-10-23 11:09:58.000000000 +0300
@@ -0,0 +1,125 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - master
+ tags: [ 'v*' ]
+ pull_request:
+ branches:
+ - master
+ schedule:
+ - cron: '0 6 * * *' # Daily 6AM UTC build
+
+
+jobs:
+
+ lint:
+ name: Linter
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Setup Python 3.8
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.8
+ - name: Get pip cache dir
+ id: pip-cache
+ run: |
+ echo "::set-output name=dir::$(pip cache dir)" # - name: Cache
+ - name: Cache PyPI
+ uses: actions/cache@v2
+ with:
+ key: pip-lint-${{ hashFiles('requirements-dev.txt') }}
+ path: ${{ steps.pip-cache.outputs.dir }}
+ restore-keys: |
+ pip-lint-
+ - name: Install dependencies
+ uses: py-actions/py-dependency-install@v2
+ with:
+ path: requirements-dev.txt
+ - name: Install itself
+ run: |
+ pip install .
+ - name: Run lint
+ run: |
+ make lint
+ - name: Prepare twine checker
+ run: |
+ pip install -U twine wheel
+ python setup.py sdist bdist_wheel
+ - name: Run twine checker
+ run: |
+ twine check dist/*
+
+ test:
+ name: Test
+ needs: lint
+ strategy:
+ matrix:
+ pyver: [3.6, 3.7, 3.8, 3.9, pypy3]
+ fail-fast: false
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Setup Python ${{ matrix.pyver }}
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.pyver }}
+ - name: Get pip cache dir
+ id: pip-cache
+ run: |
+ echo "::set-output name=dir::$(pip cache dir)" # - name: Cache
+ - name: Cache PyPI
+ uses: actions/cache@v2
+ with:
+ key: pip-ci-${{ matrix.pyver }}-${{ hashFiles('requirements-dev.txt') }}
+ path: ${{ steps.pip-cache.outputs.dir }}
+ restore-keys: |
+ pip-ci-
+ - name: Install dependencies
+ uses: py-actions/py-dependency-install@v2
+ with:
+ path: requirements-dev.txt
+ - name: Run unittests
+ env:
+ COLOR: 'yes'
+ run: |
+ make cov
+ python -m coverage xml
+ - name: Upload coverage
+ uses: codecov/codecov-action@v1
+ with:
+ file: ./coverage.xml
+ flags: unit
+ fail_ci_if_error: false
+
+ deploy:
+ name: Deploy
+ runs-on: ubuntu-latest
+ needs: test
+ # Run only on pushing a tag
+ if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Setup Python 3.8
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.8
+ - name: Install dependencies
+ run:
+ python -m pip install -U pip wheel twine
+ - name: Make dists
+ run:
+ python setup.py sdist bdist_wheel
+ - name: PyPI upload
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
+ run: |
+ twine upload dist/*
diff -Nru aiorwlock-0.6.0/.gitignore aiorwlock-1.0.0/.gitignore
--- aiorwlock-0.6.0/.gitignore 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/.gitignore 2020-10-23 11:09:58.000000000 +0300
@@ -58,4 +58,10 @@
.idea
.coverage.*
-coverage
\ No newline at end of file
+coverage
+
+.DS_Store
+.mypy_cache/
+cscope.files
+cscope.out
+tags
diff -Nru aiorwlock-0.6.0/LICENSE aiorwlock-1.0.0/LICENSE
--- aiorwlock-0.6.0/LICENSE 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/LICENSE 2020-10-23 11:09:58.000000000 +0300
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright 2015-2016 Andrew Svetlov, Nikolay Novik
+ Copyright 2015-2019 Andrew Svetlov, Nikolay Novik
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff -Nru aiorwlock-0.6.0/Makefile aiorwlock-1.0.0/Makefile
--- aiorwlock-0.6.0/Makefile 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/Makefile 2020-10-23 11:09:58.000000000 +0300
@@ -1,8 +1,20 @@
# Some simple testing tasks (sorry, UNIX only).
+FILES := aiorwlock tests examples setup.py
+
flake:
- flake8 aiorwlock tests examples setup.py
+ flake8 $(FILES)
+
+fmt:
+ isort ${FILES}
+ black -S -l 79 ${FILES}
+
+lint: bandit pyroma
+ isort --check-only --diff ${FILES}
+ black -S -l 79 --check $(FILES)
+ mypy --show-error-codes --disallow-untyped-calls --strict aiorwlock
+ flake8 $(FILES)
test: flake
pytest -s
@@ -10,9 +22,6 @@
vtest:
pytest -v
-checkrst:
- python setup.py check --restructuredtext
-
pyroma:
pyroma -d .
@@ -20,9 +29,9 @@
bandit -r ./aiorwlock
mypy:
- mypy aiorwlock --ignore-missing-imports --disallow-untyped-calls --no-site-packages --strict
+ mypy aiorwlock --disallow-untyped-calls --strict
-cov cover coverage: flake checkrst pyroma bandit
+cov cover coverage:
pytest -sv --cov=aiorwlock --cov-report=term --cov-report=html ./tests
@echo "open file://`pwd`/htmlcov/index.html"
diff -Nru aiorwlock-0.6.0/README.rst aiorwlock-1.0.0/README.rst
--- aiorwlock-0.6.0/README.rst 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/README.rst 2020-10-23 11:09:58.000000000 +0300
@@ -1,12 +1,12 @@
aiorwlock
=========
-.. image:: https://travis-ci.com/aio-libs/aiorwlock.svg?branch=master
- :target: https://travis-ci.com/aio-libs/aiorwlock
-.. image:: https://coveralls.io/repos/jettify/aiorwlock/badge.png?branch=master
- :target: https://coveralls.io/r/aio-libs/aiorwlock?branch=master
+.. image:: https://github.com/aio-libs/aiorwlock/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/aiorwlock/actions?query=workflow%3ACI
+.. image:: https://codecov.io/gh/aio-libs/aiorwlock/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/aiorwlock
.. image:: https://badges.gitter.im/Join%20Chat.svg
- :target: https://gitter.im/aio-libs/Lobby
- :alt: Chat on Gitter
+ :target: https://gitter.im/aio-libs/Lobby
+ :alt: Chat on Gitter
Read write lock for asyncio_ . A ``RWLock`` maintains a pair of associated
locks, one for read-only operations and one for writing. The read lock may be
@@ -25,27 +25,33 @@
Implementation is almost direct port from this patch_.
-Example with async def
-----------------------
+Example
+-------
-Requires Python 3.5+
+Requires Python 3.5.3+
.. code:: python
- import asyncio
- import aiorwlock
- loop = asyncio.get_event_loop()
+ import asyncio
+ import aiorwlock
+
+
+ async def go():
+ rwlock = aiorwlock.RWLock()
+
+ # acquire reader lock, multiple coroutines allowed to hold the lock
+ async with rwlock.reader_lock:
+ print('inside reader lock')
+ await asyncio.sleep(0.1)
+ # acquire writer lock, only one coroutine can hold the lock
+ async with rwlock.writer_lock:
+ print('inside writer lock')
+ await asyncio.sleep(0.1)
- async def go():
- rwlock = aiorwlock.RWLock(loop=loop)
- async with rwlock.writer:
- # or same way you can acquire reader lock
- # async with rwlock.reader: pass
- print("inside writer")
- await asyncio.sleep(0.1, loop=loop)
- loop.run_until_complete(go())
+ loop = asyncio.get_event_loop()
+ loop.run_until_complete(go())
Fast path
@@ -64,11 +70,17 @@
minor speedup.
+TLA+ Specification
+------------------
+
+TLA+ specification of ``aiorwlock`` provided in this repository.
+
+
License
-------
``aiorwlock`` is offered under the Apache 2 license.
-.. _asyncio: http://docs.python.org/3.4/library/asyncio.html
+.. _asyncio: http://docs.python.org/3.8/library/asyncio.html
.. _patch: http://bugs.python.org/issue8800
diff -Nru aiorwlock-0.6.0/requirements-dev.txt aiorwlock-1.0.0/requirements-dev.txt
--- aiorwlock-0.6.0/requirements-dev.txt 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/requirements-dev.txt 2020-10-23 11:09:58.000000000 +0300
@@ -1,10 +1,13 @@
-e .
-bandit==1.5.1
-flake8-bugbear==18.8.0
-flake8-quotes==1.0.0
-flake8==3.6.0
-pyroma==2.4
-pytest-cov==2.6.0
-pytest==4.0.1
-uvloop==0.11.3
-mypy==0.650
+bandit==1.6.2; implementation_name=="cpython"
+black==20.8b1; implementation_name=="cpython"
+flake8-bugbear==20.1.4; implementation_name=="cpython"
+flake8-quotes==3.2.0; implementation_name=="cpython"
+flake8==3.8.4; implementation_name=="cpython"
+isort==5.6.4; implementation_name=="cpython"
+mypy==0.790; implementation_name=="cpython"
+pyroma==2.6; implementation_name=="cpython"
+pytest-asyncio==0.14.0
+pytest-cov==2.10.1
+pytest==6.1.1
+uvloop==0.14.0; implementation_name=="cpython"
diff -Nru aiorwlock-0.6.0/setup.cfg aiorwlock-1.0.0/setup.cfg
--- aiorwlock-0.6.0/setup.cfg 1970-01-01 02:00:00.000000000 +0200
+++ aiorwlock-1.0.0/setup.cfg 2020-10-23 11:09:58.000000000 +0300
@@ -0,0 +1,6 @@
+[tool:pytest]
+filterwarnings=error
+testpaths = tests/
+
+[mypy-pytest]
+ignore_missing_imports = true
diff -Nru aiorwlock-0.6.0/setup.py aiorwlock-1.0.0/setup.py
--- aiorwlock-0.6.0/setup.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/setup.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,59 +1,64 @@
import os
import re
-import sys
-from setuptools import setup
+from setuptools import setup
install_requires = []
-if sys.version_info < (3, 5, 3):
- raise RuntimeError('aiorwlock requires Python 3.5.3+')
-
-
def read(f):
return open(os.path.join(os.path.dirname(__file__), f)).read().strip()
def read_version():
regexp = re.compile(r"^__version__\W*=\W*'([\d.abrc]+)'")
- init_py = os.path.join(os.path.dirname(__file__),
- 'aiorwlock', '__init__.py')
+ init_py = os.path.join(
+ os.path.dirname(__file__), 'aiorwlock', '__init__.py'
+ )
with open(init_py) as f:
for line in f:
match = regexp.match(line)
if match is not None:
return match.group(1)
- else:
- raise RuntimeError('Cannot find version in aiorwlock/__init__.py')
+ raise RuntimeError('Cannot find version in aiorwlock/__init__.py')
classifiers = [
'License :: OSI Approved :: Apache Software License',
'Intended Audience :: Developers',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
'Operating System :: OS Independent',
'Development Status :: 4 - Beta',
'Framework :: AsyncIO',
]
-
-setup(name='aiorwlock',
- version=read_version(),
- description=('Read write lock for asyncio.'),
- long_description='\n\n'.join((read('README.rst'), read('CHANGES.rst'))),
- classifiers=classifiers,
- platforms=['POSIX'],
- author='Nikolay Novik',
- author_email='[email protected]',
- url='https://github.com/aio-libs/aiorwlock',
- download_url='https://pypi.python.org/pypi/aiorwlock',
- license='Apache 2',
- packages=['aiorwlock'],
- install_requires=install_requires,
- keywords=['aiorwlock', 'lock', 'asyncio'],
- zip_safe=True,
- include_package_data=True)
+project_urls = {
+ 'Website': 'https://github.com/aio-libs/aiorwlock',
+ 'Issues': 'https://github.com/aio-libs/aiorwlock/issues',
+}
+
+
+setup(
+ name='aiorwlock',
+ version=read_version(),
+ description=('Read write lock for asyncio.'),
+ long_description='\n\n'.join((read('README.rst'), read('CHANGES.rst'))),
+ classifiers=classifiers,
+ platforms=['POSIX'],
+ author='Nikolay Novik',
+ author_email='[email protected]',
+ url='https://github.com/aio-libs/aiorwlock',
+ download_url='https://pypi.python.org/pypi/aiorwlock',
+ license='Apache 2',
+ packages=['aiorwlock'],
+ install_requires=install_requires,
+ keywords=['aiorwlock', 'lock', 'asyncio'],
+ zip_safe=True,
+ project_urls=project_urls,
+ python_requires='>=3.6.0',
+ include_package_data=True,
+)
diff -Nru aiorwlock-0.6.0/spec/aiorwlock.tla aiorwlock-1.0.0/spec/aiorwlock.tla
--- aiorwlock-0.6.0/spec/aiorwlock.tla 1970-01-01 02:00:00.000000000 +0200
+++ aiorwlock-1.0.0/spec/aiorwlock.tla 2020-10-23 11:09:58.000000000 +0300
@@ -0,0 +1,70 @@
+----------------------------- MODULE aiorwlock ------------------------------
+EXTENDS Naturals, Sequences, Integers, FiniteSets
+CONSTANTS Task
+ASSUME /\ Task # {}
+
+VARIABLES RState,
+ WState,
+ Lock
+
+-----------------------------------------------------------------------------
+TypeOK == /\ Lock \in [Task -> {"Read", "Write", "WriteRead", "Waiting", "Finished"}]
+ /\ RState >= 0
+ /\ WState >= 0 /\ WState <= 2
+LockInit == Lock = [t \in Task |-> "Waiting"] /\ RState = 0 /\ WState = 0
+-----------------------------------------------------------------------------
+
+
+Rlocked == RState > 0
+Wlocked == WState > 0
+Unlocked == RState = 0 /\ WState = 0
+
+WOwn(t) == Lock[t] \in {"Write"}
+
+RAquire(t) == \/ /\ ~Wlocked
+ /\ Lock' = [Lock EXCEPT ![t] = "Read"]
+ /\ RState' = RState + 1
+ /\ UNCHANGED WState
+ /\ Lock[t] \in {"Waiting"}
+ \/ /\ WOwn(t)
+ /\ Lock' = [Lock EXCEPT ![t] = "WriteRead"]
+ /\ RState' = RState + 1
+ /\ UNCHANGED WState
+
+WAquire(t) == /\ Unlocked
+ /\ Lock' = [Lock EXCEPT ![t] = "Write"]
+ /\ WState' = WState + 1
+ /\ UNCHANGED RState
+ /\ Lock[t] \in {"Waiting"}
+
+
+RRelease(t) == \/ /\ Rlocked /\ Lock[t] = "Read"
+ /\ RState' = RState - 1 /\ Lock' = [Lock EXCEPT ![t] = "Finished"]
+ /\ UNCHANGED WState
+ \/ /\ Rlocked /\ Lock[t] = "WriteRead"
+ /\ RState' = RState - 1 /\ Lock' = [Lock EXCEPT ![t] = "Write"]
+ /\ UNCHANGED WState
+
+WRelease(t) == \/ /\ Wlocked /\ Lock[t] = "Write"
+ /\ WState' = WState - 1 /\ Lock' = [Lock EXCEPT ![t] = "Finished"]
+ /\ UNCHANGED RState
+ \/ /\ Wlocked /\ Lock[t] = "WriteRead"
+ /\ WState' = WState - 1 /\ Lock' = [Lock EXCEPT ![t] = "Read"]
+ /\ UNCHANGED RState
+-----------------------------------------------------------------------------
+
+Next == \E t \in Task: RAquire(t) \/ WAquire(t) \/ RRelease(t) \/ WRelease(t)
+
+Spec == LockInit /\ [][Next]_<<RState, WState, Lock>>
+
+
+LockInv ==
+ \A t1 \in Task : \A t2 \in (Task \ {t1}): ~
+ (/\ Lock[t1] \in {"Write", "WriteRead"}
+ /\ Lock[t2] \in {"Read", "Write", "WriteRead"})
+-----------------------------------------------------------------------------
+
+THEOREM Spec => [](TypeOK /\ LockInv)
+
+=============================================================================
+
diff -Nru aiorwlock-0.6.0/tests/conftest.py aiorwlock-1.0.0/tests/conftest.py
--- aiorwlock-0.6.0/tests/conftest.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/tests/conftest.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,17 +1,22 @@
import asyncio
import gc
-import uvloop
import pytest
+try:
+ import uvloop
+except ImportError:
+ uvloop = None
+
@pytest.fixture(scope='module', params=[True, False], ids=['fast', 'slow'])
def fast_track(request):
return request.param
[email protected](scope='session', params=[True, False],
- ids=['debug:true', 'debug:false'])
[email protected](
+ scope='session', params=[True, False], ids=['debug:true', 'debug:false']
+)
def debug(request):
return request.param
@@ -22,10 +27,10 @@
@pytest.fixture
-def loop(request, loop_type, debug):
+def event_loop(request, loop_type, debug):
# old_loop = asyncio.get_event_loop()
asyncio.set_event_loop(None)
- if loop_type == 'uvloop':
+ if loop_type == 'uvloop' and uvloop is not None:
loop = uvloop.new_event_loop()
else:
loop = asyncio.new_event_loop()
@@ -39,30 +44,6 @@
gc.collect()
[email protected]
-def pytest_pycollect_makeitem(collector, name, obj):
- if collector.funcnamefilter(name):
- item = pytest.Function(name, parent=collector)
- if 'run_loop' in item.keywords:
- return list(collector._genfunctions(name, obj))
-
-
[email protected]
-def pytest_pyfunc_call(pyfuncitem):
- """
- Run asyncio marked test functions in an event loop instead of a normal
- function call.
- """
- if 'run_loop' in pyfuncitem.keywords:
- funcargs = pyfuncitem.funcargs
- loop = funcargs['loop']
- testargs = {arg: funcargs[arg]
- for arg in pyfuncitem._fixtureinfo.argnames}
- loop.run_until_complete(pyfuncitem.obj(**testargs))
- return True
-
-
-def pytest_runtest_setup(item):
- if 'run_loop' in item.keywords and 'loop' not in item.fixturenames:
- # inject an event loop fixture for all async tests
- item.fixturenames.append('loop')
[email protected]
+def loop(event_loop):
+ return event_loop
diff -Nru aiorwlock-0.6.0/tests/test_corner_cases.py aiorwlock-1.0.0/tests/test_corner_cases.py
--- aiorwlock-0.6.0/tests/test_corner_cases.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/tests/test_corner_cases.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,16 +1,16 @@
-import pytest
import asyncio
import contextlib
-from aiorwlock import RWLock, current_task
+import pytest
+from aiorwlock import RWLock, _current_task
ensure_future = asyncio.ensure_future
@contextlib.contextmanager
def should_fail(timeout, loop):
- task = current_task(loop)
+ task = _current_task(loop)
handle = loop.call_later(timeout, task.cancel)
try:
@@ -19,12 +19,13 @@
handle.cancel()
return
else:
- assert False, ('Inner task expected to be cancelled', task)
+ msg = 'Inner task expected to be cancelled: {}'.format(task)
+ pytest.fail(msg)
[email protected]_loop
[email protected]
async def test_get_write_then_read(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
rl = rwlock.reader
wl = rwlock.writer
@@ -37,9 +38,9 @@
assert rl.locked
[email protected]_loop
[email protected]
async def test_get_write_then_read_and_write_again(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
rl = rwlock.reader
wl = rwlock.writer
@@ -48,27 +49,27 @@
async def get_write_lock():
await f
- with should_fail(.1, loop):
+ with should_fail(0.1, loop):
async with wl:
assert wl.locked
writes.append('should not be here')
- ensure_future(get_write_lock(), loop=loop)
+ ensure_future(get_write_lock())
async with wl:
assert wl.locked
async with rl:
f.set_result(None)
- await asyncio.sleep(0.12, loop=loop)
+ await asyncio.sleep(0.12)
# second task can not append to writes
assert writes == []
assert rl.locked
[email protected]_loop
[email protected]
async def test_writers_deadlock(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
rl = rwlock.reader
wl = rwlock.writer
@@ -86,12 +87,12 @@
async def coro():
async with wl:
assert wl.locked
- await asyncio.sleep(.2, loop)
+ await asyncio.sleep(0.2, loop)
async with rl:
assert rl.locked
- task_b = ensure_future(coro(), loop=loop)
- task_c = ensure_future(coro(), loop=loop)
+ task_b = ensure_future(coro())
+ task_c = ensure_future(coro())
await asyncio.sleep(0.1, loop)
# cancel lock waiter right after release
task_b.cancel()
@@ -104,9 +105,9 @@
assert not wl.locked
[email protected]_loop
[email protected]
async def test_readers_cancel(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
rl = rwlock.reader
wl = rwlock.writer
@@ -117,8 +118,8 @@
async with wl:
assert wl.locked
- task_b = ensure_future(coro(rl), loop=loop)
- task_c = ensure_future(coro(rl), loop=loop)
+ task_b = ensure_future(coro(rl))
+ task_c = ensure_future(coro(rl))
await asyncio.sleep(0.1, loop)
task_b.cancel()
@@ -128,3 +129,24 @@
assert task_c.done()
assert not rl.locked
assert not wl.locked
+
+
[email protected]
+async def test_canceled_inside_acquire(loop):
+ rwlock = RWLock()
+ rl = rwlock.reader
+
+ async def coro(lock):
+ async with lock:
+ pass
+
+ task = ensure_future(coro(rl))
+ await asyncio.sleep(0)
+ task.cancel()
+
+ try:
+ await task
+ except asyncio.CancelledError:
+ pass
+
+ assert not rl.locked
diff -Nru aiorwlock-0.6.0/tests/test_rwlock.py aiorwlock-1.0.0/tests/test_rwlock.py
--- aiorwlock-0.6.0/tests/test_rwlock.py 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/tests/test_rwlock.py 2020-10-23 11:09:58.000000000 +0300
@@ -1,19 +1,20 @@
import asyncio
-from aiorwlock import RWLock, current_task
import pytest
+from aiorwlock import RWLock, _current_task
+
class Bunch(object):
"""A bunch of Tasks. Port python threading tests"""
- def __init__(self, f, n, wait_before_exit=False, loop=None):
+ def __init__(self, f, n, wait_before_exit=False):
"""
Construct a bunch of `n` tasks running the same function `f`.
If `wait_before_exit` is True, the tasks won't terminate until
do_finish() is called.
"""
- self._loop = loop or asyncio.get_event_loop()
+ self._loop = asyncio.get_event_loop()
self.f = f
self.n = n
self.started = []
@@ -23,56 +24,75 @@
self._futures = []
async def task():
- tid = current_task(loop=self._loop)
+ tid = _current_task()
self.started.append(tid)
try:
await f()
finally:
self.finished.append(tid)
while not self._can_exit:
- await asyncio.sleep(0.01, loop=self._loop)
+ await asyncio.sleep(0.01)
for _ in range(n):
- t = asyncio.Task(task(), loop=self._loop)
+ t = asyncio.Task(task())
self._futures.append(t)
async def wait_for_finished(self):
- await asyncio.gather(*self._futures, loop=self._loop)
+ await asyncio.gather(*self._futures)
def do_finish(self):
self._can_exit = True
-async def _wait(loop=None):
- _loop = loop or asyncio.get_event_loop()
- await asyncio.sleep(0.01, loop=_loop)
+async def _wait():
+ await asyncio.sleep(0.01)
+
+
+def test_ctor_deprecated_implicit_not_running(loop):
+ with pytest.warns(DeprecationWarning):
+ RWLock()
+
+
+def test_ctor_deprecated_explicit_non_running(loop):
+ with pytest.warns(DeprecationWarning):
+ RWLock(loop=loop)
-def test_ctor_loop_reader(loop):
- rwlock = RWLock(loop=loop).reader_lock
[email protected]
+async def test_ctor_loop_deprecated_arg(loop):
+ with pytest.warns(DeprecationWarning):
+ RWLock(loop=loop)
+
+
[email protected]
+async def test_ctor_loop_reader(loop):
+ rwlock = RWLock().reader_lock
assert rwlock._lock._loop is loop
-def test_ctor_noloop_reader(loop):
[email protected]
+async def test_ctor_noloop_reader(loop):
asyncio.set_event_loop(loop)
rwlock = RWLock().reader_lock
assert rwlock._lock._loop is loop
-def test_ctor_loop_writer(loop):
- rwlock = RWLock(loop=loop).writer_lock
[email protected]
+async def test_ctor_loop_writer(loop):
+ rwlock = RWLock().writer_lock
assert rwlock._lock._loop is loop
-def test_ctor_noloop_writer(loop):
[email protected]
+async def test_ctor_noloop_writer(loop):
asyncio.set_event_loop(loop)
rwlock = RWLock().writer_lock
assert rwlock._lock._loop is loop
[email protected]_loop
[email protected]
async def test_repr(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
assert 'RWLock' in rwlock.__repr__()
assert 'WriterLock: [unlocked' in rwlock.__repr__()
assert 'ReaderLock: [unlocked' in rwlock.__repr__()
@@ -90,16 +110,16 @@
assert 'WriterLock: [unlocked]' in rwlock.__repr__()
[email protected]_loop
[email protected]
async def test_release_unlocked(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
with pytest.raises(RuntimeError):
rwlock.reader_lock.release()
[email protected]_loop
[email protected]
async def test_many_readers(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
N = 5
locked = []
nlocked = []
@@ -108,20 +128,20 @@
await rwlock.reader_lock.acquire()
try:
locked.append(1)
- await _wait(loop=loop)
+ await _wait()
nlocked.append(len(locked))
- await _wait(loop=loop)
+ await _wait()
locked.pop(-1)
finally:
rwlock.reader_lock.release()
- await Bunch(f, N, loop=loop).wait_for_finished()
+ await Bunch(f, N).wait_for_finished()
assert max(nlocked) > 1
[email protected]_loop
[email protected]
async def test_read_upgrade_write_release(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
await rwlock.writer_lock.acquire()
await rwlock.reader_lock.acquire()
await rwlock.reader_lock.acquire()
@@ -143,10 +163,10 @@
rwlock.reader_lock.release()
[email protected]_loop
[email protected]
async def test_reader_recursion(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
N = 5
locked = []
nlocked = []
@@ -157,22 +177,22 @@
await rwlock.reader_lock.acquire()
try:
locked.append(1)
- await _wait(loop=loop)
+ await _wait()
nlocked.append(len(locked))
- await _wait(loop=loop)
+ await _wait()
locked.pop(-1)
finally:
rwlock.reader_lock.release()
finally:
rwlock.reader_lock.release()
- await Bunch(f, N, loop=loop).wait_for_finished()
+ await Bunch(f, N).wait_for_finished()
assert max(nlocked) > 1
[email protected]_loop
[email protected]
async def test_writer_recursion(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
N = 5
locked = []
nlocked = []
@@ -183,22 +203,22 @@
await rwlock.writer_lock.acquire()
try:
locked.append(1)
- await _wait(loop=loop)
+ await _wait()
nlocked.append(len(locked))
- await _wait(loop=loop)
+ await _wait()
locked.pop(-1)
finally:
rwlock.writer_lock.release()
finally:
rwlock.writer_lock.release()
- await Bunch(f, N, loop=loop).wait_for_finished()
+ await Bunch(f, N).wait_for_finished()
assert max(nlocked) == 1
[email protected]_loop
[email protected]
async def test_writer_then_reader_recursion(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
N = 5
locked = []
nlocked = []
@@ -209,22 +229,22 @@
await rwlock.reader_lock.acquire()
try:
locked.append(1)
- await _wait(loop=loop)
+ await _wait()
nlocked.append(len(locked))
- await _wait(loop=loop)
+ await _wait()
locked.pop(-1)
finally:
rwlock.reader_lock.release()
finally:
rwlock.writer_lock.release()
- await Bunch(f, N, loop=loop).wait_for_finished()
+ await Bunch(f, N).wait_for_finished()
assert max(nlocked) == 1
[email protected]_loop
[email protected]
async def test_writer_recursion_fail(loop):
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
N = 5
locked = []
@@ -237,13 +257,13 @@
finally:
rwlock.reader_lock.release()
- await Bunch(f, N, loop=loop).wait_for_finished()
+ await Bunch(f, N).wait_for_finished()
assert len(locked) == N
[email protected]_loop
[email protected]
async def test_readers_writers(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
N = 5
rlocked = []
wlocked = []
@@ -253,9 +273,9 @@
await rwlock.reader_lock.acquire()
try:
rlocked.append(1)
- await _wait(loop=loop)
+ await _wait()
nlocked.append((len(rlocked), len(wlocked)))
- await _wait(loop=loop)
+ await _wait()
rlocked.pop(-1)
finally:
rwlock.reader_lock.release()
@@ -264,22 +284,25 @@
await rwlock.writer_lock.acquire()
try:
wlocked.append(1)
- await _wait(loop=loop)
+ await _wait()
nlocked.append((len(rlocked), len(wlocked)))
- await _wait(loop=loop)
+ await _wait()
wlocked.pop(-1)
finally:
rwlock.writer_lock.release()
- b1 = Bunch(r, N, loop=loop)
- b2 = Bunch(w, N, loop=loop)
+ b1 = Bunch(r, N)
+ b2 = Bunch(w, N)
- await asyncio.sleep(0.0001, loop=loop)
+ await asyncio.sleep(0.0001)
await b1.wait_for_finished()
await b2.wait_for_finished()
- r, w, = zip(*nlocked)
+ (
+ r,
+ w,
+ ) = zip(*nlocked)
assert max(r) > 1
assert max(w) == 1
@@ -291,10 +314,10 @@
assert w == 0
[email protected]_loop
[email protected]
async def test_writer_success(loop):
# Verify that a writer can get access
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
N = 5
reads = 0
writes = 0
@@ -314,10 +337,10 @@
async def w():
nonlocal reads, writes
while reads == 0:
- await _wait(loop=loop)
+ await _wait()
for _ in range(2):
- await _wait(loop=loop)
+ await _wait()
# print("current pre-writes", reads)
await rwlock.writer_lock.acquire()
@@ -327,8 +350,8 @@
finally:
rwlock.writer_lock.release()
- b1 = Bunch(r, N, loop=loop)
- b2 = Bunch(w, 1, loop=loop)
+ b1 = Bunch(r, N)
+ b2 = Bunch(w, 1)
await b1.wait_for_finished()
await b2.wait_for_finished()
@@ -337,10 +360,10 @@
# print('>>>>>>>>>>>', writes, reads)
[email protected]_loop
[email protected]
async def test_writer_success_fast(loop):
# Verify that a writer can get access
- rwlock = RWLock(loop=loop, fast=True)
+ rwlock = RWLock(fast=True)
N = 5
reads = 0
writes = 0
@@ -354,17 +377,17 @@
try:
reads += 1
# print("current reads", reads)
- await asyncio.sleep(0, loop=loop)
+ await asyncio.sleep(0)
finally:
rwlock.reader_lock.release()
async def w():
nonlocal reads, writes
while reads == 0:
- await _wait(loop=loop)
+ await _wait()
for _ in range(2):
- await _wait(loop=loop)
+ await _wait()
# print("current pre-writes", reads)
await rwlock.writer_lock.acquire()
@@ -374,8 +397,8 @@
finally:
rwlock.writer_lock.release()
- b1 = Bunch(r, N, loop=loop)
- b2 = Bunch(w, 1, loop=loop)
+ b1 = Bunch(r, N)
+ b2 = Bunch(w, 1)
await b1.wait_for_finished()
await b2.wait_for_finished()
@@ -384,10 +407,10 @@
# print('>>>>>>>>>>>', writes, reads)
[email protected]_loop
[email protected]
async def test_writer_success_with_statement(loop):
# Verify that a writer can get access
- rwlock = RWLock(loop=loop)
+ rwlock = RWLock()
N = 5
reads = 0
writes = 0
@@ -404,17 +427,17 @@
async def w():
nonlocal reads, writes
while reads == 0:
- await _wait(loop=loop)
+ await _wait()
for _ in range(2):
- await _wait(loop=loop)
+ await _wait()
# print("current pre-writes", reads)
async with rwlock.writer_lock:
writes += 1
- b1 = Bunch(r, N, loop=loop)
- b2 = Bunch(w, 1, loop=loop)
+ b1 = Bunch(r, N)
+ b2 = Bunch(w, 1)
await b1.wait_for_finished()
await b2.wait_for_finished()
@@ -423,39 +446,41 @@
# print('>>>>>>>>>>>', writes, reads)
-def test_raise_error_on_with_for_reader_lock(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
[email protected]
+async def test_raise_error_on_with_for_reader_lock(loop, fast_track):
+ rwlock = RWLock(fast=fast_track)
with pytest.raises(RuntimeError):
with rwlock.reader_lock:
pass
-def test_raise_error_on_with_for_writer_lock(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
[email protected]
+async def test_raise_error_on_with_for_writer_lock(loop, fast_track):
+ rwlock = RWLock(fast=fast_track)
with pytest.raises(RuntimeError):
with rwlock.writer_lock:
pass
[email protected]_loop
[email protected]
async def test_read_locked(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
assert not rwlock.reader_lock.locked
async with rwlock.reader_lock:
assert rwlock.reader_lock.locked
[email protected]_loop
[email protected]
async def test_write_locked(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
assert not rwlock.writer_lock.locked
async with rwlock.writer_lock:
assert rwlock.writer_lock.locked
[email protected]_loop
[email protected]
async def test_write_read_lock_multiple_tasks(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
rl = rwlock.reader
wl = rwlock.writer
@@ -468,7 +493,7 @@
async with wl:
assert wl.locked
assert not rl.locked
- task = asyncio.Task(coro(), loop=loop)
+ task = asyncio.Task(coro())
await asyncio.sleep(0.1, loop)
await task
assert not rl.locked
@@ -477,42 +502,42 @@
def test_current_task(loop):
with pytest.raises(RuntimeError):
- current_task(loop=loop)
+ _current_task(loop)
with pytest.raises(RuntimeError):
- current_task()
+ _current_task()
[email protected]_loop
[email protected]
async def test_read_context_manager(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
reader = rwlock.reader_lock
assert not reader.locked
async with reader:
assert reader.locked
[email protected]_loop
[email protected]
async def test_write_context_manager(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
writer = rwlock.writer_lock
assert not writer.locked
async with writer:
assert writer.locked
[email protected]_loop
[email protected]
async def test_await_read_lock(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
reader = rwlock.reader_lock
assert not reader.locked
async with reader:
assert reader.locked
[email protected]_loop
[email protected]
async def test_await_write_lock(loop, fast_track):
- rwlock = RWLock(loop=loop, fast=fast_track)
+ rwlock = RWLock(fast=fast_track)
writer = rwlock.writer_lock
assert not writer.locked
async with writer:
diff -Nru aiorwlock-0.6.0/.travis.yml aiorwlock-1.0.0/.travis.yml
--- aiorwlock-0.6.0/.travis.yml 2018-12-17 21:09:26.000000000 +0200
+++ aiorwlock-1.0.0/.travis.yml 1970-01-01 02:00:00.000000000 +0200
@@ -1,39 +0,0 @@
-dist: xenial
-sudo: required
-
-language: python
-python:
-- 3.5.3
-- 3.6
-
-matrix:
- include:
- - python: '3.7'
- env: MYPY="y"
-
-install:
- - pip install -r requirements-dev.txt
- - pip install .
- - pip install codecov
-
-script:
- - |
- if [ "$MYPY" = "y" ]; then
- make mypy
- fi;
- - make cov
-
-after_success:
- - codecov
-
-
-deploy:
- provider: pypi
- user: aio-libs-bot
- password:
- secure: "xrYq78Jpw3rfHNc+LDS3IXi0cDZukAgaDuJ+xbkRLwijeSTR8LA9ZFU0OYK2X/+YBrtegBKB15ZkEkjfN702MNaR3wqHGxs+EWVcZc6Yy/lipGTjfGJEiDcIF+wKzFR5wqSL8Hrj66cDnY7dK07jfHc5KswTUizmiYLqGnAJGI+zQVnHCIv6W6iC06LY9eLcBXi514toMN9ku+anNBtzQ14gjW4N0ccCGKaeeAzPsvrMcnpjUh1xOhFG/aTBFpEPLbJ7ZUS87kPabf9/WsLS0tEW8ggSgAZT9GTljbe4I8/Vg14EJCQ4KSpcQ8z9gsf1AAB8XEYIN0jx2ub/c6gYwlazoOln6EE+WbNTHqEx0SiCkHrL7gIOoXEWYG/xPGraYQIi1xD6Yl6nmi0bixUQOgsYGKYb131ycyMJjsHGTdRHnqnja0ev9VIWr5zBu1IKtE/46QRMFYpg5PPAVX211wVsvZwH8plueIA1WRfzwZQoAiZDhQ4Wusql6jFVleeqKy4UldYy3SFoFL0qzlwvm/cx7dkP97NoW8Xtoizz0CJt/BeFGViCaRYbi3Z45rjSaeVWhfcwnIaRdd3FgadxWhJXEohgnoafwCteNz3NGU0lbxBfuOfYEOFgcwdYMzF0KjsGwbfekdAa/ZcLxnuvmJXFXPo/YrWusVw4nBR/9pU="
- distributions: sdist bdist_wheel
- on:
- tags: true
- all_branches: true
- python: 3.7