diff --git a/redmine/managers.py b/redmine/managers.py index b527af8..09a5b8f 100644 --- a/redmine/managers.py +++ b/redmine/managers.py @@ -112,6 +112,10 @@ def new(self): """Returns new empty resource""" return self.to_resource({}) + def get_all_by_attribute(self, name, value): + """Returns an attribute by filtering down all items by name == value""" + return (item for item in self.all() if getattr(item, name) == value) + def get(self, resource_id, **params): """Returns a Resource object directly by resource id (can be either integer id or string identifier)""" if self.resource_class.query_one is None or self.resource_class.container_one is None: diff --git a/tests/test_managers.py b/tests/test_managers.py index 22bfc8a..0c47ab2 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -2,7 +2,12 @@ from redmine.managers import ResourceManager from redmine.resources import Project from redmine.resultsets import ResourceSet -from redmine.exceptions import ResourceBadMethodError, ValidationError +from redmine.exceptions import ( + ResourceBadMethodError, + ValidationError, + ResourceNotFoundError, + ResourceAttrError +) class FooResource(Project): @@ -105,6 +110,49 @@ def test_convert_dicts_to_resource_set_object(self): self.assertEqual(resourceset[1].identifier, 'bar') self.assertEqual(resourceset[1].id, 2) + @mock.patch('requests.get') + def test_get_all_by_attribute_returns_generator(self, mock_get): + import types + trackers = { + 'trackers': + [ + {'name': 'Foo', 'id': 1}, + {'name': 'Foo', 'id': 2}, + {'name': 'Bar', 'id': 3}, + ] + } + mock_get.return_value = response = mock.Mock(status_code=200) + response.json = json_response(trackers) + foo = self.redmine.tracker.get_all_by_attribute('name','Foo') + self.assertIsInstance(foo, types.GeneratorType) + + @mock.patch('requests.get') + def test_get_all_by_attribute(self, mock_get): + trackers = { + 'trackers': + [ + {'name': 'Foo', 'id': 1}, + {'name': 'Foo', 'id': 2}, + {'name': 'Bar', 'id': 3}, + ] + } + mock_get.return_value = response = mock.Mock(status_code=200) + response.json = json_response(trackers) + foo = list(self.redmine.tracker.get_all_by_attribute('name', 'Foo')) + bar = list(self.redmine.tracker.get_all_by_attribute('id', 3)) + self.assertEqual('Foo', foo[0].name) + self.assertEqual('Foo', foo[1].name) + self.assertEqual(1, foo[0].id) + self.assertEqual(2, foo[1].id) + self.assertEqual('Bar', bar[0].name) + self.assertEqual(3, bar[0].id) + + @mock.patch('requests.get') + def test_get_all_by_attribute_returns_empty_recordset(self, mock_get): + mock_get.return_value = response = mock.Mock(status_code=200) + response.json = json_response({'trackers': []}) + self.assertEqual([], list(self.redmine.tracker.get_all_by_attribute('foo','bar'))) + @mock.patch('requests.get') def test_get_single_resource(self, mock_get): mock_get.return_value = response = mock.Mock(status_code=200)