[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