Hello community, here is the log from the commit of package python-aiobotocore for openSUSE:Factory checked in at 2020-08-10 15:06:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-aiobotocore (Old) and /work/SRC/openSUSE:Factory/.python-aiobotocore.new.3399 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-aiobotocore" Mon Aug 10 15:06:54 2020 rev:3 rq:825340 version:0.12.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-aiobotocore/python-aiobotocore.changes 2020-01-28 10:57:16.909125220 +0100 +++ /work/SRC/openSUSE:Factory/.python-aiobotocore.new.3399/python-aiobotocore.changes 2020-08-10 15:07:58.172283748 +0200 @@ -1,0 +2,11 @@ +Tue Mar 24 11:26:42 UTC 2020 - John Paul Adrian Glaubitz <adrian.glaub...@suse.com> + +- Update to 0.12.0 + + Bump botocore and extras + + Drop support for 3.5 given we are unable to test it + with moto and it will soon be unsupported + + Remove loop parameters for Python 3.8 compliance + + Remove deprecated AioPageIterator.next_page +- Update BuildRequires and Requires from setup.py + +------------------------------------------------------------------- Old: ---- aiobotocore-0.11.1.tar.gz New: ---- aiobotocore-0.12.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-aiobotocore.spec ++++++ --- /var/tmp/diff_new_pack.UmTUUA/_old 2020-08-10 15:07:59.692283692 +0200 +++ /var/tmp/diff_new_pack.UmTUUA/_new 2020-08-10 15:07:59.696283691 +0200 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-aiobotocore -Version: 0.11.1 +Version: 0.12.0 Release: 0 Summary: Async client for aws services License: Apache-2.0 @@ -32,7 +32,8 @@ BuildRequires: python-rpm-macros # SECTION test requirements BuildRequires: %{python_module aiohttp >= 3.3.1} -BuildRequires: %{python_module botocore >= 1.13.14} +BuildRequires: %{python_module aioitertools >= 0.5.1} +BuildRequires: %{python_module botocore >= 1.15.3} BuildRequires: %{python_module wrapt >= 1.10.10} # /SECTION Requires: python-aiohttp >= 3.3.1 ++++++ aiobotocore-0.11.1.tar.gz -> aiobotocore-0.12.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/CHANGES.rst new/aiobotocore-0.12.0/CHANGES.rst --- old/aiobotocore-0.11.1/CHANGES.rst 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/CHANGES.rst 2020-02-23 12:32:32.000000000 +0100 @@ -1,6 +1,14 @@ Changes ------- +0.12.0 (2020-02-23) +^^^^^^^^^^^^^^^^^^^ +* Bump botocore and extras +* Drop support for 3.5 given we are unable to test it with moto + and it will soon be unsupported +* Remove loop parameters for Python 3.8 compliance +* Remove deprecated AioPageIterator.next_page + 0.11.1 (2020-01-03) ^^^^^^^^^^^^^^^^^^^ * Fixed event streaming API calls like S3 Select. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/PKG-INFO new/aiobotocore-0.12.0/PKG-INFO --- old/aiobotocore-0.11.1/PKG-INFO 2020-01-04 07:56:59.000000000 +0100 +++ new/aiobotocore-0.12.0/PKG-INFO 2020-02-23 12:33:11.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: aiobotocore -Version: 0.11.1 +Version: 0.12.0 Summary: Async client for aws services using botocore and aiohttp Home-page: https://github.com/aio-libs/aiobotocore Author: Nikolay Novik @@ -51,13 +51,13 @@ AWS_SECRET_ACCESS_KEY = "xxx" - async def go(loop): + async def go(): bucket = 'dataintake' filename = 'dummy.bin' folder = 'aiobotocore' key = '{}/{}'.format(folder, filename) - session = aiobotocore.get_session(loop=loop) + session = aiobotocore.get_session() async with session.create_client('s3', region_name='us-west-2', aws_secret_access_key=AWS_SECRET_ACCESS_KEY, aws_access_key_id=AWS_ACCESS_KEY_ID) as client: @@ -89,7 +89,7 @@ print(resp) loop = asyncio.get_event_loop() - loop.run_until_complete(go(loop)) + loop.run_until_complete(go()) Supported AWS Services @@ -130,7 +130,7 @@ $ cd aiobotocore $ export AWS_ACCESS_KEY_ID=xxx $ export AWS_SECRET_ACCESS_KEY=xxx - $ pip install -Ur requirements-dev.txt + $ pipenv sync --dev Execute tests suite: @@ -147,12 +147,12 @@ Requirements ------------ - * Python_ 3.5+ + * Python_ 3.6+ * aiohttp_ * botocore_ .. _Python: https://www.python.org - .. _asyncio: http://docs.python.org/3.5/library/asyncio.html + .. _asyncio: https://docs.python.org/3/library/asyncio.html .. _botocore: https://github.com/boto/botocore .. _aiohttp: https://github.com/KeepSafe/aiohttp @@ -169,6 +169,14 @@ Changes ------- + 0.12.0 (2020-02-23) + ^^^^^^^^^^^^^^^^^^^ + * Bump botocore and extras + * Drop support for 3.5 given we are unable to test it with moto + and it will soon be unsupported + * Remove loop parameters for Python 3.8 compliance + * Remove deprecated AioPageIterator.next_page + 0.11.1 (2020-01-03) ^^^^^^^^^^^^^^^^^^^ * Fixed event streaming API calls like S3 Select. @@ -362,12 +370,12 @@ Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Environment :: Web Environment Classifier: Development Status :: 3 - Alpha Classifier: Framework :: AsyncIO +Requires-Python: >=3.6 Provides-Extra: awscli Provides-Extra: boto3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/README.rst new/aiobotocore-0.12.0/README.rst --- old/aiobotocore-0.11.1/README.rst 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/README.rst 2020-02-23 12:32:32.000000000 +0100 @@ -42,13 +42,13 @@ AWS_SECRET_ACCESS_KEY = "xxx" - async def go(loop): + async def go(): bucket = 'dataintake' filename = 'dummy.bin' folder = 'aiobotocore' key = '{}/{}'.format(folder, filename) - session = aiobotocore.get_session(loop=loop) + session = aiobotocore.get_session() async with session.create_client('s3', region_name='us-west-2', aws_secret_access_key=AWS_SECRET_ACCESS_KEY, aws_access_key_id=AWS_ACCESS_KEY_ID) as client: @@ -80,7 +80,7 @@ print(resp) loop = asyncio.get_event_loop() - loop.run_until_complete(go(loop)) + loop.run_until_complete(go()) Supported AWS Services @@ -121,7 +121,7 @@ $ cd aiobotocore $ export AWS_ACCESS_KEY_ID=xxx $ export AWS_SECRET_ACCESS_KEY=xxx - $ pip install -Ur requirements-dev.txt + $ pipenv sync --dev Execute tests suite: @@ -138,12 +138,12 @@ Requirements ------------ -* Python_ 3.5+ +* Python_ 3.6+ * aiohttp_ * botocore_ .. _Python: https://www.python.org -.. _asyncio: http://docs.python.org/3.5/library/asyncio.html +.. _asyncio: https://docs.python.org/3/library/asyncio.html .. _botocore: https://github.com/boto/botocore .. _aiohttp: https://github.com/KeepSafe/aiohttp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/__init__.py new/aiobotocore-0.12.0/aiobotocore/__init__.py --- old/aiobotocore-0.11.1/aiobotocore/__init__.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/__init__.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,4 +1,4 @@ from .session import get_session, AioSession __all__ = ['get_session', 'AioSession'] -__version__ = '0.11.1' +__version__ = '0.12.0' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/args.py new/aiobotocore-0.12.0/aiobotocore/args.py --- old/aiobotocore-0.11.1/aiobotocore/args.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/args.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,6 +1,6 @@ -import asyncio import copy -import botocore.args + +from botocore.args import ClientArgsCreator import botocore.serialize import botocore.parsers from botocore.signers import RequestSigner @@ -9,11 +9,7 @@ from .endpoint import AioEndpointCreator -class AioClientArgsCreator(botocore.args.ClientArgsCreator): - def __init__(self, *args, loop=None, **kwargs): - super().__init__(*args, **kwargs) - self._loop = loop or asyncio.get_event_loop() - +class AioClientArgsCreator(ClientArgsCreator): # NOTE: we override this so we can pull out the custom AioConfig params and # use an AioEndpointCreator def get_client_args(self, service_model, region_name, is_secure, @@ -23,7 +19,7 @@ service_model, client_config, endpoint_bridge, region_name, endpoint_url, is_secure, scoped_config) - service_name = final_args['service_name'] + # service_name = final_args['service_name'] parameter_validation = final_args['parameter_validation'] endpoint_config = final_args['endpoint_config'] protocol = final_args['protocol'] @@ -34,10 +30,6 @@ signing_region = endpoint_config['signing_region'] endpoint_region_name = endpoint_config['region_name'] - if signing_region is None and endpoint_region_name is None: - signing_region, endpoint_region_name = \ - self._get_default_s3_region(service_name, endpoint_bridge) - config_kwargs['region_name'] = endpoint_region_name event_emitter = copy.copy(self._event_emitter) signer = RequestSigner( @@ -49,13 +41,14 @@ config_kwargs['s3'] = s3_config + # aiobotocore addition if isinstance(client_config, AioConfig): connector_args = client_config.connector_args else: connector_args = None new_config = AioConfig(connector_args, **config_kwargs) - endpoint_creator = AioEndpointCreator(event_emitter, loop=self._loop) + endpoint_creator = AioEndpointCreator(event_emitter) endpoint = endpoint_creator.create_endpoint( service_model, region_name=endpoint_region_name, @@ -81,6 +74,5 @@ 'loader': self._loader, 'client_config': new_config, 'partition': partition, - 'exceptions_factory': self._exceptions_factory, - 'loop': self._loop + 'exceptions_factory': self._exceptions_factory } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/client.py new/aiobotocore-0.12.0/aiobotocore/client.py --- old/aiobotocore-0.11.1/aiobotocore/client.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/client.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,5 +1,3 @@ -import asyncio - from botocore.client import logger, PaginatorDocstring, ClientCreator, BaseClient from botocore.exceptions import OperationNotPageableError from botocore.history import get_global_history_recorder @@ -15,11 +13,6 @@ class AioClientCreator(ClientCreator): - - def __init__(self, *args, loop=None, **kwargs): - super().__init__(*args, **kwargs) - self._loop = loop or asyncio.get_event_loop() - def _create_client_class(self, service_name, service_model): class_attributes = self._create_methods(service_model) py_name_to_operation_name = self._create_name_mapping(service_model) @@ -42,18 +35,13 @@ args_creator = AioClientArgsCreator( self._event_emitter, self._user_agent, self._response_parser_factory, self._loader, - self._exceptions_factory, loop=self._loop, - config_store=self._config_store) + self._exceptions_factory, config_store=self._config_store) return args_creator.get_client_args( service_model, region_name, is_secure, endpoint_url, verify, credentials, scoped_config, client_config, endpoint_bridge) class AioBaseClient(BaseClient): - def __init__(self, *args, **kwargs): - self._loop = kwargs.pop('loop', None) or asyncio.get_event_loop() - super().__init__(*args, **kwargs) - async def _make_api_call(self, operation_name, api_params): operation_model = self._service_model.operation_model(operation_name) service_name = self._service_model.service_name @@ -103,11 +91,9 @@ else: return parsed_response - async def _make_request(self, operation_model, request_dict, - request_context): + async def _make_request(self, operation_model, request_dict, request_context): try: - return await self._endpoint.make_request(operation_model, - request_dict) + return await self._endpoint.make_request(operation_model, request_dict) except Exception as e: self.meta.events.emit( 'after-call-error.{service_id}.{operation_name}'.format( @@ -167,14 +153,15 @@ documented_paginator_cls = type( paginator_class_name, (AioPaginator,), {'paginate': paginate}) - operation_model = self._service_model.operation_model( - actual_operation_name) + operation_model = self._service_model.operation_model(actual_operation_name) paginator = documented_paginator_cls( getattr(self, operation_name), paginator_config, operation_model) return paginator + # NOTE: this method does not differ from botocore, however it's important to keep + # as the "waiter" value points to our own asyncio waiter module def get_waiter(self, waiter_name): """Returns an object that can wait for some condition. @@ -196,7 +183,7 @@ raise ValueError("Waiter does not exist: %s" % waiter_name) return waiter.create_waiter_with_client( - mapping[waiter_name], model, self, loop=self._loop) + mapping[waiter_name], model, self) async def __aenter__(self): await self._endpoint.http_session.__aenter__() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/endpoint.py new/aiobotocore-0.12.0/aiobotocore/endpoint.py --- old/aiobotocore-0.11.1/aiobotocore/endpoint.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/endpoint.py 2020-02-23 12:32:32.000000000 +0100 @@ -59,10 +59,8 @@ class AioEndpoint(Endpoint): - def __init__(self, *args, loop=None, proxies=None, **kwargs): + def __init__(self, *args, proxies=None, **kwargs): super().__init__(*args, **kwargs) - - self._loop = loop or asyncio.get_event_loop() self.proxies = proxies or {} async def _send_request(self, request_dict, operation_model): @@ -184,7 +182,7 @@ # for the specified number of times. logger.debug("Response received to retry, sleeping for " "%s seconds", handler_response) - await asyncio.sleep(handler_response, loop=self._loop) + await asyncio.sleep(handler_response) return True async def _send(self, request): @@ -229,10 +227,6 @@ class AioEndpointCreator(EndpointCreator): - def __init__(self, *args, loop=None, **kwargs): - super().__init__(*args, **kwargs) - self._loop = loop - # TODO: handle socket_options def create_endpoint(self, service_model, region_name, endpoint_url, verify=None, response_parser_factory=None, @@ -282,7 +276,6 @@ ssl_context.load_cert_chain(cert_file, key_file) connector = aiohttp.TCPConnector( - loop=self._loop, limit=max_pool_connections, verify_ssl=self._get_verify_value(verify), ssl_context=ssl_context, @@ -293,7 +286,6 @@ timeout=timeout, skip_auto_headers={'CONTENT-TYPE'}, response_class=ClientResponseProxy, - loop=self._loop, auto_decompress=False) return AioEndpoint( @@ -302,4 +294,4 @@ event_emitter=self._event_emitter, response_parser_factory=response_parser_factory, http_session=aio_session, - loop=self._loop, proxies=proxies) + proxies=proxies) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/eventstream.py new/aiobotocore-0.12.0/aiobotocore/eventstream.py --- old/aiobotocore-0.11.1/aiobotocore/eventstream.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/eventstream.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,15 +1,13 @@ from botocore.eventstream import EventStream, EventStreamBuffer -from async_generator import async_generator, yield_ class AioEventStream(EventStream): - @async_generator async def _create_raw_event_generator(self): event_stream_buffer = EventStreamBuffer() async for chunk, _ in self._raw_stream.iter_chunks(): event_stream_buffer.add_data(chunk) for event in event_stream_buffer: - await yield_(event) + yield event def __iter__(self): raise NotImplementedError('Use async-for instead') @@ -17,9 +15,8 @@ def __aiter__(self): return self.__anext__() - @async_generator async def __anext__(self): async for event in self._event_generator: parsed_event = self._parse_event(event) if parsed_event: - await yield_(parsed_event) + yield parsed_event diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/paginate.py new/aiobotocore-0.12.0/aiobotocore/paginate.py --- old/aiobotocore-0.11.1/aiobotocore/paginate.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/paginate.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,64 +1,15 @@ -import asyncio -import warnings - from botocore.exceptions import PaginationError from botocore.paginate import Paginator, PageIterator from botocore.utils import set_value_from_jmespath, merge_dicts from botocore.compat import six -from async_generator import async_generator, yield_ - - -# switch to aioitertools.tee after we're 3.6+ -def aio_tee(itr, n: int = 2): - assert n > 0 - sentinel = object() - queues = [asyncio.Queue() for _ in range(n)] - - @async_generator - async def gen(k: int, q: asyncio.Queue): - if k == 0: - async for value in itr: - await asyncio.gather(*[queue.put(value) - for queue in queues[1:]]) - await yield_(value) - - await asyncio.gather(*[queue.put(sentinel) - for queue in queues[1:]]) - return - - while True: - value = await q.get() - if value is sentinel: - break - - await yield_(value) - - return tuple(gen(k, q) for k, q in enumerate(queues)) +import aioitertools class AioPageIterator(PageIterator): - async def next_page(self): - itr = getattr(self, '_iter', None) - if itr is None: - warnings.warn("next_page is deprecated, use async for instead", - DeprecationWarning) - - self._iter = self.__anext__() - - try: - return await self._iter.__anext__() - except StopAsyncIteration: - self._iter = None - return None - except: # noqa: E722 - self._iter = None - raise - def __aiter__(self): return self.__anext__() - @async_generator async def __anext__(self): current_kwargs = self._op_kwargs previous_next_token = None @@ -106,10 +57,10 @@ self._truncate_response(parsed, primary_result_key, truncate_amount, starting_truncation, next_token) - await yield_(response) + yield response break else: - await yield_(response) + yield response total_items += num_current_response next_token = self._get_next_token(parsed) if all(t is None for t in next_token.values()): @@ -129,7 +80,7 @@ previous_next_token = next_token def result_key_iters(self): - teed_results = aio_tee(self, len(self.result_keys)) + teed_results = aioitertools.tee(self, len(self.result_keys)) return [ResultKeyIterator(i, result_key) for i, result_key in zip(teed_results, self.result_keys)] @@ -204,11 +155,10 @@ def __aiter__(self): return self.__anext__() - @async_generator async def __anext__(self): async for page in self._pages_iterator: results = self.result_key.search(page) if results is None: results = [] for result in results: - await yield_(result) + yield result diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/response.py new/aiobotocore-0.12.0/aiobotocore/response.py --- old/aiobotocore-0.11.1/aiobotocore/response.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/response.py 2020-02-23 12:32:32.000000000 +0100 @@ -3,9 +3,6 @@ import wrapt from botocore.exceptions import IncompleteReadError, ReadTimeoutError -# can remove if we move to py3.6+ -from async_generator import async_generator, yield_ - class AioReadTimeoutError(ReadTimeoutError, asyncio.TimeoutError): pass @@ -75,7 +72,6 @@ anext = __anext__ - @async_generator async def iter_lines(self, chunk_size=1024): """Return an iterator to yield lines from the raw stream. @@ -86,12 +82,11 @@ async for chunk in self.iter_chunks(chunk_size): lines = (pending + chunk).splitlines(True) for line in lines[:-1]: - await yield_(line.splitlines()[0]) + yield line.splitlines()[0] pending = lines[-1] if pending: - await yield_(pending.splitlines()[0]) + yield pending.splitlines()[0] - @async_generator async def iter_chunks(self, chunk_size=_DEFAULT_CHUNK_SIZE): """Return an iterator to yield chunks of chunk_size bytes from the raw stream. @@ -100,7 +95,7 @@ current_chunk = await self.read(chunk_size) if current_chunk == b"": break - await yield_(current_chunk) + yield current_chunk def _verify_content_length(self): # See: https://github.com/kennethreitz/requests/issues/1855 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/session.py new/aiobotocore-0.12.0/aiobotocore/session.py --- old/aiobotocore-0.11.1/aiobotocore/session.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/session.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,4 +1,3 @@ -import asyncio import botocore.credentials import botocore.session @@ -11,9 +10,7 @@ class AioSession(botocore.session.Session): - def __init__(self, *args, loop=None, **kwargs): - self._loop = loop - + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Register the AioResponseParserFactory so event streams will be async'd @@ -71,7 +68,7 @@ client_creator = AioClientCreator( loader, endpoint_resolver, self.user_agent(), event_emitter, retryhandler, translate, response_parser_factory, - exceptions_factory, config_store, loop=self._loop) + exceptions_factory, config_store) client = client_creator.create_client( service_name=service_name, region_name=region_name, is_secure=use_ssl, endpoint_url=endpoint_url, verify=verify, @@ -83,9 +80,8 @@ return client -def get_session(*, env_vars=None, loop=None): +def get_session(env_vars=None): """ Return a new session object. """ - loop = loop or asyncio.get_event_loop() - return AioSession(env_vars, loop=loop) + return AioSession(env_vars) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore/waiter.py new/aiobotocore-0.12.0/aiobotocore/waiter.py --- old/aiobotocore-0.11.1/aiobotocore/waiter.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore/waiter.py 2020-02-23 12:32:32.000000000 +0100 @@ -3,15 +3,13 @@ # WaiterModel is required for client.py import from botocore.exceptions import ClientError from botocore.waiter import WaiterModel # noqa: F401 -from botocore.waiter import Waiter, xform_name, logger, WaiterError +from botocore.waiter import Waiter, xform_name, logger, WaiterError, \ + NormalizedOperationMethod as _NormalizedOperationMethod from botocore.docs.docstring import WaiterDocstring from botocore.utils import get_service_module_name -class NormalizedOperationMethod: - def __init__(self, client_method): - self._client_method = client_method - +class NormalizedOperationMethod(_NormalizedOperationMethod): async def __call__(self, **kwargs): try: return await self._client_method(**kwargs) @@ -20,10 +18,6 @@ class AIOWaiter(Waiter): - def __init__(self, *args, **kwargs): - self._loop = kwargs.pop('loop', None) or asyncio.get_event_loop() - super().__init__(*args, **kwargs) - async def wait(self, **kwargs): acceptors = list(self.config.acceptors) current_state = 'waiting' @@ -68,10 +62,10 @@ reason='Max attempts exceeded', last_response=response ) - await asyncio.sleep(sleep_amount, loop=self._loop) + await asyncio.sleep(sleep_amount) -def create_waiter_with_client(waiter_name, waiter_model, client, loop): +def create_waiter_with_client(waiter_name, waiter_model, client): """ :type waiter_name: str @@ -119,5 +113,5 @@ # Return an instance of the new waiter class. return documented_waiter_cls( - waiter_name, single_waiter_config, operation_method, loop=loop + waiter_name, single_waiter_config, operation_method ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore.egg-info/PKG-INFO new/aiobotocore-0.12.0/aiobotocore.egg-info/PKG-INFO --- old/aiobotocore-0.11.1/aiobotocore.egg-info/PKG-INFO 2020-01-04 07:56:59.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore.egg-info/PKG-INFO 2020-02-23 12:33:11.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: aiobotocore -Version: 0.11.1 +Version: 0.12.0 Summary: Async client for aws services using botocore and aiohttp Home-page: https://github.com/aio-libs/aiobotocore Author: Nikolay Novik @@ -51,13 +51,13 @@ AWS_SECRET_ACCESS_KEY = "xxx" - async def go(loop): + async def go(): bucket = 'dataintake' filename = 'dummy.bin' folder = 'aiobotocore' key = '{}/{}'.format(folder, filename) - session = aiobotocore.get_session(loop=loop) + session = aiobotocore.get_session() async with session.create_client('s3', region_name='us-west-2', aws_secret_access_key=AWS_SECRET_ACCESS_KEY, aws_access_key_id=AWS_ACCESS_KEY_ID) as client: @@ -89,7 +89,7 @@ print(resp) loop = asyncio.get_event_loop() - loop.run_until_complete(go(loop)) + loop.run_until_complete(go()) Supported AWS Services @@ -130,7 +130,7 @@ $ cd aiobotocore $ export AWS_ACCESS_KEY_ID=xxx $ export AWS_SECRET_ACCESS_KEY=xxx - $ pip install -Ur requirements-dev.txt + $ pipenv sync --dev Execute tests suite: @@ -147,12 +147,12 @@ Requirements ------------ - * Python_ 3.5+ + * Python_ 3.6+ * aiohttp_ * botocore_ .. _Python: https://www.python.org - .. _asyncio: http://docs.python.org/3.5/library/asyncio.html + .. _asyncio: https://docs.python.org/3/library/asyncio.html .. _botocore: https://github.com/boto/botocore .. _aiohttp: https://github.com/KeepSafe/aiohttp @@ -169,6 +169,14 @@ Changes ------- + 0.12.0 (2020-02-23) + ^^^^^^^^^^^^^^^^^^^ + * Bump botocore and extras + * Drop support for 3.5 given we are unable to test it with moto + and it will soon be unsupported + * Remove loop parameters for Python 3.8 compliance + * Remove deprecated AioPageIterator.next_page + 0.11.1 (2020-01-03) ^^^^^^^^^^^^^^^^^^^ * Fixed event streaming API calls like S3 Select. @@ -362,12 +370,12 @@ Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Environment :: Web Environment Classifier: Development Status :: 3 - Alpha Classifier: Framework :: AsyncIO +Requires-Python: >=3.6 Provides-Extra: awscli Provides-Extra: boto3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/aiobotocore.egg-info/requires.txt new/aiobotocore-0.12.0/aiobotocore.egg-info/requires.txt --- old/aiobotocore-0.11.1/aiobotocore.egg-info/requires.txt 2020-01-04 07:56:59.000000000 +0100 +++ new/aiobotocore-0.12.0/aiobotocore.egg-info/requires.txt 2020-02-23 12:33:11.000000000 +0100 @@ -1,10 +1,10 @@ -botocore<1.13.15,>=1.13.14 +botocore<1.15.16,>=1.15.3 aiohttp>=3.3.1 wrapt>=1.10.10 -async_generator>=1.10 +aioitertools>=0.5.1 [awscli] -awscli==1.16.278 +awscli==1.18.3 [boto3] -boto3==1.10.14 +boto3==1.12.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aiobotocore-0.11.1/setup.py new/aiobotocore-0.12.0/setup.py --- old/aiobotocore-0.11.1/setup.py 2020-01-04 07:55:36.000000000 +0100 +++ new/aiobotocore-0.12.0/setup.py 2020-02-23 12:32:32.000000000 +0100 @@ -1,32 +1,26 @@ import os import re -import sys from setuptools import setup, find_packages -# NOTE: If adding requirements make sure to also add to requirements-dev.txt +# NOTE: If updating requirements make sure to also check Pipfile for any locks # NOTE: When updating botocore make sure to update awscli/boto3 versions below install_requires = [ # pegged to also match items in `extras_require` - 'botocore>=1.13.14,<1.13.15', + 'botocore>=1.15.3,<1.15.16', 'aiohttp>=3.3.1', 'wrapt>=1.10.10', - 'async_generator>=1.10', # can remove if we move to py3.6+ + 'aioitertools>=0.5.1', ] -PY_VER = sys.version_info - -if not PY_VER >= (3, 5, 3): - raise RuntimeError("aiobotocore doesn't support Python earlier than 3.5.3") - def read(f): return open(os.path.join(os.path.dirname(__file__), f)).read().strip() extras_require = { - 'awscli': ['awscli==1.16.278'], - 'boto3': ['boto3==1.10.14'], + 'awscli': ['awscli==1.18.3'], + 'boto3': ['boto3==1.12.3'], } @@ -48,12 +42,6 @@ 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'Programming Language :: Python :: 3', - - # switch tee in paginate.py + zip_longest in test_basic_s3.py to - # aioitertools after we're 3.6+ - # We'll need: https://github.com/jreese/aioitertools/issues/11 and - # https://github.com/jreese/aioitertools/issues/13 - 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', @@ -63,17 +51,20 @@ ] -setup(name='aiobotocore', - version=read_version(), - description='Async client for aws services using botocore and aiohttp', - long_description='\n\n'.join((read('README.rst'), read('CHANGES.rst'))), - classifiers=classifiers, - author="Nikolay Novik", - author_email="nickolaino...@gmail.com", - url='https://github.com/aio-libs/aiobotocore', - download_url='https://pypi.python.org/pypi/aiobotocore', - license='Apache 2', - packages=find_packages(), - install_requires=install_requires, - extras_require=extras_require, - include_package_data=True) +setup( + name='aiobotocore', + version=read_version(), + description='Async client for aws services using botocore and aiohttp', + long_description='\n\n'.join((read('README.rst'), read('CHANGES.rst'))), + classifiers=classifiers, + author="Nikolay Novik", + author_email="nickolaino...@gmail.com", + url='https://github.com/aio-libs/aiobotocore', + download_url='https://pypi.python.org/pypi/aiobotocore', + license='Apache 2', + packages=find_packages(), + python_requires='>=3.6', + install_requires=install_requires, + extras_require=extras_require, + include_package_data=True +)