-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
create DailyNoticesMetadata model, repository + tests
- Loading branch information
Showing
7 changed files
with
226 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
92 changes: 92 additions & 0 deletions
92
ted_sws/data_manager/adapters/daily_notices_metadata_repository.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
from datetime import datetime, time | ||
from typing import Iterator, Optional | ||
|
||
from pymongo import MongoClient, ASCENDING | ||
|
||
from ted_sws import config | ||
from ted_sws.core.model.supra_notice import DailyNoticesMetadata | ||
from ted_sws.data_manager.adapters import inject_date_string_fields | ||
from ted_sws.data_manager.adapters.repository_abc import DailyNoticesMetadataRepositoryABC | ||
|
||
DAILY_NOTICES_METADATA_AGGREGATION_DATE = "aggregation_date" | ||
DAILY_NOTICES_METADATA_ID = "_id" | ||
|
||
|
||
class DailyNoticesMetadataRepository(DailyNoticesMetadataRepositoryABC): | ||
""" | ||
This repository is intended for storing DailyNoticesMetadata objects. | ||
""" | ||
|
||
_collection_name = "daily_notices_metadata_collection" | ||
|
||
def __init__(self, mongodb_client: MongoClient, database_name: str = None): | ||
self._database_name = database_name or config.MONGO_DB_AGGREGATES_DATABASE_NAME | ||
self.mongodb_client = mongodb_client | ||
daily_supra_notice_db = mongodb_client[self._database_name] | ||
self.collection = daily_supra_notice_db[self._collection_name] | ||
self.collection.create_index( | ||
[(DAILY_NOTICES_METADATA_AGGREGATION_DATE, | ||
ASCENDING)]) # TODO: index creation may bring race condition error. | ||
|
||
def _update_daily_notices_metadata(self, daily_notices_metadata: DailyNoticesMetadata, upsert: bool = False): | ||
""" | ||
Updates a DailyNoticesMetadata object in the repository. | ||
:param daily_notices_metadata: | ||
:param upsert: | ||
:return: | ||
""" | ||
daily_notices_metadata_dict = daily_notices_metadata.model_dump() | ||
daily_notices_metadata_dict[DAILY_NOTICES_METADATA_AGGREGATION_DATE] = daily_notices_metadata_dict[ | ||
DAILY_NOTICES_METADATA_AGGREGATION_DATE].isoformat() | ||
self.collection.update_one( | ||
{DAILY_NOTICES_METADATA_ID: daily_notices_metadata_dict[DAILY_NOTICES_METADATA_AGGREGATION_DATE]}, | ||
{"$set": daily_notices_metadata_dict}, upsert=upsert) | ||
|
||
def _create_daily_notices_metadata_from_dict(self, daily_notices_metadata_dict: dict) -> Optional[ | ||
DailyNoticesMetadata]: | ||
""" | ||
Creates a DailyNoticesMetadata object from a dictionary. | ||
:param daily_notices_metadata_dict: | ||
:return: | ||
""" | ||
if not daily_notices_metadata_dict: | ||
return None | ||
daily_notices_metadata_dict[DAILY_NOTICES_METADATA_AGGREGATION_DATE] = datetime.fromisoformat( | ||
daily_notices_metadata_dict[ | ||
DAILY_NOTICES_METADATA_AGGREGATION_DATE]) | ||
daily_notices_metadata_dict.pop(DAILY_NOTICES_METADATA_ID, None) | ||
return DailyNoticesMetadata.model_validate(daily_notices_metadata_dict) | ||
|
||
def add(self, daily_notices_metadata: DailyNoticesMetadata): | ||
""" | ||
Adds a DailyNoticesMetadata object to the repository. | ||
:param daily_notices_metadata: | ||
:return: | ||
""" | ||
self._update_daily_notices_metadata(daily_notices_metadata=daily_notices_metadata, upsert=True) | ||
|
||
def update(self, daily_notices_metadata: DailyNoticesMetadata): | ||
""" | ||
Updates a DailyNoticesMetadata object in the repository. | ||
:param daily_notices_metadata: | ||
:return: | ||
""" | ||
self._update_daily_notices_metadata(daily_notices_metadata=daily_notices_metadata) | ||
|
||
def get(self, reference) -> DailyNoticesMetadata: | ||
""" | ||
Gets a DailyNoticesMetadata object from the repository. | ||
:param reference: | ||
:return: | ||
""" | ||
reference = reference.isoformat() | ||
result_dict = self.collection.find_one({DAILY_NOTICES_METADATA_ID: reference}) | ||
return self._create_daily_notices_metadata_from_dict(daily_notices_metadata_dict=result_dict) | ||
|
||
def list(self) -> Iterator[DailyNoticesMetadata]: | ||
""" | ||
Gets all DailyNoticesMetadata objects from the repository. | ||
:return: | ||
""" | ||
for result_dict in self.collection.find(): | ||
yield self._create_daily_notices_metadata_from_dict(daily_notices_metadata_dict=result_dict) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ | |
# Email: [email protected] | ||
|
||
""" """ | ||
from datetime import datetime, date | ||
|
||
import pytest | ||
|
||
|
@@ -14,6 +15,7 @@ | |
XPATHCoverageValidationReport | ||
from ted_sws.core.model.metadata import TEDMetadata, NormalisedMetadata | ||
from ted_sws.core.model.notice import Notice, NoticeStatus | ||
from ted_sws.core.model.supra_notice import DailyNoticesMetadata | ||
|
||
|
||
@pytest.fixture | ||
|
@@ -77,3 +79,12 @@ def transformation_eligible_notice(indexed_notice) -> Notice: | |
indexed_notice.set_normalised_metadata(normalised_metadata=NormalisedMetadata(**{"AA": "notice metadata "})) | ||
indexed_notice.update_status_to(NoticeStatus.ELIGIBLE_FOR_TRANSFORMATION) | ||
return indexed_notice | ||
|
||
|
||
@pytest.fixture() | ||
def notice_aggregation_date_date() -> date: | ||
return datetime.strptime("2021-01-08", "%Y-%m-%d") | ||
|
||
@pytest.fixture() | ||
def daily_notice_metadata(notice_aggregation_date_date) -> DailyNoticesMetadata: | ||
return DailyNoticesMetadata(aggregation_date=notice_aggregation_date_date) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
from ted_sws.core.model.notice import NoticeStatus | ||
from ted_sws.core.model.supra_notice import DailyNoticesMetadata | ||
|
||
|
||
def test_daily_notice_metadata_model(daily_notice_metadata): | ||
daily_notice_metadata_dict = daily_notice_metadata.model_dump() | ||
daily_notice_metadata_from_dict = DailyNoticesMetadata(**daily_notice_metadata_dict) | ||
assert daily_notice_metadata == daily_notice_metadata_from_dict |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 23 additions & 0 deletions
23
tests/unit/data_manager/test_daily_notices_metadata_repository.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
from ted_sws.data_manager.adapters.daily_notices_metadata_repository import DailyNoticesMetadataRepository | ||
|
||
|
||
def test_daily_notices_metadata_repository(mongodb_client, daily_notices_metadata): | ||
daily_notices_metadata_repository = DailyNoticesMetadataRepository(mongodb_client=mongodb_client) | ||
|
||
# Upset is False by default | ||
daily_notices_metadata_repository.update(daily_notices_metadata) | ||
assert daily_notices_metadata_repository.get(daily_notices_metadata.aggregation_date) is None | ||
|
||
# Creates a new object | ||
daily_notices_metadata_repository.add(daily_notices_metadata) | ||
assert daily_notices_metadata == daily_notices_metadata_repository.get(daily_notices_metadata.aggregation_date) | ||
|
||
# Check if only on object in the repository | ||
assert len(list(daily_notices_metadata_repository.list())) == 1 | ||
|
||
# Only one object in the repository | ||
assert list(daily_notices_metadata_repository.list()) == [daily_notices_metadata] | ||
|
||
# Check if on add updates the object | ||
daily_notices_metadata_repository.add(daily_notices_metadata) | ||
assert list(daily_notices_metadata_repository.list()) == [daily_notices_metadata] |