From 8b1a8291303352d5d63a1f4c32a6c17261f6ebdb Mon Sep 17 00:00:00 2001 From: raittes Date: Wed, 6 Aug 2025 15:35:56 -0300 Subject: [PATCH 1/3] circleci: build package --- .circleci/config.yml | 33 +++++++++++++++++++++++++++++++++ Makefile | 12 ++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 Makefile diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..7c00fc69 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,33 @@ +tag-pattern: &tag-pattern + only: /^\d+\.\d+\.\d+$/ + +version: 2.1 + +jobs: + deploy: + docker: + - image: cimg/python:3.12 + steps: + - checkout + - run: + name: Package + command: make package + - persist_to_workspace: + root: . + paths: + - "dist" + +workflows: + version: 2 + main: + jobs: + - deploy: + context: org-global + requires: + - lint + - tests + filters: + branches: + ignore: /.*/ + tags: + <<: *tag-pattern diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..107777e4 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +clean: + rm -rf build dist *.egg-info + +dist: + python3 setup.py bdist_wheel --universal + +upload: + curl -F package=@`find dist -name "django_elasticsearch_dsl_drf-*.whl"` $(PRIVATE_PYPI_UPLOAD_URL) + curl -F package=@`find dist -name "django_elasticsearch_dsl_drf-*.whl"` $(FURY_LABCODES_PRIVATE_PYPI_UPLOAD_URL) + + +package: clean dist upload From fa7584efdec81acc6151fd60c5799567ee13c132 Mon Sep 17 00:00:00 2001 From: Rafael Cassau Date: Wed, 6 Aug 2025 15:47:11 -0300 Subject: [PATCH 2/3] Nexus: Add compatibity to import AggsProxy from elasticsearch v8 --- .../filter_backends/suggester/functional.py | 183 ++++++++---------- src/django_elasticsearch_dsl_drf/utils.py | 24 ++- 2 files changed, 92 insertions(+), 115 deletions(-) diff --git a/src/django_elasticsearch_dsl_drf/filter_backends/suggester/functional.py b/src/django_elasticsearch_dsl_drf/filter_backends/suggester/functional.py index 909f0d26..ef985f42 100644 --- a/src/django_elasticsearch_dsl_drf/filter_backends/suggester/functional.py +++ b/src/django_elasticsearch_dsl_drf/filter_backends/suggester/functional.py @@ -67,7 +67,15 @@ >>> >>> model = Publisher # The model associate with this Document """ -from elasticsearch_dsl.search import AggsProxy + +try: # code for 8.13 (requires 8.13.1) + # This should not be imported in external projects, as it is a internal tool. + # See https://github.com/barseghyanartur/django-elasticsearch-dsl-drf/pull/316/files#r1596499499 + from elasticsearch_dsl.search_base import AggsProxy +except ImportError: + # backward-compatible (older than 8.13) + from elasticsearch_dsl.search import AggsProxy + from django_elasticsearch_dsl_drf.constants import ( FUNCTIONAL_SUGGESTER_TERM_MATCH, @@ -85,12 +93,11 @@ from ..mixins import FilterBackendMixin -__title__ = 'django_elasticsearch_dsl_drf.filter_backends.suggester.' \ - 'functional' -__author__ = 'Artur Barseghyan ' -__copyright__ = '2017-2020 Artur Barseghyan' -__license__ = 'GPL 2.0/LGPL 2.1' -__all__ = ('FunctionalSuggesterFilterBackend',) +__title__ = "django_elasticsearch_dsl_drf.filter_backends.suggester." "functional" +__author__ = "Artur Barseghyan " +__copyright__ = "2017-2020 Artur Barseghyan" +__license__ = "GPL 2.0/LGPL 2.1" +__all__ = ("FunctionalSuggesterFilterBackend",) class FunctionalSuggesterFilterBackend(BaseFilterBackend, FilterBackendMixin): @@ -172,16 +179,12 @@ def prepare_suggester_fields(cls, view): for field, options in filter_fields.items(): if options is None or isinstance(options, string_types): - filter_fields[field] = { - 'field': options or field - } - elif 'field' not in filter_fields[field]: - filter_fields[field]['field'] = field + filter_fields[field] = {"field": options or field} + elif "field" not in filter_fields[field]: + filter_fields[field]["field"] = field - if 'suggesters' not in filter_fields[field]: - filter_fields[field]['suggesters'] = tuple( - ALL_FUNCTIONAL_SUGGESTERS - ) + if "suggesters" not in filter_fields[field]: + filter_fields[field]["suggesters"] = tuple(ALL_FUNCTIONAL_SUGGESTERS) return filter_fields @@ -239,19 +242,16 @@ def apply_query_size(cls, queryset, options): :param options: :return: """ - if 'size' in options['options']: + if "size" in options["options"]: queryset = queryset.extra( - from_=options['options'].get('from', 0), - size=options['options']['size'] + from_=options["options"].get("from", 0), size=options["options"]["size"] ) return queryset @classmethod - def apply_suggester_completion_prefix(cls, - suggester_name, - queryset, - options, - value): + def apply_suggester_completion_prefix( + cls, suggester_name, queryset, options, value + ): """Apply `completion` suggester prefix. This is effective when used with Keyword fields. @@ -267,19 +267,12 @@ def apply_suggester_completion_prefix(cls, :return: Modified queryset. :rtype: elasticsearch_dsl.search.Search """ - queryset = queryset.query( - 'prefix', - **{options['field']: value} - ) + queryset = queryset.query("prefix", **{options["field"]: value}) queryset = cls.apply_query_size(queryset, options) return queryset @classmethod - def apply_suggester_completion_match(cls, - suggester_name, - queryset, - options, - value): + def apply_suggester_completion_match(cls, suggester_name, queryset, options, value): """Apply `completion` suggester match. This is effective when used with Ngram fields. @@ -295,10 +288,7 @@ def apply_suggester_completion_match(cls, :return: Modified queryset. :rtype: elasticsearch_dsl.search.Search """ - queryset = queryset.query( - 'match', - **{options['field']: value} - ) + queryset = queryset.query("match", **{options["field"]: value}) queryset = cls.apply_query_size(queryset, options) return queryset @@ -317,10 +307,7 @@ def get_suggester_query_params(self, request, view): suggester_query_params = {} suggester_fields = self.prepare_suggester_fields(view) for query_param in query_params: - query_param_list = self.split_lookup_filter( - query_param, - maxsplit=1 - ) + query_param_list = self.split_lookup_filter(query_param, maxsplit=1) field_name = query_param_list[0] if field_name in suggester_fields: @@ -328,61 +315,56 @@ def get_suggester_query_params(self, request, view): if len(query_param_list) > 1: suggester_param = query_param_list[1] - valid_suggesters = suggester_fields[field_name]['suggesters'] + valid_suggesters = suggester_fields[field_name]["suggesters"] suggester_options = {} # If we have default suggester given use it as a default and # do not require further suffix specification. default_suggester = None - if 'default_suggester' in suggester_fields[field_name]: - default_suggester = \ - suggester_fields[field_name]['default_suggester'] + if "default_suggester" in suggester_fields[field_name]: + default_suggester = suggester_fields[field_name][ + "default_suggester" + ] - if 'options' in suggester_fields[field_name]: - suggester_options = suggester_fields[field_name]['options'] + if "options" in suggester_fields[field_name]: + suggester_options = suggester_fields[field_name]["options"] - if suggester_param is None \ - or suggester_param in valid_suggesters: + if suggester_param is None or suggester_param in valid_suggesters: # If we have default suggester given use it as a default # and do not require further suffix specification. - if suggester_param is None \ - and default_suggester is not None: + if suggester_param is None and default_suggester is not None: suggester_param = str(default_suggester) values = [ __value.strip() - for __value - in query_params.getlist(query_param) - if __value.strip() != '' + for __value in query_params.getlist(query_param) + if __value.strip() != "" ] # If specific field given, use that. Otherwise, # fall back to the top level field name. - if 'serializer_field' in suggester_fields[field_name]: - serializer_field = \ - suggester_fields[field_name]['serializer_field'] + if "serializer_field" in suggester_fields[field_name]: + serializer_field = suggester_fields[field_name][ + "serializer_field" + ] else: serializer_field = suggester_fields[field_name].get( - 'field', - field_name - ) - serializer_field = self.extract_field_name( - serializer_field + "field", field_name ) + serializer_field = self.extract_field_name(serializer_field) if values: suggester_query_params[query_param] = { - 'suggester': suggester_param, - 'values': values, - 'field': suggester_fields[field_name].get( - 'field', - field_name + "suggester": suggester_param, + "values": values, + "field": suggester_fields[field_name].get( + "field", field_name ), - 'type': view.mapping, - 'serializer_field': serializer_field, - 'options': suggester_options, + "type": view.mapping, + "serializer_field": serializer_field, + "options": suggester_options, } return suggester_query_params @@ -396,17 +378,13 @@ def clean_queryset(self, queryset): :param queryset: :return: """ - queryset.aggs = AggsProxy('') + queryset.aggs = AggsProxy("") queryset._highlight = {} - queryset._sort = ['_score'] + queryset._sort = ["_score"] queryset._functional_suggest = True return queryset - def serialize_queryset(self, - queryset, - suggester_name, - value, - serializer_field): + def serialize_queryset(self, queryset, suggester_name, value, serializer_field): """Serialize queryset. This shall be done here, since we don't want to delegate it to @@ -420,18 +398,20 @@ def serialize_queryset(self, """ result = queryset.execute().to_dict() hits = [] - for hit in result['hits']['hits']: - hit.update({'text': hit['_source'].get(serializer_field)}) + for hit in result["hits"]["hits"]: + hit.update({"text": hit["_source"].get(serializer_field)}) hits.append(hit) data = { - suggester_name: [{ - 'text': value, - 'options': hits, - 'length': len(value), - 'offset': 0, - }], - '_shards': result['_shards'], + suggester_name: [ + { + "text": value, + "options": hits, + "length": len(value), + "offset": 0, + } + ], + "_shards": result["_shards"], } return data @@ -445,7 +425,7 @@ def extract_field_name(self, field_name): :return: :rtype: str """ - return field_name.split('.')[0] + return field_name.split(".")[0] def filter_queryset(self, request, queryset, view): """Filter the queryset. @@ -462,7 +442,7 @@ def filter_queryset(self, request, queryset, view): # The ``SuggesterFilterBackend`` filter backend shall be used in # the ``suggest`` custom view action/route only. Usages outside of the # are ``suggest`` action/route are restricted. - if view.action != 'functional_suggest': + if view.action != "functional_suggest": return queryset # Clean the queryset. @@ -477,33 +457,25 @@ def filter_queryset(self, request, queryset, view): for suggester_name, options in suggester_query_params.items(): # We don't have multiple values here. - for value in options['values']: + for value in options["values"]: # `completion` suggester - if options['suggester'] == \ - FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX: + if options["suggester"] == FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX: queryset = self.apply_suggester_completion_prefix( - suggester_name, - queryset, - options, - value + suggester_name, queryset, options, value ) applied = True picked_suggester_name = suggester_name picked_value = value - picked_serializer_field = options['serializer_field'] + picked_serializer_field = options["serializer_field"] - elif options['suggester'] == \ - FUNCTIONAL_SUGGESTER_COMPLETION_MATCH: + elif options["suggester"] == FUNCTIONAL_SUGGESTER_COMPLETION_MATCH: queryset = self.apply_suggester_completion_match( - suggester_name, - queryset, - options, - value + suggester_name, queryset, options, value ) applied = True picked_suggester_name = suggester_name picked_value = value - picked_serializer_field = options['serializer_field'] + picked_serializer_field = options["serializer_field"] # # `term` suggester # elif options['suggester'] == SUGGESTER_TERM: @@ -529,8 +501,5 @@ def filter_queryset(self, request, queryset, view): # return empty_queryset return self.serialize_queryset( - queryset, - picked_suggester_name, - picked_value, - picked_serializer_field + queryset, picked_suggester_name, picked_value, picked_serializer_field ) diff --git a/src/django_elasticsearch_dsl_drf/utils.py b/src/django_elasticsearch_dsl_drf/utils.py index 3487565a..8a4e7dca 100644 --- a/src/django_elasticsearch_dsl_drf/utils.py +++ b/src/django_elasticsearch_dsl_drf/utils.py @@ -3,16 +3,24 @@ """ import datetime -from elasticsearch_dsl.search import AggsProxy -__title__ = 'django_elasticsearch_dsl_drf.utils' -__author__ = 'Artur Barseghyan ' -__copyright__ = '2017-2020 Artur Barseghyan' -__license__ = 'GPL 2.0/LGPL 2.1' +try: # code for 8.13 (requires 8.13.1) + # This should not be imported in external projects, as it is a internal tool. + # See https://github.com/barseghyanartur/django-elasticsearch-dsl-drf/pull/316/files#r1596499499 + from elasticsearch_dsl.search_base import AggsProxy +except ImportError: + # backward-compatible (older than 8.13) + from elasticsearch_dsl.search import AggsProxy + + +__title__ = "django_elasticsearch_dsl_drf.utils" +__author__ = "Artur Barseghyan " +__copyright__ = "2017-2020 Artur Barseghyan" +__license__ = "GPL 2.0/LGPL 2.1" __all__ = ( - 'DictionaryProxy', - 'EmptySearch', + "DictionaryProxy", + "EmptySearch", ) @@ -20,7 +28,7 @@ class EmptySearch(object): """Empty Search.""" def __init__(self, *args, **kwargs): - self.aggs = AggsProxy('') + self.aggs = AggsProxy("") self._highlight = {} self._sort = [] self.total = 0 From 72f08aaa3b0784da989c30d68e6b06ec3c53ed90 Mon Sep 17 00:00:00 2001 From: Rafael Cassau Date: Wed, 6 Aug 2025 16:17:07 -0300 Subject: [PATCH 3/3] Change version --- setup.py | 254 +++++++++++++++++++++++++++---------------------------- 1 file changed, 127 insertions(+), 127 deletions(-) diff --git a/setup.py b/setup.py index dd059962..ac182ad4 100644 --- a/setup.py +++ b/setup.py @@ -2,182 +2,182 @@ from setuptools import find_packages, setup -version = '0.22.5' +version = "1.0" DOCS_TRANSFORMATIONS = ( ( - ':doc:`Dynamic serializer for Documents `', - '`Dynamic serializer for Documents <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'basic_usage_examples.html#sample-serializer' - '>`_'.format(version) + ":doc:`Dynamic serializer for Documents `", + "`Dynamic serializer for Documents <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "basic_usage_examples.html#sample-serializer" + ">`_".format(version), ), ( - ':doc:`Search filter backend `', - '`Search filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#search' - '>`_'.format(version) + ":doc:`Search filter backend `", + "`Search filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#search" + ">`_".format(version), ), ( - ':doc:`Ordering filter backend `', - '`Ordering filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#ordering' - '>`_'.format(version) + ":doc:`Ordering filter backend `", + "`Ordering filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#ordering" + ">`_".format(version), ), ( - ':doc:`Filtering filter backend `', - '`Filtering filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#filtering' - '>`_'.format(version) + ":doc:`Filtering filter backend `", + "`Filtering filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#filtering" + ">`_".format(version), ), ( - ':doc:`Geo-spatial filtering filter backend `', - '`Geo-spatial filtering filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#geo-spatial-features' - '>`_'.format(version) + ":doc:`Geo-spatial filtering filter backend `", + "`Geo-spatial filtering filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#geo-spatial-features" + ">`_".format(version), ), ( - ':doc:`Geo-spatial ordering filter backend `', - '`Geo-spatial ordering filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#geo-spatial-features' - '>`_'.format(version) + ":doc:`Geo-spatial ordering filter backend `", + "`Geo-spatial ordering filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#geo-spatial-features" + ">`_".format(version), ), ( - ':doc:`Faceted search filter backend `', - '`Faceted search filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#faceted-search' - '>`_'.format(version) + ":doc:`Faceted search filter backend `", + "`Faceted search filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#faceted-search" + ">`_".format(version), ), ( - ':doc:`Post-filter filter backend `', - '`Post-filter filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#post-filter' - '>`_'.format(version) + ":doc:`Post-filter filter backend `", + "`Post-filter filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#post-filter" + ">`_".format(version), ), ( - ':doc:`Nested filtering filter backend `', - '`Nested filtering filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'nested_fields_usage_examples.html#nested-filtering' - '>`_'.format(version) + ":doc:`Nested filtering filter backend `", + "`Nested filtering filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "nested_fields_usage_examples.html#nested-filtering" + ">`_".format(version), ), ( - ':doc:`Highlight backend `', - '`Highlight backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#highlighting' - '>`_'.format(version) + ":doc:`Highlight backend `", + "`Highlight backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#highlighting" + ">`_".format(version), ), ( - ':doc:`Pagination (Page number and limit/offset pagination) ' - '`', - '`Pagination (Page number and limit/offset pagination) <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#pagination' - '>`_'.format(version) + ":doc:`Pagination (Page number and limit/offset pagination) " + "`", + "`Pagination (Page number and limit/offset pagination) <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#pagination" + ">`_".format(version), ), ( - ':doc:`quick start tutorial `', - '`quick start tutorial <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'quick_start.html' - '>`_'.format(version) + ":doc:`quick start tutorial `", + "`quick start tutorial <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "quick_start.html" + ">`_".format(version), ), ( - ':doc:`Suggester filter backend `', - '`Suggester filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#suggestions' - '>`_'.format(version) + ":doc:`Suggester filter backend `", + "`Suggester filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#suggestions" + ">`_".format(version), ), ( - ':doc:`Functional suggester filter backend `', - '`Functional suggester filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#functional-suggestions' - '>`_'.format(version) + ":doc:`Functional suggester filter backend `", + "`Functional suggester filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#functional-suggestions" + ">`_".format(version), ), ( - ':doc:`Ids filter backend `', - '`Ids filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'advanced_usage_examples.html#ids-filter' - '>`_'.format(version) + ":doc:`Ids filter backend `", + "`Ids filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "advanced_usage_examples.html#ids-filter" + ">`_".format(version), ), ( - ':doc:`Multi match search filter backend `', - '`Multi match search filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'search_backends.html#multi-match-search-filter-backend' - '>`_'.format(version) + ":doc:`Multi match search filter backend `", + "`Multi match search filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "search_backends.html#multi-match-search-filter-backend" + ">`_".format(version), ), ( - ':doc:`Simple search query search filter backend `', - '`Simple search query filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'search_backends.html#simple-query-string-filter-backend' - '>`_'.format(version) + ":doc:`Simple search query search filter backend `", + "`Simple search query filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "search_backends.html#simple-query-string-filter-backend" + ">`_".format(version), ), ( - ':doc:`More-like-this support (detail action) `', - '`More-like-this support (detail action) <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'more_like_this.html' - '>`_'.format(version) + ":doc:`More-like-this support (detail action) `", + "`More-like-this support (detail action) <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "more_like_this.html" + ">`_".format(version), ), ( - ':doc:`Global aggregations support `', - '`Global aggregations support <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'global_aggregations.html' - '>`_'.format(version) + ":doc:`Global aggregations support `", + "`Global aggregations support <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "global_aggregations.html" + ">`_".format(version), ), ( - ':doc:`Source filter backend `', - '`Source filter backend <' - 'http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/' - 'source_backend.html' - '>`_'.format(version) + ":doc:`Source filter backend `", + "`Source filter backend <" + "http://django-elasticsearch-dsl-drf.readthedocs.io/en/%7B%7D/" + "source_backend.html" + ">`_".format(version), ), ) try: - readme = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read() + readme = open(os.path.join(os.path.dirname(__file__), "README.rst")).read() for __search, __replace in DOCS_TRANSFORMATIONS: readme = readme.replace(__search, __replace) except: - readme = '' + readme = "" install_requires = [ - 'six>=1.9', - 'django-nine>=0.2', - 'django-elasticsearch-dsl>=6.4.1', - 'elasticsearch-dsl', - 'elasticsearch', - 'djangorestframework', + "six>=1.9", + "django-nine>=0.2", + "django-elasticsearch-dsl>=6.4.1", + "elasticsearch-dsl", + "elasticsearch", + "djangorestframework", ] extras_require = [] tests_require = [ - 'factory_boy', - 'Faker', - 'pytest', - 'pytest-django', - 'pytest-cov', - 'tox', - 'mock', + "factory_boy", + "Faker", + "pytest", + "pytest-django", + "pytest-cov", + "tox", + "mock", ] setup( - name='django-elasticsearch-dsl-drf', + name="django-elasticsearch-dsl-drf", version=version, description="Integrate Elasticsearch DSL with Django REST framework.", long_description=readme, @@ -197,20 +197,20 @@ ], project_urls={ "Bug Tracker": "https://github.com/barseghyanartur/" - "django-elasticsearch-dsl-drf/issues", + "django-elasticsearch-dsl-drf/issues", "Documentation": "https://django-elasticsearch-dsl-drf.readthedocs.io/", "Source Code": "https://github.com/barseghyanartur/" - "django-elasticsearch-dsl-drf", + "django-elasticsearch-dsl-drf", "Changelog": "https://django-elasticsearch-dsl-drf.readthedocs.io/" - "en/latest/changelog.html", + "en/latest/changelog.html", }, keywords="django, elasticsearch, elasticsearch-dsl, django rest framework", - author='Artur Barseghyan', - author_email='artur.barseghyan@gmail.com', - url='https://github.com/barseghyanartur/django-elasticsearch-dsl-drf/', - package_dir={'': 'src'}, - packages=find_packages(where='./src'), - license='GPL-2.0-only OR LGPL-2.1-or-later', + author="Artur Barseghyan", + author_email="artur.barseghyan@gmail.com", + url="https://github.com/barseghyanartur/django-elasticsearch-dsl-drf/", + package_dir={"": "src"}, + packages=find_packages(where="./src"), + license="GPL-2.0-only OR LGPL-2.1-or-later", python_requires=">=2.7", install_requires=(install_requires + extras_require), tests_require=tests_require,