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 @@
hex_signaturehex_signaturesMatch multiple queries using the hex_signature__in filter with multiple comma delimited hex_signatures.
/api/v1/signatures/?hex_signature__in=0xabcd1234,0xefgh6789
+ The 0x prefix on the query value is optional.
+
/api/v1/signatures/ POSTCreates a new signature
text_signature (string): The text representation of the event signature.bytes_signature (string): The 32-byte event selectorhex_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)