Skip to content

Commit 64860f5

Browse files
Merge pull request #197 from meaningfy-ws/feature/TED-379
Feature/ted 379
2 parents 8bfb6a1 + f2fac31 commit 64860f5

10 files changed

Lines changed: 111 additions & 14 deletions

File tree

dags/selector_daily_fetch_orchestrator.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from ted_sws import config
1111
from ted_sws.core.model.notice import NoticeStatus
1212
from ted_sws.data_manager.adapters.notice_repository import NoticeRepository
13-
from ted_sws.data_sampler.services.notice_xml_indexer import index_notice
1413
from ted_sws.event_manager.adapters.event_log_decorator import event_log
1514
from ted_sws.event_manager.model.event_message import TechnicalEventMessage, EventMessageMetadata, \
1615
EventMessageProcessType

ted_sws/notice_fetcher/adapters/ted_api_abc.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def __call__(self, api_url: str, api_query: dict) -> dict:
1717
"""
1818

1919

20-
2120
class TedAPIAdapterABC(abc.ABC):
2221
@abc.abstractmethod
2322
def get_by_id(self, document_id: str) -> dict:

ted_sws/notice_validator/adapters/xpath_coverage_runner.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,13 @@ def xpath_coverage(self, report: XPATHCoverageReport, notice_xpaths: XPATH_TYPE,
8181
report.xpath_covered = list(self.conceptual_xpaths & unique_notice_xpaths)
8282
report.xpath_not_covered = list(unique_notice_xpaths - self.conceptual_xpaths)
8383
report.xpath_extra = list(self.conceptual_xpaths - unique_notice_xpaths)
84-
if len(unique_notice_xpaths):
85-
report.coverage = len(report.xpath_covered) / len(unique_notice_xpaths)
84+
unique_notice_xpaths_len = len(unique_notice_xpaths)
85+
xpath_covered_len = len(report.xpath_covered)
86+
conceptual_xpaths_len = len(self.conceptual_xpaths)
87+
if unique_notice_xpaths_len:
88+
report.coverage = xpath_covered_len / unique_notice_xpaths_len
89+
if conceptual_xpaths_len:
90+
report.conceptual_coverage = xpath_covered_len / conceptual_xpaths_len
8691

8792
@classmethod
8893
def based_xpaths(cls, xpaths: List[str], base_xpath: str) -> List[str]:

ted_sws/notice_validator/model/coverage_report.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ class XPATHCoverageReport(PropertyBaseModel):
2626
xpath_not_covered: Optional[List[str]]
2727
xpath_extra: Optional[List[str]]
2828
coverage: Optional[float]
29+
conceptual_coverage: Optional[float]

ted_sws/notice_validator/resources/templates/xpath_coverage_report.jinja2

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,17 @@
7373
<ul>
7474
<li>Date created: {{ created_at }}</li>
7575
<li>Mapping suite identifier: {{ mapping_suite_id }}</li>
76-
<li>Coverage: <strong>{{ coverage }}</strong>
77-
<div><hr></div></li>
78-
<li>Notice identifier(s):
76+
<li>
77+
<div><hr></div>
78+
<h4>Overall coverage</h4>
79+
<h3>{{ "%.2f"|format((coverage|float * 100)) }}%</h3>
80+
<p>(Number of Conceptual XPATHs found in notices) / (Total number of unique XPATHs in provided notices)</p>
81+
<li><div><hr></div>
82+
<h4>Conceptual coverage</h4>
83+
<h3>{{ "%.2f"|format((conceptual_coverage|float * 100)) }}%</h3>
84+
<p>(Number of Conceptual XPATHs found in notices) / (Total number of unique Conceptual XPATHs)</p>
85+
</li>
86+
<li><div><hr></div>Notice identifier(s):
7987
<div data-role="collapsible" data-state="{% if notice_id|length > 1 %}collapsed{% endif %}"
8088
class="collapsible-wrapper">
8189
<h4><a href="#"></a></h4>
@@ -97,16 +105,17 @@
97105
<tr>
98106
<th>Title</th>
99107
<th>XPATH</th>
100-
<th>Count</th>
101-
<th>Notice</th>
102-
<th>Result</th>
108+
<th>Found</th>
109+
<th>Notice count</th>
110+
<th>Notices</th>
103111
</tr>
104112
</thead>
105113
<tbody>
106114
{% for item in xpath_assertions %}
107115
<tr>
108116
<td>{{ item.title }}</td>
109117
<td>{{ item.xpath }}</td>
118+
<td class="{% if item.query_result %}success{% else %}error{% endif %}">{{ item.query_result }}</td>
110119
<td>{{ item.count }}</td>
111120
<td class="notice-hit">{% if item.notice_hit %}
112121
<div data-role="collapsible" data-state="collapsed">
@@ -116,7 +125,6 @@
116125
</div>
117126
</div>
118127
{% endif %}</td>
119-
<td class="{% if item.query_result %}success{% else %}error{% endif %}">{{ item.query_result }}</td>
120128
</tr>
121129
{% endfor %}
122130
</tbody>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from datetime import datetime, date, time
2+
from typing import Union
3+
4+
from pymongo import MongoClient
5+
6+
from ted_sws.core.model.supra_notice import SupraNoticeValidationReport, DailySupraNotice
7+
from ted_sws.data_manager.adapters.supra_notice_repository import DailySupraNoticeRepository
8+
from ted_sws.notice_fetcher.adapters.ted_api import TedAPIAdapter, RequestAPI
9+
10+
day_type = Union[datetime, date]
11+
12+
13+
def validate_and_update_daily_supra_notice(notice_publication_day: day_type, mongodb_client: MongoClient,
14+
request_api: RequestAPI = None):
15+
if isinstance(notice_publication_day, date):
16+
notice_publication_day = datetime.combine(notice_publication_day, time())
17+
18+
repo = DailySupraNoticeRepository(mongodb_client=mongodb_client)
19+
supra_notice: DailySupraNotice = repo.get(reference=notice_publication_day)
20+
21+
if not supra_notice:
22+
raise ValueError("SupraNotice not found in Database!")
23+
24+
fetched_notice_ids_list = supra_notice.notice_ids or []
25+
fetched_notice_ids = set(fetched_notice_ids_list)
26+
27+
ted_api_adapter: TedAPIAdapter = TedAPIAdapter(request_api=request_api)
28+
documents = ted_api_adapter.get_by_wildcard_date(wildcard_date=notice_publication_day.strftime("%Y%m%d*"))
29+
api_notice_ids_list = [document["ND"] for document in documents] if documents and len(documents) else []
30+
api_notice_ids = set(api_notice_ids_list)
31+
32+
validation_report = SupraNoticeValidationReport(object_data="")
33+
missing_notice_ids = api_notice_ids - fetched_notice_ids
34+
if len(missing_notice_ids):
35+
validation_report.missing_notice_ids = missing_notice_ids
36+
37+
supra_notice.validation_report = validation_report
38+
repo.update(daily_supra_notice=supra_notice)

tests/conftest.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def notice_repository():
3939
def ted_document_search():
4040
return TedAPIAdapter(request_api=FakeRequestAPI())
4141

42+
4243
@pytest.fixture
4344
def raw_notice(ted_document_search, notice_repository, notice_id) -> Notice:
4445
document_id = notice_id
@@ -47,6 +48,7 @@ def raw_notice(ted_document_search, notice_repository, notice_id) -> Notice:
4748
raw_notice = notice_repository.get(reference=document_id)
4849
return raw_notice
4950

51+
5052
@pytest.fixture
5153
def indexed_notice(raw_notice) -> Notice:
5254
raw_notice.set_xml_metadata(XMLMetadata(unique_xpaths=["FAKE_INDEX_XPATHS"]))
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
3+
from ted_sws.data_manager.adapters.supra_notice_repository import DailySupraNoticeRepository
4+
from tests.fakes.fake_ted_api import FakeRequestAPI
5+
6+
7+
@pytest.fixture
8+
def daily_supra_notice_repository(mongodb_client) -> DailySupraNoticeRepository:
9+
return DailySupraNoticeRepository(mongodb_client=mongodb_client)
10+
11+
12+
@pytest.fixture
13+
def fake_request_api():
14+
return FakeRequestAPI()

tests/unit/supra_notice_manager/test_daily_supra_notice_manager.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
create_and_store_in_mongo_db_daily_supra_notice
66

77

8-
def test_daily_supra_notice_manager(mongodb_client):
8+
def test_daily_supra_notice_manager(mongodb_client, daily_supra_notice_repository):
99
notice_ids = ["1", "2", "3"]
1010
create_and_store_in_mongo_db_daily_supra_notice(notice_ids=notice_ids, mongodb_client=mongodb_client)
11-
daily_supra_notice_repository = DailySupraNoticeRepository(mongodb_client=mongodb_client)
1211
result = daily_supra_notice_repository.get(reference=datetime.combine(datetime.today(), time()))
13-
assert result
12+
assert result
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from datetime import datetime, time
2+
3+
import pytest
4+
5+
from ted_sws.supra_notice_manager.services.daily_supra_notice_manager import \
6+
create_and_store_in_mongo_db_daily_supra_notice
7+
from ted_sws.supra_notice_manager.services.supra_notice_validator import validate_and_update_daily_supra_notice
8+
9+
10+
def test_supra_notice_validator(mongodb_client, daily_supra_notice_repository, fake_request_api):
11+
today = datetime.combine(datetime.today(), time())
12+
13+
with pytest.raises(ValueError):
14+
validate_and_update_daily_supra_notice(today, mongodb_client, fake_request_api)
15+
16+
api_document_id = "067623-2022"
17+
18+
notice_ids = ["1", "2", "3"]
19+
create_and_store_in_mongo_db_daily_supra_notice(notice_ids=notice_ids, mongodb_client=mongodb_client)
20+
validate_and_update_daily_supra_notice(today, mongodb_client, fake_request_api)
21+
result = daily_supra_notice_repository.get(reference=today)
22+
assert result
23+
assert len(result.validation_report.missing_notice_ids) > 0
24+
assert api_document_id in result.validation_report.missing_notice_ids
25+
assert not result.validation_report.is_valid()
26+
27+
notice_ids = [api_document_id]
28+
create_and_store_in_mongo_db_daily_supra_notice(notice_ids=notice_ids, mongodb_client=mongodb_client)
29+
validate_and_update_daily_supra_notice(today, mongodb_client, fake_request_api)
30+
result = daily_supra_notice_repository.get(reference=today)
31+
assert result
32+
assert result.validation_report.is_valid()

0 commit comments

Comments
 (0)