From 8ee3a3f9f382215ba9802218165e1168667c2c10 Mon Sep 17 00:00:00 2001 From: Will Brown Date: Thu, 20 Aug 2020 17:16:28 +0000 Subject: [PATCH 01/14] aligned delete with current es delete behavior --- elasticmock/fake_elasticsearch.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/elasticmock/fake_elasticsearch.py b/elasticmock/fake_elasticsearch.py index 541a17a..3c93117 100644 --- a/elasticmock/fake_elasticsearch.py +++ b/elasticmock/fake_elasticsearch.py @@ -199,7 +199,7 @@ def info(self, params=None, headers=None): def index(self, index, body, doc_type='_doc', id=None, params=None, headers=None): if index not in self.__documents_dict: self.__documents_dict[index] = list() - + version = 1 if id is None: @@ -421,9 +421,9 @@ def search(self, index=None, doc_type=None, body=None, params=None, headers=None 'params': params } hits = hits[params.get('from'):params.get('from') + params.get('size')] - + result['hits']['hits'] = hits - + return result @query_params('scroll') @@ -436,17 +436,19 @@ def scroll(self, scroll_id, params=None, headers=None): params=scroll.get('params') ) return result - + @query_params('consistency', 'parent', 'refresh', 'replication', 'routing', 'timeout', 'version', 'version_type') - def delete(self, index, doc_type, id, params=None, headers=None): + def delete(self, index, id, doc_type=None, params=None, headers=None): found = False + doc_type = doc_type if index in self.__documents_dict: for document in self.__documents_dict[index]: - if document.get('_type') == doc_type and document.get('_id') == id: + if document.get('_id') == id: found = True + doc_type = document.get('_type') self.__documents_dict[index].remove(document) break From 31fbaddf4961e18956dc22b795a6c3cb3dded006 Mon Sep 17 00:00:00 2001 From: Will Brown Date: Thu, 20 Aug 2020 17:17:25 +0000 Subject: [PATCH 02/14] incremented major version change --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index eafcc94..09e3d07 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ import setuptools -__version__ = '2.0' +__version__ = '2.1' # read the contents of your readme file from os import path From daf0142ee5b0b019d8f655f9bfb4bd37decf455d Mon Sep 17 00:00:00 2001 From: Balazs Lombosi Date: Mon, 22 Mar 2021 11:50:07 +0100 Subject: [PATCH 03/14] testing elasticsearch, new query types, sorting, unit tests, --- elasticmock/fake_elasticsearch.py | 88 +++++++++++++++++-------- tests/fake_elasticsearch/test_search.py | 19 ++++++ tests/fake_elasticsearch/test_sort.py | 33 ++++++++++ 3 files changed, 114 insertions(+), 26 deletions(-) create mode 100644 tests/fake_elasticsearch/test_sort.py diff --git a/elasticmock/fake_elasticsearch.py b/elasticmock/fake_elasticsearch.py index 6b580ff..30fc8e8 100644 --- a/elasticmock/fake_elasticsearch.py +++ b/elasticmock/fake_elasticsearch.py @@ -15,7 +15,7 @@ from elasticmock.fake_cluster import FakeClusterClient from elasticmock.fake_indices import FakeIndicesClient from elasticmock.utilities import (extract_ignore_as_iterable, get_random_id, - get_random_scroll_id) + get_random_scroll_id) from elasticmock.utilities.decorator import for_all_methods PY3 = sys.version_info[0] == 3 @@ -35,6 +35,9 @@ class QueryType: SHOULD = 'SHOULD' MINIMUM_SHOULD_MATCH = 'MINIMUM_SHOULD_MATCH' MULTI_MATCH = 'MULTI_MATCH' + MUST_NOT = 'MUST_NOT' + EXISTS = 'EXISTS' + FIELD = 'FIELD' @staticmethod def get_query_type(type_str): @@ -60,6 +63,12 @@ def get_query_type(type_str): return QueryType.MINIMUM_SHOULD_MATCH elif type_str == 'multi_match': return QueryType.MULTI_MATCH + elif type_str == 'must_not': + return QueryType.MUST_NOT + elif type_str == 'exists': + return QueryType.EXISTS + elif type_str == 'field': + return QueryType.FIELD else: raise NotImplementedError(f'type {type_str} is not implemented for QueryType') @@ -107,9 +116,27 @@ def _evaluate_for_query_type(self, document): return self._evaluate_for_should_query_type(document) elif self.type == QueryType.MULTI_MATCH: return self._evaluate_for_multi_match_query_type(document) + elif self.type == QueryType.MUST_NOT: + return self._evaluate_for_must_not_query_type(document) + elif self.type == QueryType.EXISTS: + return self._evaluate_for_exists_query_type(document) + elif self.type == QueryType.FIELD: + return self._evaluate_for_compound_query_type(document) + elif self.type == QueryType.MINIMUM_SHOULD_MATCH: + return True else: raise NotImplementedError('Fake query evaluation not implemented for query type: %s' % self.type) + def _evaluate_for_must_not_query_type(self, document): + return not self._evaluate_for_compound_query_type(document) + + def _evaluate_for_exists_query_type(self, document): + doc_source = document['_source'] + return_val = False + for field, value in self.condition.items(): + return_val = value in doc_source.keys() and doc_source[value] is not None + return return_val + def _evaluate_for_match_query_type(self, document): return self._evaluate_for_field(document, True) @@ -170,6 +197,9 @@ def _evaluate_for_range_query_type(self, document): if isinstance(doc_val, list): return False + if doc_val != 0 and not doc_val: + return True + for sign, value in comparisons.items(): if isinstance(doc_val, datetime.datetime): value = dateutil.parser.isoparse(value) @@ -488,7 +518,7 @@ def mget(self, body, index, doc_type='_all', params=None, headers=None): for id in ids: try: results.append(self.get(index, id, doc_type=doc_type, - params=params, headers=headers)) + params=params, headers=headers)) except: pass if not results: @@ -517,20 +547,11 @@ def get_source(self, index, doc_type, id, params=None, headers=None): def count(self, index=None, doc_type=None, body=None, params=None, headers=None): searchable_indexes = self._normalize_index_to_list(index) - i = 0 - for searchable_index in searchable_indexes: - for document in self.__documents_dict[searchable_index]: - if doc_type and document.get('_type') != doc_type: - continue - i += 1 + contents = self.search(index=index, doc_type=doc_type, body=body, params=params, headers=headers) + result = { - 'count': i, - '_shards': { - 'successful': 1, - 'skipped': 0, - 'failed': 0, - 'total': 1 - } + 'count': contents['hits']['hits'].__len__(), + '_shards': contents['_shards'] } return result @@ -643,6 +664,14 @@ def search(self, index=None, doc_type=None, body=None, params=None, headers=None if aggregations: result['aggregations'] = aggregations + if body is not None and 'sort' in body: + for key, value in body['sort'][0].items(): + if body['sort'][0][key]['order'] == 'desc': + hits = sorted(hits, key=lambda k: k['_source'][key], reverse=True) + else: + hits = sorted(hits, key=lambda k: k['_source'][key]) + + if 'scroll' in params: result['_scroll_id'] = str(get_random_scroll_id()) params['size'] = int(params.get('size', 10)) @@ -774,18 +803,19 @@ def make_bucket(bucket_key, bucket): "doc_count": len(bucket), } - for metric_key, metric_definition in aggregation["aggs"].items(): - metric_type_str = list(metric_definition)[0] - metric_type = MetricType.get_metric_type(metric_type_str) - attr = metric_definition[metric_type_str]["field"] - data = [doc[attr] for doc in bucket] + if "aggs" in aggregation.keys(): + for metric_key, metric_definition in aggregation["aggs"].items(): + metric_type_str = list(metric_definition)[0] + metric_type = MetricType.get_metric_type(metric_type_str) + attr = metric_definition[metric_type_str]["field"] + data = [doc[attr] for doc in bucket] - if metric_type == MetricType.CARDINALITY: - value = len(set(data)) - else: - raise NotImplementedError(f"Metric type '{metric_type}' not implemented") + if metric_type == MetricType.CARDINALITY: + value = len(set(data)) + else: + raise NotImplementedError(f"Metric type '{metric_type}' not implemented") - out[metric_key] = {"value": value} + out[metric_key] = {"value": value} return out agg_sources = aggregation["composite"]["sources"] @@ -793,7 +823,13 @@ def make_bucket(bucket_key, bucket): bucket_key_fields = [list(src)[0] for src in agg_sources] for document in documents: doc_src = document["_source"] - key = tuple(make_key(doc_src, agg_src) for agg_src in aggregation["composite"]["sources"]) + key = () + for agg_src in aggregation["composite"]["sources"]: + k=make_key(doc_src, agg_src) + if isinstance(k, list): + key += tuple(k) + else: + key += tuple([k]) buckets[key].append(doc_src) buckets = sorted(((k, v) for k, v in buckets.items()), key=lambda x: x[0]) diff --git a/tests/fake_elasticsearch/test_search.py b/tests/fake_elasticsearch/test_search.py index 7b71070..c7d123b 100644 --- a/tests/fake_elasticsearch/test_search.py +++ b/tests/fake_elasticsearch/test_search.py @@ -210,6 +210,25 @@ def test_search_bool_should_match_query(self): self.assertEqual(len(hits), 3) self.assertEqual(hits[0]['_source'], {'data': 'test_0'}) + def test_search_bool_must_not_match_query(self): + for i in range(0, 10): + self.es.index(index='index_for_search', doc_type=DOC_TYPE, body={'data': 'test_{0}'.format(i)}) + + response = self.es.search(index='index_for_search', doc_type=DOC_TYPE, + body={ + 'query': { + 'bool': { + 'must_not': [ + {'match': {'data': 'test_0'}}, + ] + } + } + }) + self.assertEqual(response['hits']['total']['value'], 9) + hits = response['hits']['hits'] + self.assertEqual(len(hits), 9) + self.assertEqual(hits[0]['_source'], {'data': 'test_1'}) + def test_msearch(self): for i in range(0, 10): self.es.index(index='index_for_search1', doc_type=DOC_TYPE, body={ diff --git a/tests/fake_elasticsearch/test_sort.py b/tests/fake_elasticsearch/test_sort.py new file mode 100644 index 0000000..099217c --- /dev/null +++ b/tests/fake_elasticsearch/test_sort.py @@ -0,0 +1,33 @@ +from tests import TestElasticmock, INDEX_NAME, DOC_TYPE + + +class TestSearch(TestElasticmock): + + def test_sort_by_field_asc(self): + index_quantity = 10 + result = [] + for i in range(0, index_quantity): + body = {'data': 'test_{0}'.format(i), 'sort_param':'{0}'.format(i)} + result.append(body) + self.es.index(index=INDEX_NAME, doc_type=DOC_TYPE, body=body) + + search = self.es.search(body={'query': {'match_all': {}}, + 'sort': [{ "sort_param" : {"order" : "asc"}}] + }) + search_result = [hit.get('_source') for hit in search.get('hits').get('hits')] + self.assertListEqual(result, search_result) + + def test_sort_by_field_desc(self): + index_quantity = 10 + result = [] + for i in range(0, index_quantity): + body = {'data': 'test_{0}'.format(i), 'sort_param':'{0}'.format(i)} + result.append(body) + self.es.index(index=INDEX_NAME, doc_type=DOC_TYPE, body=body) + + search = self.es.search(body={'query': {'match_all': {}}, + 'sort': [{ "sort_param" : {"order" : "desc"}}] + }) + search_result = [hit.get('_source') for hit in search.get('hits').get('hits')] + result.reverse() + self.assertListEqual(result, search_result) From 4bde09aaf20e8062272ae545b63bb32748776ce0 Mon Sep 17 00:00:00 2001 From: Balazs Lombosi Date: Wed, 24 Mar 2021 11:16:13 +0100 Subject: [PATCH 04/14] HSS-191954 fix makefile, setup version --- Makefile | 16 ++++++++-------- setup.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index e4fd00f..005d06e 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +1,30 @@ -ELASTICMOCK_VERSION='1.8.0' +ELASTICMOCK_VERSION='2.2.0' install: - pip3 install -r requirements.txt + pip install -r requirements.txt test_install: install - pip3 install -r requirements_test.txt + pip install -r requirements_test.txt test: test_install - python3.8 setup.py test + python3 setup.py test upload: create_dist - pip3 install twine + pip install twine twine upload dist/* git push create_dist: create_dist_no_commit update_pip rm -rf dist - python3.8 setup.py sdist + python3 setup.py sdist create_dist_no_commit: update_pip rm -rf dist - python3.8 setup.py sdist + python3 setup.py sdist create_dist_commit: git commit --all -m "Bump version ${ELASTICMOCK_VERSION}" git tag ${ELASTICMOCK_VERSION} update_pip: - pip3 install --upgrade pip + pip install --upgrade pip diff --git a/setup.py b/setup.py index b792023..b9211cc 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ import setuptools -__version__ = '1.8.0' +__version__ = '2.2.0' # read the contents of your readme file from os import path From 8b760ca846b31f049df20ee94b1a0b4cb53bedef Mon Sep 17 00:00:00 2001 From: Balazs Lombosi Date: Tue, 6 Apr 2021 14:42:18 +0200 Subject: [PATCH 05/14] HSS-19154 added paging from body --- elasticmock/fake_elasticsearch.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/elasticmock/fake_elasticsearch.py b/elasticmock/fake_elasticsearch.py index 30fc8e8..62504e9 100644 --- a/elasticmock/fake_elasticsearch.py +++ b/elasticmock/fake_elasticsearch.py @@ -671,6 +671,8 @@ def search(self, index=None, doc_type=None, body=None, params=None, headers=None else: hits = sorted(hits, key=lambda k: k['_source'][key]) + if 'from' in body and 'size' in body and body['from'] + body['size'] > 0: + hits = hits[body['from']:body['from'] + body['size']] if 'scroll' in params: result['_scroll_id'] = str(get_random_scroll_id()) From 4932d282306a5dc04bf7ad0f906a415b5853714d Mon Sep 17 00:00:00 2001 From: Balazs Lombosi Date: Tue, 6 Apr 2021 14:44:22 +0200 Subject: [PATCH 06/14] HSS-19154 update version --- Makefile | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 005d06e..a7bb654 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -ELASTICMOCK_VERSION='2.2.0' +ELASTICMOCK_VERSION='2.3.0' install: pip install -r requirements.txt diff --git a/setup.py b/setup.py index b9211cc..9cf3905 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ import setuptools -__version__ = '2.2.0' +__version__ = '2.3.0' # read the contents of your readme file from os import path From 942f3877b104890a9e255fd6200819db923fa528 Mon Sep 17 00:00:00 2001 From: Gergely Farkas Date: Tue, 30 Nov 2021 23:38:42 +0100 Subject: [PATCH 07/14] Create CODEOWNERS --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..f5783ab --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @hearsaycorp/sm From d0f9b596f6d4e8fedee708ec7bfd94a60ac6619d Mon Sep 17 00:00:00 2001 From: Aron Radics Date: Fri, 7 Jun 2024 16:00:26 +0200 Subject: [PATCH 08/14] Fix failing tests --- elasticmock/fake_elasticsearch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elasticmock/fake_elasticsearch.py b/elasticmock/fake_elasticsearch.py index 62504e9..135665c 100644 --- a/elasticmock/fake_elasticsearch.py +++ b/elasticmock/fake_elasticsearch.py @@ -671,7 +671,7 @@ def search(self, index=None, doc_type=None, body=None, params=None, headers=None else: hits = sorted(hits, key=lambda k: k['_source'][key]) - if 'from' in body and 'size' in body and body['from'] + body['size'] > 0: + if body is not None and 'from' in body and 'size' in body and body['from'] + body['size'] > 0: hits = hits[body['from']:body['from'] + body['size']] if 'scroll' in params: From cdae972da5284f6afd6f0d7552bae68baf1ee55e Mon Sep 17 00:00:00 2001 From: Aron Radics Date: Fri, 7 Jun 2024 16:00:58 +0200 Subject: [PATCH 09/14] Add python 3.9 and 3.10 support, and drop 3.6 and 3.7 --- Makefile | 2 +- setup.py | 2 +- tox.ini | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index a7bb654..714fdff 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -ELASTICMOCK_VERSION='2.3.0' +ELASTICMOCK_VERSION='3.0.0' install: pip install -r requirements.txt diff --git a/setup.py b/setup.py index 9cf3905..f31060b 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ import setuptools -__version__ = '2.3.0' +__version__ = '3.0.0' # read the contents of your readme file from os import path diff --git a/tox.ini b/tox.ini index 64a1368..c247cac 100644 --- a/tox.ini +++ b/tox.ini @@ -1,14 +1,14 @@ # content of: tox.ini , put in same dir as setup.py [tox] envlist = - py36-elasticsearch{1,2,5,6,7} - py37-elasticsearch{1,2,5,6,7} py38-elasticsearch{1,2,5,6,7} + py39-elasticsearch{1,2,5,6,7} + py310-elasticsearch{1,2,5,6,7} [testenv] deps = parameterized - pytest==4.6.9 + pytest==6.2.5 pytest-cov==2.8.1 elasticsearch1: elasticsearch ==1.9.0 elasticsearch2: elasticsearch >=2.0.0, <5.0.0 From d84ef57f0f9fc65ef948a7f918e142e5fb80ecdc Mon Sep 17 00:00:00 2001 From: gcseter Date: Tue, 8 Oct 2024 10:28:43 +0200 Subject: [PATCH 10/14] add python 3.12 to tox --- tox.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tox.ini b/tox.ini index c247cac..2c55f8b 100644 --- a/tox.ini +++ b/tox.ini @@ -4,6 +4,8 @@ envlist = py38-elasticsearch{1,2,5,6,7} py39-elasticsearch{1,2,5,6,7} py310-elasticsearch{1,2,5,6,7} + py311-elasticsearch{1,2,5,6,7} + py312-elasticsearch{1,2,5,6,7} [testenv] deps = From 5fedf0ae953b983fa6891875791ca15636c2e4a1 Mon Sep 17 00:00:00 2001 From: gcseter Date: Tue, 8 Oct 2024 13:27:57 +0200 Subject: [PATCH 11/14] add test workflow --- .github/workflows/test.yml | 35 +++++++++++++++++++++++++++++++++++ Makefile | 3 +++ tox.ini | 1 + 3 files changed, 39 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..a39ecac --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,35 @@ +name: Run lint and tests + +on: + push: + branches: + - '**' + - '!master' + pull_request: + branches: + - '**' + - '!master' + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.9', '3.10', '3.11', '3.12'] + env: + PYPI_USERNAME: ${{ secrets.PYPI_READ_USERNAME }} + PYPI_PASSWORD: ${{ secrets.PYPI_READ_PASSWORD }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: make test_install + + - name: Run tests + run: make test-ci diff --git a/Makefile b/Makefile index 714fdff..4e02e10 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,9 @@ test_install: install test: test_install python3 setup.py test +test-ci: + tox + upload: create_dist pip install twine twine upload dist/* diff --git a/tox.ini b/tox.ini index 2c55f8b..3236e37 100644 --- a/tox.ini +++ b/tox.ini @@ -9,6 +9,7 @@ envlist = [testenv] deps = + tox-gh parameterized pytest==6.2.5 pytest-cov==2.8.1 From b9cf0c848341b940488e9cfedbc5f9902ba7d688 Mon Sep 17 00:00:00 2001 From: gcseter Date: Wed, 9 Oct 2024 08:33:24 +0200 Subject: [PATCH 12/14] fix tox config --- .github/workflows/test.yml | 10 ++++++---- Makefile | 3 --- requirements_test.txt | 2 +- tox.ini | 10 ++++++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a39ecac..f12bd17 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -name: Run lint and tests +name: Run tests on: push: @@ -29,7 +29,9 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies - run: make test_install + run: | + python -m pip install --upgrade pip + make test_install - - name: Run tests - run: make test-ci + - name: Test with tox + run: tox diff --git a/Makefile b/Makefile index 4e02e10..714fdff 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,6 @@ test_install: install test: test_install python3 setup.py test -test-ci: - tox - upload: create_dist pip install twine twine upload dist/* diff --git a/requirements_test.txt b/requirements_test.txt index 408b093..f12147a 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,2 +1,2 @@ tox -parameterized \ No newline at end of file +tox-gh diff --git a/tox.ini b/tox.ini index 3236e37..98e12e1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ # content of: tox.ini , put in same dir as setup.py [tox] +isolated_build = True envlist = - py38-elasticsearch{1,2,5,6,7} py39-elasticsearch{1,2,5,6,7} py310-elasticsearch{1,2,5,6,7} py311-elasticsearch{1,2,5,6,7} @@ -9,7 +9,6 @@ envlist = [testenv] deps = - tox-gh parameterized pytest==6.2.5 pytest-cov==2.8.1 @@ -21,3 +20,10 @@ deps = commands = python -c "import tests.tox_banner" py.test --cov-report term-missing --cov=elasticmock + +[gh] +python = + 3.9 = py39-elasticsearch{1,2,5,6,7} + 3.10 = py310-elasticsearch{1,2,5,6,7} + 3.11 = py311-elasticsearch{1,2,5,6,7} + 3.12 = py312-elasticsearch{1,2,5,6,7} From 73eb0908d06c6a08193a8a622b73a24e3bc28bd3 Mon Sep 17 00:00:00 2001 From: gcseter Date: Wed, 9 Oct 2024 10:06:45 +0200 Subject: [PATCH 13/14] update setup.py --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index f31060b..9e9c605 100644 --- a/setup.py +++ b/setup.py @@ -34,6 +34,10 @@ 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', "License :: OSI Approved :: MIT License", 'Topic :: Software Development :: Libraries :: Python Modules' ] From 0ee5a5dcd83205b68961f2057d55724d4a1e7ea6 Mon Sep 17 00:00:00 2001 From: gcseter Date: Wed, 9 Oct 2024 10:23:59 +0200 Subject: [PATCH 14/14] change CODEOWNERS --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f5783ab..4de66fb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @hearsaycorp/sm +* @hearsaycorp/social-content