diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bef7f1c2..374db30b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: # E501 let black handle all line length decisions # W503 black conflicts with "line break before operator" rule # E203 black conflicts with "whitespace before ':'" rule - '--ignore=E501,W503,E203,C901' ] + '--ignore=E501,W503,E203,C901,E402' ] - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.991 hooks: diff --git a/stac_fastapi/common/core.py b/stac_fastapi/common/core.py index 71e6fd3f..29c653a5 100644 --- a/stac_fastapi/common/core.py +++ b/stac_fastapi/common/core.py @@ -11,11 +11,6 @@ import attr import orjson import stac_pydantic -from common.base_database_logic import BaseDatabaseLogic -from common.models.links import PagingLinks -from elastic_search import serializers -from elastic_search.serializers import CollectionSerializer, ItemSerializer -from elastic_search.session import Session from fastapi import HTTPException, Request from overrides import overrides from pydantic import ValidationError @@ -24,6 +19,11 @@ from stac_pydantic.links import Relations from stac_pydantic.shared import MimeTypes +# from common.base_database_logic import BaseDatabaseLogic +from stac_fastapi.common.models.links import PagingLinks +from stac_fastapi.elastic_search import serializers +from stac_fastapi.elastic_search.serializers import CollectionSerializer, ItemSerializer +from stac_fastapi.elastic_search.session import Session from stac_fastapi.extensions.third_party.bulk_transactions import ( BaseBulkTransactionsClient, BulkTransactionMethod, @@ -66,12 +66,12 @@ class CoreClient(AsyncBaseCoreClient): session: Session = attr.ib(default=attr.Factory(Session.create_from_env)) item_serializer: Type[serializers.ItemSerializer] = attr.ib( - default=serializers.ItemSerializer + default=serializers.ItemSerializer # type: ignore ) collection_serializer: Type[serializers.CollectionSerializer] = attr.ib( - default=serializers.CollectionSerializer + default=serializers.CollectionSerializer # type: ignore ) - database: BaseDatabaseLogic = attr.ib(init=False) + post_request_model = attr.ib(default=BaseSearchPostRequest) def __attrs_post_init__(self): """ @@ -84,11 +84,15 @@ def __attrs_post_init__(self): """ try: # Dynamically import the database logic based on installed package - database_module = importlib.import_module("elastic_search.database_logic") + database_module = importlib.import_module( + "stac_fastapi.elastic_search.database_logic" + ) DatabaseLogicClass = getattr(database_module, "DatabaseLogic") except ImportError: # Fall back to OpenSearch if Elasticsearch is not available - database_module = importlib.import_module("open_search.database_logic") + database_module = importlib.import_module( + "stac_fastapi.open_search.database_logic" + ) DatabaseLogicClass = getattr(database_module, "DatabaseLogic") self.database = DatabaseLogicClass() @@ -562,7 +566,7 @@ class TransactionsClient(AsyncBaseTransactionsClient): """Transactions extension specific CRUD operations.""" session: Session = attr.ib(default=attr.Factory(Session.create_from_env)) - database: BaseDatabaseLogic = attr.ib(init=False) + # database: BaseDatabaseLogic = attr.ib(init=False) def __attrs_post_init__(self): """ @@ -575,11 +579,15 @@ def __attrs_post_init__(self): """ try: # Dynamically import the database logic based on installed package - database_module = importlib.import_module("elastic_search.database_logic") + database_module = importlib.import_module( + "stac_fastapi.elastic_search.database_logic" + ) DatabaseLogicClass = getattr(database_module, "DatabaseLogic") except ImportError: # Fall back to OpenSearch if Elasticsearch is not available - database_module = importlib.import_module("opensearch.database_logic") + database_module = importlib.import_module( + "stac_fastapi.opensearch.database_logic" + ) DatabaseLogicClass = getattr(database_module, "DatabaseLogic") self.database = DatabaseLogicClass() @@ -752,7 +760,7 @@ class BulkTransactionsClient(BaseBulkTransactionsClient): """ session: Session = attr.ib(default=attr.Factory(Session.create_from_env)) - database: BaseDatabaseLogic = attr.ib(init=False) + # database: BaseDatabaseLogic = attr.ib(init=False) def __attrs_post_init__(self): """ @@ -765,11 +773,15 @@ def __attrs_post_init__(self): """ try: # Dynamically import the database logic based on installed package - database_module = importlib.import_module("elastic_search.database_logic") + database_module = importlib.import_module( + "stac_fastapi.elastic_search.database_logic" + ) DatabaseLogicClass = getattr(database_module, "DatabaseLogic") except ImportError: # Fall back to OpenSearch if Elasticsearch is not available - database_module = importlib.import_module("opensearch.database_logic") + database_module = importlib.import_module( + "stac_fastapi.opensearch.database_logic" + ) DatabaseLogicClass = getattr(database_module, "DatabaseLogic") self.database = DatabaseLogicClass() diff --git a/stac_fastapi/elastic_search/app.py b/stac_fastapi/elastic_search/app.py index 61e1015b..7b251025 100644 --- a/stac_fastapi/elastic_search/app.py +++ b/stac_fastapi/elastic_search/app.py @@ -1,7 +1,5 @@ """FastAPI application.""" -from elastic_search.config import ElasticsearchSettings -from elastic_search.database_logic import create_collection_index -from elastic_search.session import Session +import sys from stac_fastapi.api.app import StacApi from stac_fastapi.api.models import create_get_request_model, create_post_request_model @@ -12,6 +10,9 @@ TransactionsClient, ) from stac_fastapi.common.extensions import QueryExtension +from stac_fastapi.elastic_search.config import ElasticsearchSettings +from stac_fastapi.elastic_search.database_logic import create_collection_index +from stac_fastapi.elastic_search.session import Session from stac_fastapi.extensions.core import ( ContextExtension, FieldsExtension, @@ -22,6 +23,8 @@ ) from stac_fastapi.extensions.third_party import BulkTransactionExtension +print("API sys.path:", sys.path) + settings = ElasticsearchSettings() session = Session.create_from_settings(settings) @@ -46,7 +49,7 @@ api = StacApi( settings=settings, extensions=extensions, - client=CoreClient(session=session), + client=CoreClient(session=session, post_request_model=post_request_model), search_get_request_model=create_get_request_model(extensions), search_post_request_model=post_request_model, ) diff --git a/stac_fastapi/elastic_search/database_logic.py b/stac_fastapi/elastic_search/database_logic.py index 305ab72c..afcb3a30 100644 --- a/stac_fastapi/elastic_search/database_logic.py +++ b/stac_fastapi/elastic_search/database_logic.py @@ -6,14 +6,16 @@ from typing import Any, Dict, Iterable, List, Optional, Protocol, Tuple, Type, Union import attr -from common.extensions import filter -from elastic_search import serializers -from elastic_search.config import AsyncElasticsearchSettings -from elastic_search.config import ElasticsearchSettings as SyncElasticsearchSettings -from elastic_search.utilities import bbox2polygon from elasticsearch_dsl import Q, Search from elasticsearch import exceptions, helpers # type: ignore +from stac_fastapi.common.extensions import filter +from stac_fastapi.elastic_search import serializers +from stac_fastapi.elastic_search.config import AsyncElasticsearchSettings +from stac_fastapi.elastic_search.config import ( + ElasticsearchSettings as SyncElasticsearchSettings, +) +from stac_fastapi.elastic_search.utilities import bbox2polygon from stac_fastapi.types.errors import ConflictError, NotFoundError from stac_fastapi.types.stac import Collection, Item @@ -281,10 +283,10 @@ class DatabaseLogic: sync_client = SyncElasticsearchSettings().create_client item_serializer: Type[serializers.ItemSerializer] = attr.ib( - default=serializers.ItemSerializer + default=serializers.ItemSerializer # type: ignore ) collection_serializer: Type[serializers.CollectionSerializer] = attr.ib( - default=serializers.CollectionSerializer + default=serializers.CollectionSerializer # type: ignore ) """CORE LOGIC""" diff --git a/stac_fastapi/elastic_search/pytest.ini b/stac_fastapi/elastic_search/pytest.ini index db0353ef..f770b9c9 100644 --- a/stac_fastapi/elastic_search/pytest.ini +++ b/stac_fastapi/elastic_search/pytest.ini @@ -1,4 +1,4 @@ [pytest] -testpaths = tests +testpaths = elastic_search/tests addopts = -sv asyncio_mode = auto \ No newline at end of file diff --git a/stac_fastapi/elastic_search/serializers.py b/stac_fastapi/elastic_search/serializers.py index 786e2c98..ce5d1f32 100644 --- a/stac_fastapi/elastic_search/serializers.py +++ b/stac_fastapi/elastic_search/serializers.py @@ -3,8 +3,8 @@ from typing import Any import attr -from common.datetime_utils import now_to_rfc3339_str +from stac_fastapi.common.datetime_utils import now_to_rfc3339_str from stac_fastapi.types import stac as stac_types from stac_fastapi.types.links import CollectionLinks, ItemLinks, resolve_links diff --git a/stac_fastapi/elastic_search/setup.py b/stac_fastapi/elastic_search/setup.py index 2c0607fc..b2999b2b 100644 --- a/stac_fastapi/elastic_search/setup.py +++ b/stac_fastapi/elastic_search/setup.py @@ -57,12 +57,14 @@ url="https://github.com/stac-utils/stac-fastapi-elasticsearch", license="MIT", packages=find_namespace_packages( - include=["elasticsearch", "elasticsearch.*", "common", "common.*"], + include=["elastic_search", "elastic_search.*", "common", "common.*"], exclude=["tests", "scripts"], ), zip_safe=False, install_requires=install_requires, tests_require=extra_reqs["dev"], extras_require=extra_reqs, - entry_points={"console_scripts": ["stac-fastapi-elasticsearch=app:run"]}, + entry_points={ + "console_scripts": ["stac-fastapi-elasticsearch=elastic_search.app:run"] + }, ) diff --git a/stac_fastapi/elastic_search/tests/conftest.py b/stac_fastapi/elastic_search/tests/conftest.py index 2817fda6..026020ae 100644 --- a/stac_fastapi/elastic_search/tests/conftest.py +++ b/stac_fastapi/elastic_search/tests/conftest.py @@ -1,3 +1,7 @@ +import sys + +sys.path.insert(0, "/app") + import asyncio import copy import json @@ -6,14 +10,18 @@ import pytest import pytest_asyncio -from common.core import BulkTransactionsClient, CoreClient, TransactionsClient -from common.extensions import QueryExtension from elastic_search.config import AsyncElasticsearchSettings from elastic_search.database_logic import create_collection_index from httpx import AsyncClient from stac_fastapi.api.app import StacApi from stac_fastapi.api.models import create_get_request_model, create_post_request_model +from stac_fastapi.common.core import ( + BulkTransactionsClient, + CoreClient, + TransactionsClient, +) +from stac_fastapi.common.extensions import QueryExtension from stac_fastapi.extensions.core import ( # FieldsExtension, ContextExtension, FieldsExtension, @@ -24,6 +32,9 @@ ) from stac_fastapi.types.config import Settings +# # Assuming your tests are in the 'tests' directory at the same level as 'stac_fastapi' +# sys.path.append(str(Path(__file__).parent.parent)) + DATA_DIR = os.path.join(os.path.dirname(__file__), "data") diff --git a/stac_fastapi/elastic_search/tests/resources/test_item.py b/stac_fastapi/elastic_search/tests/resources/test_item.py index b66b3572..88f23402 100644 --- a/stac_fastapi/elastic_search/tests/resources/test_item.py +++ b/stac_fastapi/elastic_search/tests/resources/test_item.py @@ -9,11 +9,11 @@ import ciso8601 import pystac import pytest +from common.core import CoreClient from common.datetime_utils import now_to_rfc3339_str from geojson_pydantic.geometries import Polygon from pystac.utils import datetime_to_str -from stac_fastapi.common.core import CoreClient from stac_fastapi.types.core import LandingPageMixin from ..conftest import create_item, refresh_indices