Pylint integration updates (#643)

* updated files with docstrings to pass pylint

Signed-off-by: Mark Cohen <[email protected]>

* updated samples to prepare for enabling missing-docstring linter; will continue to work on this before committing setup.cfg

Signed-off-by: Mark Cohen <[email protected]>

* removed missing-function-docstring from setup.cfg so the linter doesn't fail while work on docstrings continues

Signed-off-by: Mark Cohen <[email protected]>

* corrected unnecessary return docstring values

Signed-off-by: Mark Cohen <[email protected]>

* fixing failure in 'black' on reformatting

Signed-off-by: Mark Cohen <[email protected]>

* updated utils to pass missing-function-docstring tests

Signed-off-by: Mark Cohen <[email protected]>

* updated functions with missing docstrings or pylint ignore instructions; added a utility to automatically add these ignore instructions to most functions that should be self-describing; rolled back some automatically generated code mistakenly changed

Signed-off-by: Mark Cohen <[email protected]>

* * ignoring opensearchpy for pylint and then added it back to noxfile.py
* fixed some lints; created a feature flag for newer dynamic pylint so now lints can be fixed first in legacy code and then enabled by multiple people
* extracted a method for per-folder linting
* updated noxfile.lint_per_folder with type hints
* enabled unspecified-encoding in pylint
* added disable missing-function-docstring pragma to test_clients.py in test_async and test_server
* added more encodings to pass unspecified-encoding pylint tests
* updated changelog
Signed-off-by: Mark Cohen <[email protected]>

* updated CHANGELOG.md entry
removed the feature flag for pylint lint_per_folder
fixed failures from mypy and pylint
removed pylint MESSAGE CONTROL config from setup.cfg after relocating to lint_per_folder method
Signed-off-by: Mark Cohen <[email protected]>

* removed pylint ignore missing-function-docstring

Signed-off-by: Mark Cohen <[email protected]>

* added pylint.extensions.docparams plugin

updated some docstrings to correct parameters

removed pylint from setup.cfg

Signed-off-by: Mark Cohen <[email protected]>

* added four lints for opensearchpy/

Signed-off-by: Mark Cohen <[email protected]>

* adding await back to client.info() call

Signed-off-by: Mark Cohen <[email protected]>

* updated TODOs as requested

renamed test_opensearchpy.test_async.test_server.test_helpers.conftest.setup_ubq_tests to setup_update_by_query_tests

added
OpenSearch-main/rest-api-spec/src/main/resources/rest-api-spec/test/indices/stats/50_noop_update[0]
to skip tests list

run_tests.py catches a CalledProcessError when the git repo already exists and the command to add the origin fails in fetch_opensearch_repo()

Signed-off-by: Mark Cohen <[email protected]>

---------

Signed-off-by: Mark Cohen <[email protected]>
This commit is contained in:
Mark Cohen
2024-01-19 13:36:05 -05:00
committed by GitHub
parent 2ab3a40307
commit 0ddbf8cafa
47 changed files with 563 additions and 218 deletions
@@ -34,13 +34,19 @@ from ...utils import wipe_cluster
class AsyncOpenSearchTestCase(IsolatedAsyncioTestCase): # type: ignore
async def asyncSetUp(self) -> None: # pylint: disable=invalid-name
async def asyncSetUp(
self,
) -> None:
# pylint: disable=invalid-name,missing-function-docstring
self.client = await get_test_client(
verify_certs=False, http_auth=("admin", "admin")
)
await add_connection("default", self.client)
async def asyncTearDown(self) -> None: # pylint: disable=invalid-name
async def asyncTearDown(
self,
) -> None:
# pylint: disable=invalid-name,missing-function-docstring
wipe_cluster(self.client)
if self.client:
await self.client.close()
@@ -60,7 +60,9 @@ class TestYarlMissing:
async def test_aiohttp_connection_works_without_yarl(
self, async_client: Any, monkeypatch: Any
) -> None:
# This is a defensive test case for if aiohttp suddenly stops using yarl.
"""
This is a defensive test case for if aiohttp suddenly stops using yarl.
"""
from opensearchpy._async import http_aiohttp
monkeypatch.setattr(http_aiohttp, "yarl", False)
@@ -43,12 +43,24 @@ async def client() -> Any:
@fixture(scope="function") # type: ignore
async def opensearch_version(client: Any) -> Any:
"""
yields the version of the OpenSearch cluster
:param client: client connection to OpenSearch
:return: yields major version number
"""
info = await client.info()
print(info)
yield tuple(
int(x)
for x in re.match(r"^([0-9.]+)", info["version"]["number"]).group(1).split(".") # type: ignore
)
yield (int(x) async for x in match_version(info))
async def match_version(info: Any) -> Any:
"""
matches the full semver server version with the given info
:param info: response from the OpenSearch cluster
"""
match = re.match(r"^([0-9.]+)", info["version"]["number"])
assert match is not None
yield match.group(1).split(".")
@fixture # type: ignore
@@ -60,7 +72,9 @@ async def write_client(client: Any) -> Any:
@fixture # type: ignore
async def data_client(client: Any) -> Any:
# create mappings
"""
create mappings
"""
await create_git_index(client, "git")
await create_flat_git_index(client, "flat-git")
# load data
@@ -73,6 +87,11 @@ async def data_client(client: Any) -> Any:
@fixture # type: ignore
async def pull_request(write_client: Any) -> Any:
"""
create dummy pull request instance
:param write_client: #todo not used
:return: instance of PullRequest
"""
await PullRequest.init()
pr = PullRequest(
_id=42,
@@ -96,7 +115,12 @@ async def pull_request(write_client: Any) -> Any:
@fixture # type: ignore
async def setup_ubq_tests(client: Any) -> str:
async def setup_update_by_query_tests(client: Any) -> str:
"""
sets up update by query tests
:param client:
:return: an index name
"""
index = "test-git"
await create_git_index(client, index)
await async_bulk(client, TEST_GIT_DATA, raise_on_error=True, refresh=True)
@@ -60,6 +60,9 @@ class FailingBulkClient(object):
self._fail_with = fail_with
async def bulk(self, *args: Any, **kwargs: Any) -> Any:
"""
increments number of times called and, when it equals fail_at, raises self.fail_with
"""
self._called += 1
if self._called in self._fail_at:
raise self._fail_with
@@ -56,6 +56,10 @@ class MetricSearch(AsyncFacetedSearch):
@pytest.fixture(scope="function") # type: ignore
def commit_search_cls(opensearch_version: Any) -> Any:
"""
:param opensearch_version the semver version of OpenSearch
:return: an AsyncFacetedSearch for git commits
"""
interval_kwargs = {"fixed_interval": "1d"}
class CommitSearch(AsyncFacetedSearch):
@@ -102,6 +106,10 @@ def repo_search_cls(opensearch_version: Any) -> Any:
@pytest.fixture(scope="function") # type: ignore
def pr_search_cls(opensearch_version: Any) -> Any:
"""
:param opensearch_version: not used here... #TODO remove this parameter?
:return: an AsyncFacetedSearch for pull requests
"""
interval_type = "calendar_interval"
class PRSearch(AsyncFacetedSearch):
@@ -19,9 +19,9 @@ pytestmark: MarkDecorator = pytest.mark.asyncio
async def test_update_by_query_no_script(
write_client: Any, setup_ubq_tests: Any
write_client: Any, setup_update_by_query_tests: Any
) -> None:
index = setup_ubq_tests
index = setup_update_by_query_tests
ubq = (
AsyncUpdateByQuery(using=write_client)
@@ -40,9 +40,9 @@ async def test_update_by_query_no_script(
async def test_update_by_query_with_script(
write_client: Any, setup_ubq_tests: Any
write_client: Any, setup_update_by_query_tests: Any
) -> None:
index = setup_ubq_tests
index = setup_update_by_query_tests
ubq = (
AsyncUpdateByQuery(using=write_client)
@@ -59,9 +59,9 @@ async def test_update_by_query_with_script(
async def test_delete_by_query_with_script(
write_client: Any, setup_ubq_tests: Any
write_client: Any, setup_update_by_query_tests: Any
) -> None:
index = setup_ubq_tests
index = setup_update_by_query_tests
ubq = (
AsyncUpdateByQuery(using=write_client)
@@ -54,6 +54,10 @@ OPENSEARCH_VERSION = None
async def await_if_coro(x: Any) -> Any:
"""
awaits if x is a coroutine
:return: x
"""
if inspect.iscoroutine(x):
return await x
return x