diff --git a/.changes/1.12.47.json b/.changes/1.12.47.json new file mode 100644 index 0000000000..4dc67bf541 --- /dev/null +++ b/.changes/1.12.47.json @@ -0,0 +1,27 @@ +[ + { + "category": "Resource", + "description": "fixes `#2361 `__", + "type": "bugfix" + }, + { + "category": "``dms``", + "description": "[``botocore``] Update dms client to latest version", + "type": "api-change" + }, + { + "category": "``dataexchange``", + "description": "[``botocore``] Update dataexchange client to latest version", + "type": "api-change" + }, + { + "category": "``accessanalyzer``", + "description": "[``botocore``] Update accessanalyzer client to latest version", + "type": "api-change" + }, + { + "category": "``sagemaker``", + "description": "[``botocore``] Update sagemaker client to latest version", + "type": "api-change" + } +] \ No newline at end of file diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 95700f7169..09662b486c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,16 @@ CHANGELOG ========= +1.12.47 +======= + +* bugfix:Resource: fixes `#2361 `__ +* api-change:``dms``: [``botocore``] Update dms client to latest version +* api-change:``dataexchange``: [``botocore``] Update dataexchange client to latest version +* api-change:``accessanalyzer``: [``botocore``] Update accessanalyzer client to latest version +* api-change:``sagemaker``: [``botocore``] Update sagemaker client to latest version + + 1.12.46 ======= diff --git a/boto3/__init__.py b/boto3/__init__.py index 1a363fd486..562a0f0d1e 100644 --- a/boto3/__init__.py +++ b/boto3/__init__.py @@ -17,7 +17,7 @@ __author__ = 'Amazon Web Services' -__version__ = '1.12.46' +__version__ = '1.12.47' # The default Boto3 session; autoloaded when needed. diff --git a/boto3/resources/action.py b/boto3/resources/action.py index 52dea55d1a..b643426a4c 100644 --- a/boto3/resources/action.py +++ b/boto3/resources/action.py @@ -80,7 +80,7 @@ def __call__(self, parent, *args, **kwargs): logger.debug('Calling %s:%s with %r', parent.meta.service_name, operation_name, params) - response = getattr(parent.meta.client, operation_name)(**params) + response = getattr(parent.meta.client, operation_name)(*args, **params) logger.debug('Response: %r', response) @@ -149,7 +149,7 @@ def __call__(self, parent, *args, **kwargs): logger.debug('Calling %s:%s with %r', service_name, operation_name, params) - response = getattr(client, operation_name)(**params) + response = getattr(client, operation_name)(*args, **params) logger.debug('Response: %r', response) diff --git a/setup.cfg b/setup.cfg index 147560f5d4..559b07c2ee 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,6 +3,6 @@ universal = 1 [metadata] requires-dist = - botocore>=1.15.46,<1.16.0 + botocore>=1.15.47,<1.16.0 jmespath>=0.7.1,<1.0.0 s3transfer>=0.3.0,<0.4.0 diff --git a/setup.py b/setup.py index 50ba57b19f..cf43a7895a 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ requires = [ - 'botocore>=1.15.46,<1.16.0', + 'botocore>=1.15.47,<1.16.0', 'jmespath>=0.7.1,<1.0.0', 's3transfer>=0.3.0,<0.4.0' ] diff --git a/tests/unit/resources/test_action.py b/tests/unit/resources/test_action.py index 5a21f4fb92..24b98daf2a 100644 --- a/tests/unit/resources/test_action.py +++ b/tests/unit/resources/test_action.py @@ -123,6 +123,21 @@ def test_service_action_calls_resource_handler(self, handler_mock, params_mock): operation_name='GetFrobs' ) + def test_service_action_call_positional_argument(self): + def _api_call(*args, **kwargs): + if args: + raise TypeError( + "%s() only accepts keyword arguments." % 'get_frobs') + + resource = mock.Mock() + resource.meta = ResourceMeta('test', client=mock.Mock()) + resource.meta.client.get_frobs = _api_call + + action = ServiceAction(self.action) + + with self.assertRaises(TypeError): + action(resource, 'item1') + class TestWaiterActionCall(BaseTestCase): def setUp(self): @@ -274,3 +289,30 @@ def side_effect(resource, model, params=None, index=None): crp_mock.assert_called_with(item, model.request, params={'foo': 'bar'}, index=0) client.get_frobs.assert_called_with(foo='bar') + + @mock.patch('boto3.resources.action.create_request_parameters') + def test_batch_action_with_positional_argument(self, crp_mock): + def side_effect(resource, model, params=None, index=None): + params['foo'] = 'bar' + + def _api_call(*args, **kwargs): + if args: + raise TypeError( + "%s() only accepts keyword arguments." % 'get_frobs') + + crp_mock.side_effect = side_effect + + client = mock.Mock() + client.get_frobs = _api_call + + item = mock.Mock() + item.meta = ResourceMeta('test', client=client) + + collection = mock.Mock() + collection.pages.return_value = [[item]] + + model = self.model + action = BatchAction(model) + + with self.assertRaises(TypeError): + action(collection, 'item1')