From 085e23f63fd66f6a9b00bfa994501eb60d75ea0e Mon Sep 17 00:00:00 2001 From: Richie Humphrey Date: Sun, 26 Sep 2021 14:06:34 -0700 Subject: [PATCH] adds multiple query filter --- func_sig_registry/registry/filters.py | 5 +++ .../templates/documentation.html | 13 +++++- .../api/test_searching_signature_api_view.py | 40 +++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/func_sig_registry/registry/filters.py b/func_sig_registry/registry/filters.py index a5920ca..2362c9d 100644 --- a/func_sig_registry/registry/filters.py +++ b/func_sig_registry/registry/filters.py @@ -15,6 +15,7 @@ class SignatureFilter(filters.FilterSet): text_signature = filters.CharFilter(name='text_signature', lookup_type='icontains') bytes_signature = filters.MethodFilter() hex_signature = filters.MethodFilter() + hex_signature__in = filters.MethodFilter() class Meta: model = Signature @@ -34,6 +35,10 @@ def filter_hex_signature(self, name, qs, value): else: return qs.filter(bytes_signature__hex_signature__icontains=unprefixed_value) + def filter_hex_signature__in(self, name, qs, values): + unprefixed_values = [remove_0x_prefix(value.lower()) for value in values.split(',')] + return qs.filter(bytes_signature__hex_signature__in=unprefixed_values) + class EventSignatureFilter(filters.FilterSet): created_at = filters.AllLookupsFilter(name='created_at') diff --git a/func_sig_registry/templates/documentation.html b/func_sig_registry/templates/documentation.html index 7cbab97..eca3b2e 100644 --- a/func_sig_registry/templates/documentation.html +++ b/func_sig_registry/templates/documentation.html @@ -127,6 +127,17 @@

Filtering on hex_signature

  • If the provided query is less than 4 bytes long then the results are filtered by substring match.
  • If the provided query is longer than 4 bytes then the results are not filtered since it is an invalid query.
  • +

    Filtering on multiple hex_signatures

    +

    Match multiple queries using the hex_signature__in filter with multiple comma delimited hex_signatures.

    +
    /api/v1/signatures/?hex_signature__in=0xabcd1234,0xefgh6789
    + +

    +

    +

    Creating Signatures /api/v1/signatures/ POST

    Creates a new signature

    Example Request

    @@ -186,7 +197,7 @@

    Event Signatures

  • text_signature (string): The text representation of the event signature.
  • bytes_signature (string): The 32-byte event selector
  • hex_signature (string): The hex encoded 32-byte event selector.
  • - +
    {
       "id": 19,
       "created_at": "2020-09-13T18:45:58.559831Z",
    diff --git a/tests/web/api/test_searching_signature_api_view.py b/tests/web/api/test_searching_signature_api_view.py
    index d907efd..9426ca5 100644
    --- a/tests/web/api/test_searching_signature_api_view.py
    +++ b/tests/web/api/test_searching_signature_api_view.py
    @@ -36,6 +36,46 @@ def test_exact_without_0x_hex_search(api_client, factories):
         assert result['id'] == s2.id
     
     
    +def test_multiple_exact_hex_search(api_client, factories):
    +    list_url = reverse('api:signature-list')
    +    s1, s2, s3, s4, s5 = factories.SignatureFactory.create_batch(5)
    +
    +    search_url = list_url + '?hex_signature__in={0},{1},{2}'.format(
    +        s2.bytes_signature.get_hex_display(),
    +        s4.bytes_signature.get_hex_display(),
    +        s5.bytes_signature.get_hex_display(),
    +    )
    +    response = api_client.get(search_url)
    +
    +    assert response.status_code == status.HTTP_200_OK
    +    data = response.data
    +    assert data['count'] == 3
    +    actual_results = sorted([item['id'] for item in data['results']])
    +    assert len(actual_results) == 3
    +    expected_results = sorted([s2.id, s4.id, s5.id])
    +    assert actual_results == expected_results
    +
    +
    +def test_multiple_exact_without_0x_hex_search(api_client, factories):
    +    list_url = reverse('api:signature-list')
    +    s1, s2, s3, s4, s5 = factories.SignatureFactory.create_batch(5)
    +
    +    search_url = list_url + '?hex_signature__in={0},{1},{2}'.format(
    +        s1.bytes_signature.get_hex_display()[2:],
    +        s3.bytes_signature.get_hex_display()[2:],
    +        s4.bytes_signature.get_hex_display()[2:],
    +    )
    +    response = api_client.get(search_url)
    +
    +    assert response.status_code == status.HTTP_200_OK
    +    data = response.data
    +    assert data['count'] == 3
    +    actual_results = sorted([item['id'] for item in data['results']])
    +    assert len(actual_results) == 3
    +    expected_results = sorted([s1.id, s3.id, s4.id])
    +    assert actual_results == expected_results
    +
    +
     def test_substring_hex_search_with_0x(api_client, factories):
         list_url = reverse('api:signature-list')
         s1, s2, s3, s4, s5 = factories.SignatureFactory.create_batch(5)