@@ -168,6 +168,9 @@ def __getitem__(self, resource_id):
168168 """
169169 return self .resource (resource_id )
170170
171+ def __call__ (self , name ):
172+ return self .action (name )
173+
171174 def all (self ):
172175 """
173176 Return a ResourceSet instance.
@@ -258,6 +261,29 @@ def resource(self, resource_id):
258261 f'{ self ._path } /{ resource_id } ' ,
259262 )
260263
264+ def action (self , name ):
265+ """
266+ Returns the action called ``name``.
267+
268+ :param name: The name of the action.
269+ :type name: str
270+ :raises TypeError: if the ``name`` is not a string.
271+ :raises ValueError: if the ``name`` is blank.
272+ :raises NotFoundError: if the ``name`` does not exist.
273+ :return: The action called ``name``.
274+ :rtype: Action
275+ """
276+ if not isinstance (name , str ):
277+ raise TypeError ('`name` must be a string.' )
278+
279+ if not name :
280+ raise ValueError ('`name` must not be blank.' )
281+
282+ return self ._get_action_class ()(
283+ self ._client ,
284+ f'{ self ._path } /{ name } ' ,
285+ )
286+
261287 def help (self ):
262288 """
263289 Output the collection documentation to the console.
@@ -274,6 +300,9 @@ def _get_resource_class(self):
274300 def _get_resourceset_class (self ):
275301 return NotImplementedError () # pragma: no cover
276302
303+ def _get_action_class (self ):
304+ raise NotImplementedError () # pragma: no cover
305+
277306
278307class Collection (_CollectionBase , CollectionMixin ):
279308 def _get_resource_class (self ):
@@ -282,6 +311,9 @@ def _get_resource_class(self):
282311 def _get_resourceset_class (self ):
283312 return ResourceSet
284313
314+ def _get_action_class (self ):
315+ return Action
316+
285317
286318class AsyncCollection (_CollectionBase , AsyncCollectionMixin ):
287319 def _get_resource_class (self ):
@@ -290,6 +322,9 @@ def _get_resource_class(self):
290322 def _get_resourceset_class (self ):
291323 return AsyncResourceSet
292324
325+ def _get_action_class (self ):
326+ return AsyncAction
327+
293328
294329class _ResourceBase :
295330 """Represent a generic resource."""
0 commit comments