[PATCH] api: support filtering patches by hash
Daniel Axtens
dja at axtens.net
Thu Nov 7 00:44:31 AEDT 2019
Hi Stephen,
> class Meta:
> model = Patch
> + # NOTE(dja): ideally we want to version the hash field, but I cannot
> + # find a way to do that which is reliable and not extremely ugly.
> + # The best I can come up with is manually working with request.GET
> + # which seems to rather defeat the point of using django-filters.
> fields = ('project', 'series', 'submitter', 'delegate',
> - 'state', 'archived')
> + 'state', 'archived', 'hash')
>
Just hoping to get your Ack on this part of the patch, in case you had
some Deep Magic that could achieve your goals of API purity.
Regards,
Daniel
>
> class CheckFilterSet(TimestampMixin, FilterSet):
> diff --git patchwork/tests/api/test_patch.py patchwork/tests/api/test_patch.py
> index edae9851c422..4afc15a9ba1c 100644
> --- patchwork/tests/api/test_patch.py
> +++ patchwork/tests/api/test_patch.py
> @@ -22,6 +22,13 @@ from patchwork.tests.utils import create_user
> if settings.ENABLE_REST_API:
> from rest_framework import status
>
> +# a diff different from the default, required to test hash filtering
> +SAMPLE_DIFF = """--- /dev/null\t2019-01-01 00:00:00.000000000 +0800
> ++++ a\t2019-01-01 00:00:00.000000000 +0800
> +@@ -0,0 +1 @@
> ++b
> +"""
> +
>
> @unittest.skipUnless(settings.ENABLE_REST_API, 'requires ENABLE_REST_API')
> class TestPatchAPI(utils.APITestCase):
> @@ -152,6 +159,35 @@ class TestPatchAPI(utils.APITestCase):
> 'submitter': 'test at example.org'})
> self.assertEqual(0, len(resp.data))
>
> + def test_list_filter_hash(self):
> + """Filter patches by hash."""
> + patch = self._create_patch()
> + patch_new_diff = create_patch(state=patch.state, project=patch.project,
> + submitter=patch.submitter,
> + diff=SAMPLE_DIFF)
> +
> + # check regular filtering
> + resp = self.client.get(self.api_url(), {'hash': patch.hash})
> + self.assertEqual([patch.id], [x['id'] for x in resp.data])
> +
> + # 2 patches with identical diffs
> + patch_same_diff = create_patch(state=patch.state,
> + project=patch.project,
> + submitter=patch.submitter)
> + resp = self.client.get(self.api_url(), {'hash': patch.hash})
> + self.assertEqual([patch.id, patch_same_diff.id],
> + [x['id'] for x in resp.data])
> +
> + # case insensitive matching
> + resp = self.client.get(self.api_url(),
> + {'hash': patch_new_diff.hash.upper()})
> + self.assertEqual([patch_new_diff.id], [x['id'] for x in resp.data])
> +
> + # empty response if nothing matches
> + resp = self.client.get(self.api_url(), {
> + 'hash': 'da638d0746a115000bf890fada1f02679aa282e8'})
> + self.assertEqual(0, len(resp.data))
> +
> @utils.store_samples('patch-list-1-0')
> def test_list_version_1_0(self):
> """List patches using API v1.0."""
> diff --git releasenotes/notes/rest-filter-hash-e031bd3db42eb540.yaml releasenotes/notes/rest-filter-hash-e031bd3db42eb540.yaml
> new file mode 100644
> index 000000000000..b805931d4d80
> --- /dev/null
> +++ releasenotes/notes/rest-filter-hash-e031bd3db42eb540.yaml
> @@ -0,0 +1,5 @@
> +---
> +api:
> + - |
> + The REST API now supports filtering patches by their hashes, using the
> + ``hash`` query parameter.
> --
> 2.20.1
More information about the Patchwork
mailing list