diff --git a/CHANGELOG.md b/CHANGELOG.md index 31158113..0c02f55a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## v2.7.0 - 2024-12-02 + +### Added + +- [#297](https://github.com/networktocode/circuit-maintenance-parser/pull/297) - Added new parser for Tata Communications. + +### Dependencies + +- [#295](https://github.com/networktocode/circuit-maintenance-parser/pull/295) - Remove pydantic dotenv extra + +### Changed + +- [#291](https://github.com/networktocode/circuit-maintenance-parser/pull/291) - Update Windstream Parser for new emails + ## v2.6.1 - 2024-06-04 ### Fixed diff --git a/README.md b/README.md index 2c30b406..505551a7 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ By default, there is a `GenericProvider` that supports a `SimpleProcessor` using - Netflix (AS2906 only) - Seaborn - Sparkle +- Tata - Telstra (\*) - Turkcell - Verizon diff --git a/circuit_maintenance_parser/__init__.py b/circuit_maintenance_parser/__init__.py index b555c7e1..154d6bb6 100644 --- a/circuit_maintenance_parser/__init__.py +++ b/circuit_maintenance_parser/__init__.py @@ -28,6 +28,7 @@ PacketFabric, Seaborn, Sparkle, + Tata, Telia, Telstra, Turkcell, @@ -59,6 +60,7 @@ PacketFabric, Seaborn, Sparkle, + Tata, Telia, Telstra, Turkcell, diff --git a/circuit_maintenance_parser/parsers/tata.py b/circuit_maintenance_parser/parsers/tata.py new file mode 100644 index 00000000..22a16a4d --- /dev/null +++ b/circuit_maintenance_parser/parsers/tata.py @@ -0,0 +1,71 @@ +# pylint: disable=disallowed-name +"""Circuit maintenance parser for Tata Email notifications.""" +from typing import List, Dict, Any +from datetime import datetime + +from bs4.element import ResultSet # type: ignore +from circuit_maintenance_parser.output import Impact, Status +from circuit_maintenance_parser.parser import Html, EmailSubjectParser + + +class HtmlParserTata(Html): + """Custom Parser for HTML portion of Tata circuit maintenance notifications.""" + + def parse_html(self, soup: ResultSet) -> List[Dict]: + """Parse Tata circuit maintenance email.""" + prev: str = "" + data: Dict[str, Any] = { + "account": "N/A", + "circuits": [], + "organizer": soup.select("a[href^=mailto]")[0].text.strip(), + } + for span in soup.find_all("span"): + curr = span.text.strip() + if curr != prev: + prev_lower = prev.lower() + if prev_lower == "ticket reference - tcl": + data["maintenance_id"] = curr + elif prev_lower == "service id": + for circuit in curr.split(","): + data["circuits"].append( + { + "circuit_id": circuit.strip(), + "impact": Impact.OUTAGE, + } + ) + elif prev_lower in ("activity window (gmt)", "revised activity window (gmt)"): + start_end = curr.split("to") + data["start"] = self._parse_time(start_end[0]) + data["end"] = self._parse_time(start_end[1]) + elif "extended up to time window" in prev_lower: + if "gmt" in curr.lower(): + data["end"] = self._parse_time(curr) + prev = span.text.strip() + + return [data] + + @staticmethod + def _parse_time(string: str) -> int: + """Convert YYYY-MM-DD HH:MM:SS GMT to epoch.""" + return int((datetime.strptime(string.strip(), "%Y-%m-%d %H:%M:%S GMT") - datetime(1970, 1, 1)).total_seconds()) + + +class SubjectParserTata(EmailSubjectParser): + """Custom Parser for Email subject of Tata circuit maintenance notifications.""" + + def parse_subject(self, subject: str) -> List[Dict]: + """Parse Tata Email subject for summary and status.""" + data: Dict[str, Any] = {"summary": subject.strip().replace("\n", "")} + subject_lower = subject.lower() + if "completion" in subject_lower: + data["status"] = Status.COMPLETED + elif "reschedule" in subject_lower or "extension" in subject_lower: + data["status"] = Status.RE_SCHEDULED + elif "reminder" in subject_lower: + data["status"] = Status.CONFIRMED + elif "cancellation" in subject_lower: + data["status"] = Status.CANCELLED + else: + data["status"] = Status.CONFIRMED + + return [data] diff --git a/circuit_maintenance_parser/parsers/windstream.py b/circuit_maintenance_parser/parsers/windstream.py index e0e18879..898f7943 100644 --- a/circuit_maintenance_parser/parsers/windstream.py +++ b/circuit_maintenance_parser/parsers/windstream.py @@ -41,28 +41,25 @@ def parse_html(self, soup): data["summary"] = summary_text - table = soup.find("table") - for row in table.find_all("tr"): - if len(row) < 2: - continue - cols = row.find_all("td") - header_tag = cols[0].string - if header_tag is None or header_tag == "Maintenance Address:": - continue - header_tag = header_tag.string.strip() - value_tag = cols[1].string.strip() - if header_tag == "WMT:": - data["maintenance_id"] = value_tag - elif "Date & Time:" in header_tag: - dt_time = convert_timezone(value_tag) - if "Event Start" in header_tag: - data["start"] = int(dt_time.replace(tzinfo=timezone.utc).timestamp()) - elif "Event End" in header_tag: - data["end"] = int(dt_time.replace(tzinfo=timezone.utc).timestamp()) - elif header_tag == "Outage": - impact = Impact("OUTAGE") - else: - continue + impact = soup.find("td", string="Outage").find_next_sibling("td").string + if impact: + impact = Impact("OUTAGE") + + maint_id = soup.find("td", string="WMT:").find_next_sibling("td").string + if maint_id: + data["maintenance_id"] = maint_id + + event = soup.find("td", string="Event Start Date & Time:").find_next_sibling("td").string + if event: + dt_time = convert_timezone(event) + data["start"] = int(dt_time.replace(tzinfo=timezone.utc).timestamp()) + event = "" + + event = soup.find("td", string="Event End Date & Time:").find_next_sibling("td").string + if event: + dt_time = convert_timezone(event) + data["end"] = int(dt_time.replace(tzinfo=timezone.utc).timestamp()) + event = "" table = soup.find("table", "circuitTable") for row in table.find_all("tr"): diff --git a/circuit_maintenance_parser/provider.py b/circuit_maintenance_parser/provider.py index d2fdeec8..4879aa89 100644 --- a/circuit_maintenance_parser/provider.py +++ b/circuit_maintenance_parser/provider.py @@ -37,6 +37,7 @@ SubjectParserSeaborn2, ) from circuit_maintenance_parser.parsers.sparkle import HtmlParserSparkle1 +from circuit_maintenance_parser.parsers.tata import HtmlParserTata, SubjectParserTata from circuit_maintenance_parser.parsers.telstra import HtmlParserTelstra1, HtmlParserTelstra2 from circuit_maintenance_parser.parsers.turkcell import HtmlParserTurkcell1 from circuit_maintenance_parser.parsers.verizon import HtmlParserVerizon1 @@ -428,6 +429,19 @@ class Sparkle(GenericProvider): _default_organizer = PrivateAttr("TISAmericaNOC@tisparkle.com") +class Tata(GenericProvider): + """Tata provider custom class.""" + + _include_filter = PrivateAttr({EMAIL_HEADER_SUBJECT: ["Planned Work Notification"]}) + + _processors: List[GenericProcessor] = PrivateAttr( + [ + CombinedProcessor(data_parsers=[HtmlParserTata, SubjectParserTata, EmailDateParser]), + ] + ) + _default_organizer = PrivateAttr("planned.activity@tatacommunications.com") + + class Telia(Arelion): """Telia provider custom class.""" diff --git a/poetry.lock b/poetry.lock index 9d71a552..eece2898 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "annotated-types" @@ -51,8 +51,8 @@ files = [ lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} wrapt = [ - {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, ] [[package]] @@ -1224,109 +1224,123 @@ files = [ [[package]] name = "pydantic" -version = "2.7.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, - {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.2" -typing-extensions = ">=4.6.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.18.2" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, - {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, - {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, - {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, - {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, - {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, - {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, - {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, - {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, - {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, - {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, - {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, - {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, - {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -1389,8 +1403,8 @@ files = [ astroid = ">=2.15.8,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, + {version = ">=0.2", markers = "python_version < \"3.11\""}, ] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" @@ -1462,7 +1476,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1470,15 +1483,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1495,7 +1501,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1503,7 +1508,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1655,8 +1659,8 @@ files = [ cffi = ">=1.15.1,<2" h3 = ">=3.7.6,<4" numpy = [ - {version = ">=1.21,<2", markers = "python_version < \"3.9\""}, {version = ">=1.23,<2", markers = "python_version >= \"3.9\""}, + {version = ">=1.21,<2", markers = "python_version < \"3.9\""}, ] setuptools = ">=65.5" @@ -1772,6 +1776,17 @@ files = [ {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + [[package]] name = "urllib3" version = "2.2.1" @@ -1892,4 +1907,4 @@ openai = ["openai"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "9ab41a80a9bd6e683f762a62dc68718c962f2b3cdff26e2d7f0427a20751a6d4" +content-hash = "7909185afb5f01fef21f20bcff042bcf56dd8b71e6692352e5fd92b5117a1bcb" diff --git a/pyproject.toml b/pyproject.toml index 7fdb978e..5699db2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "circuit-maintenance-parser" -version = "2.6.1" +version = "2.7.0" description = "Python library to parse Circuit Maintenance notifications and return a structured data back" authors = ["Network to Code "] license = "Apache-2.0" @@ -24,7 +24,7 @@ include = [ [tool.poetry.dependencies] python = "^3.8" click = ">=7.1, <9.0" -pydantic = {version = ">= 1.8.0, != 1.9.*, >= 1.10.4, < 3", extras = ["dotenv"]} +pydantic = ">=1.10.4,<3" icalendar = "^5.0.0" bs4 = "^0.0.2" lxml = {version = ">= 4.6.2, < 6"} diff --git a/tests/unit/data/tata/tata_body.html b/tests/unit/data/tata/tata_body.html new file mode 100644 index 00000000..24b3a571 --- /dev/null +++ b/tests/unit/data/tata/tata_body.html @@ -0,0 +1,102 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Dear Customer,

+

 

+

Tata Communication is in receipt of maintenance activity. The details of maintenance activity are as below. Your below mentioned service would experience an + outage of “8 Days 23 Hours 58 Minutes” during the activity window.

+

 

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service IDA012345678901234567, B012345678901234567
NIMS IDF0123-45678-901, F0123-45678-901
Maintenance TypeNormal
Activity StatusScheduled
Execution OwnerInternational Cables
Location of activityMumbai
 
Activity Window (IST)2024-12-22 05:31:00 IST to 2024-12-31 05:29:00 IST
Activity Window (GMT)2024-12-22 00:01:00 GMT to 2024-12-30 23:59:00 GMT
Expected Impact Duration(DD:HH:MM) :8 Days 23 Hours 58 Minutes
 
Activity DescriptionPlanned activity for shunt fault repair of Seg 11 near Mumbai in TGNEA network.
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000142929801
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_body_result.json b/tests/unit/data/tata/tata_body_result.json new file mode 100644 index 00000000..6c8b1940 --- /dev/null +++ b/tests/unit/data/tata/tata_body_result.json @@ -0,0 +1,19 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "A012345678901234567", + "impact": "OUTAGE" + }, + { + "circuit_id": "B012345678901234567", + "impact": "OUTAGE" + } + ], + "end": 1735603140, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1734825660 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_cancellation_body.html b/tests/unit/data/tata/tata_cancellation_body.html new file mode 100644 index 00000000..5c0135e9 --- /dev/null +++ b/tests/unit/data/tata/tata_cancellation_body.html @@ -0,0 +1,103 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Dear Customer,

+

Please note that this activity has been cancelled. +

+

The details for the same have been mentioned below:  +

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service ID01234567890123456789
NIMS ID
Maintenance TypeNormal
Activity StatusCanceled
Execution Owner3rd party service Provider
Location of activityLONDON
 
Activity Window (IST)2024-11-21 04:30:00 IST to 2024-11-22 10:30:00 IST
Activity Window (GMT)2024-11-20 23:00:00 GMT to 2024-11-22 05:00:00 GMT
Expected Impact Duration(DD:HH:MM) :6 Hours
 
Activity Description Third party service provider will execute network maintenance activity for Network redevelopment.
+ Services will be impacted for 6 hrs on each Days.
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000143017654
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_cancellation_body_result.json b/tests/unit/data/tata/tata_cancellation_body_result.json new file mode 100644 index 00000000..9273051c --- /dev/null +++ b/tests/unit/data/tata/tata_cancellation_body_result.json @@ -0,0 +1,15 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "01234567890123456789", + "impact": "OUTAGE" + } + ], + "end": 1732251600, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1732143600 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_cancellation_subject.txt b/tests/unit/data/tata/tata_cancellation_subject.txt new file mode 100644 index 00000000..ae95c43a --- /dev/null +++ b/tests/unit/data/tata/tata_cancellation_subject.txt @@ -0,0 +1 @@ +Cancellation Notification /TCL TT: "CHGP0123456" / "Normal" / "Canceled" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_cancellation_subject_result.json b/tests/unit/data/tata/tata_cancellation_subject_result.json new file mode 100644 index 00000000..f9e9faef --- /dev/null +++ b/tests/unit/data/tata/tata_cancellation_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "CANCELLED", + "summary": "Cancellation Notification /TCL TT: \"CHGP0123456\" / \"Normal\" / \"Canceled\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_completion_body.html b/tests/unit/data/tata/tata_completion_body.html new file mode 100644 index 00000000..4a96bd1c --- /dev/null +++ b/tests/unit/data/tata/tata_completion_body.html @@ -0,0 +1,101 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Dear Customer,

+

Please note that this activity, has been completed successfully.

+

The details for the same have been mentioned below: +

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service IDI0123-45678-901
NIMS IDI0123-45678-901
Maintenance TypeNormal
Activity StatusClosed
Execution OwnerTata Backbone Network
Location of activitySVQ - Singapore & EMRS2 (Marseille)
 
Activity Window (IST)2024-11-12 19:30:00 IST to 2024-11-12 21:30:00 IST
Activity Window (GMT)2024-11-12 14:00:00 GMT to 2024-11-12 16:00:00 GMT
Expected Impact Duration(DD:HH:MM) :30 Minutes
 
Activity DescriptionTata Backbone Team will implement Service Affecting planned activity for software upgrade.
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000142855632
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_completion_body_result.json b/tests/unit/data/tata/tata_completion_body_result.json new file mode 100644 index 00000000..3a79d7d3 --- /dev/null +++ b/tests/unit/data/tata/tata_completion_body_result.json @@ -0,0 +1,15 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "I0123-45678-901", + "impact": "OUTAGE" + } + ], + "end": 1731427200, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1731420000 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_completion_subject.txt b/tests/unit/data/tata/tata_completion_subject.txt new file mode 100644 index 00000000..963a1c34 --- /dev/null +++ b/tests/unit/data/tata/tata_completion_subject.txt @@ -0,0 +1 @@ +Completion Notification /TCL TT: "CHGP0123456" / "Normal" / "Closed" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_completion_subject_result.json b/tests/unit/data/tata/tata_completion_subject_result.json new file mode 100644 index 00000000..8609f886 --- /dev/null +++ b/tests/unit/data/tata/tata_completion_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "COMPLETED", + "summary": "Completion Notification /TCL TT: \"CHGP0123456\" / \"Normal\" / \"Closed\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_email.eml b/tests/unit/data/tata/tata_email.eml new file mode 100644 index 00000000..13b38757 --- /dev/null +++ b/tests/unit/data/tata/tata_email.eml @@ -0,0 +1,335 @@ +Received: from SJ0PR01MB6477.prod.exchangelabs.com (2603:10b6:a03:29b::15) by + SN7PR01MB7921.prod.exchangelabs.com with HTTPS; Wed, 13 Nov 2024 13:52:32 + +0000 +Received: from MW4PR04CA0202.namprd04.prod.outlook.com (2603:10b6:303:86::27) + by SJ0PR01MB6477.prod.exchangelabs.com (2603:10b6:a03:29b::15) with Microsoft + SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id + 15.20.8158.17; Wed, 13 Nov 2024 13:52:26 +0000 +Received: from MWH0EPF000971E2.namprd02.prod.outlook.com + (2603:10b6:303:86:cafe::b0) by MW4PR04CA0202.outlook.office365.com + (2603:10b6:303:86::27) with Microsoft SMTP Server (version=TLS1_2, + cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8158.16 via Frontend + Transport; Wed, 13 Nov 2024 13:52:25 +0000 +Received: from esa.hc5801-97.iphmx.com (68.232.145.138) by + MWH0EPF000971E2.mail.protection.outlook.com (10.167.243.69) with Microsoft + SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id + 15.20.8158.14 via Frontend Transport; Wed, 13 Nov 2024 13:52:23 +0000 +Received: from mx8.tatacommunications.com ([66.198.167.198]) + by esa3.hc5801-97.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Nov 2024 05:52:18 -0800 +Received: from unknown (HELO app150053.phx201.service-now.com) ([199.91.136.12]) + by Mx8.tatacommunications.com with ESMTP; 13 Nov 2024 08:50:40 -0500 +From: Do-Not-Reply +Subject: TCL TT: "CHGP0123456" / "Normal" / "Scheduled" / Planned Work + Notification +Thread-Topic: TCL TT: "CHGP0123456" / "Normal" / "Scheduled" / Planned Work + Notification +Thread-Index: AQHbNdNJIbPWneNx/EeY2NpjB+Q21w== +X-MS-Exchange-MessageSentRepresentingType: 1 +Date: Wed, 13 Nov 2024 13:50:40 +0000 +Message-ID: <71995954.23300.1731505840801@app150053.phx201.service-now.com> +List-Unsubscribe: + +Reply-To: "Do-Not-Reply@tatacommunications.com" + +Content-Language: en-US +X-MS-Exchange-Organization-AuthAs: Anonymous +X-MS-Exchange-Organization-AuthSource: + MWH0EPF000971E2.namprd02.prod.outlook.com +X-MS-Has-Attach: yes +X-Auto-Response-Suppress: DR, OOF, AutoReply +X-MS-Exchange-Organization-Network-Message-Id: + ed49c87c-53fc-4648-e27b-08dd03ea670c +X-MS-TNEF-Correlator: +X-MS-Exchange-Organization-RecordReviewCfmType: 0 +x-ms-publictraffictype: Email +received-spf: None (esa.hc5801-97.iphmx.com: no sender authenticity + information available from domain of postmaster@Mx8.tatacommunications.com) + identity=helo; client-ip=66.198.167.198; receiver=esa.hc5801-97.iphmx.com; + envelope-from="Do-Not-Reply@tatacommunications.com"; + x-sender="postmaster@Mx8.tatacommunications.com"; + x-conformance=sidf_compatible +ironport-sdr: 6734af13_IWoJR2Yv3a7tNd5HK2w4bxEtP8A4oES9mDNC4TO/AVhiNT0 + e6Zja5I1Cci6Vhd7zv0TtZCqFSrug3idybjtpHg== +x-ironport-av: E=Sophos;i="6.12,151,1728975600"; + d="scan'208,217";a="88495262" +x-amp-result: UNKNOWN +x-amp-original-verdict: FILE UNKNOWN +x-amp-file-uploaded: False +authentication-results: spf=pass (sender IP is 66.198.167.198) + smtp.mailfrom=tatacommunications.com; dkim=pass (signature was verified) + header.d=tatacommunications.com;dmarc=pass action=none + header.from=tatacommunications.com;compauth=pass reason=100 +dkim-signature: v=1; a=rsa-sha256; c=simple/simple; d=tatacommunications.com; + i=@tatacommunications.com; q=dns/txt; s=selector11; t=1731505939; + x=1763041939; h=date:from:reply-to:to:message-id:subject:mime-version: + list-unsubscribe; bh=Y8l/NtqYKtfWmrd8Vd9luBNgZ/r2S/GmUuhDalYp3TM=; + b=T1nY+nwStSiHqVBueKed0WuECs/uLp0XF89wxiX0hrXOaDo4uBaMUg6C + 97asGGoFSPfXFmvEJSKfEH85dhHpFQ+VJhkscavJwOlHVAM4LahxJU7ux + TpwgPecNZrbnK6YHKH3+FptCepvE+W7yHP4i66Z8JArRxAcFPTTCgfU62 + omBW1IlRLTdc7OuXyYaWmTvQCcFtJ0SIzj5m7fmWirMJT4x9bw5F16wMh + u1La48mxINJsI1aJ2tqMqQE4+HGR3+HWJGfu7nt2D09pXlYl/SmDzslxO + TaN1Ch+3bAOmhy1YEoBZs1uyLmYbi3bSROVixrjA4xNMYcyqW5bRo7TM1 Q==; +x-ms-office365-filtering-correlation-id: ed49c87c-53fc-4648-e27b-08dd03ea670c +x-ms-traffictypediagnostic: + MWH0EPF000971E2:EE_|SJ0PR01MB6477:EE_|SN7PR01MB7921:EE_ +x-microsoft-antispam: + BCL:3;ARA:13230040|3072899012|2092899012|5062899012|3092899012|12012899012|4022899009|82310400026|4076899003|8096899003; +x-forefront-antispam-report: + CIP:68.232.145.138;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mx8.tatacommunications.com;PTR:mx8.tatacommunications.com;CAT:NONE;SFS:(13230040)(3072899012)(2092899012)(5062899012)(3092899012)(12012899012)(4022899009)(82310400026)(4076899003)(8096899003);DIR:INB; +x-ms-exchange-crosstenant-authas: Anonymous +x-ms-exchange-crosstenant-authsource: + MWH0EPF000971E2.namprd02.prod.outlook.com +x-ms-exchange-crosstenant-network-message-id: + ed49c87c-53fc-4648-e27b-08dd03ea670c +x-ms-exchange-crosstenant-originalarrivaltime: 13 Nov 2024 13:52:23.8544 (UTC) +x-ms-exchange-crosstenant-fromentityheader: Internet +x-ms-exchange-crosstenant-id: dd3dfd2f-6a3b-40d1-9be0-bf8327d81c50 +x-ms-exchange-transport-crosstenantheadersstamped: SJ0PR01MB6477 +x-ms-exchange-transport-endtoendlatency: 00:00:08.8601533 +x-ms-exchange-processed-by-bccfoldering: 15.20.8158.013 +ironport-hdrordr: A9a23:+9oMr6FhK2q+brDApLqEL8eALOsnbusQ8zAXPiFKOGVom6mj/P + xG885rsiMc9wxhO03I9ersBED4ewK5yXcX2/h2AV7BZmnbUQKTRekJ0WKF+VPd8kbFmdK1u5 + 0NT4FOTPC1LUESt7ee3CCIV+8bhPat1cmT9Jzj5kYodxgvT6179Q92BkK6HyRNNXF7LIt8Dp + 3Z7sFavTahdB0sD/iTFz0ZRODIpdHR/aiWAyI7Ow== +authentication-results-original: esa.hc5801-97.iphmx.com; spf=None + smtp.pra=Do-Not-Reply@tatacommunications.com; spf=Pass + smtp.mailfrom=Do-Not-Reply@tatacommunications.com; spf=None + smtp.helo=postmaster@Mx8.tatacommunications.com; dkim=pass (signature + verified) header.i=@tatacommunications.com; dmarc=pass (p=reject dis=none) + d=tatacommunications.com +x-eopattributedmessage: 0 +x-eoptenantattributedmessage: dd3dfd2f-6a3b-40d1-9be0-bf8327d81c50:0 +x-tenant: A891CFC00BC182B5C1E6A97 +x-ms-exchange-atpmessageproperties: SA|SL +x-ironport-anti-spam-filtered: true +x-ipas-result: + A0EJAAAGrjRne8anxkJaGwEBAQEBAQEBBQEBARIBAQEDAwEBAYF/BgEBAQsBgUBbKBkBSAGBJwRThFaIHYcwgiGJAIsHhkhjgRCBVhSBXgwPAQEBAQEBDC4BFQQBBASFAB+KIwEeBwEEMAkOAQIBAgEBAQEBAwIDAQEBAQEBAQEBDQEBAQQBAQECAQECBAMCAQECEAEBQkmFQQgyDYI9HoEsgSYBAQEBAQEBAQEBAQEdAghjAQEhBgwBAhEdAQEECicDBjEBAgwWAgIHHjAEBBEBIoIHgnZHAwWjDwGBLD8CKAFAAQyBCwoBiQkBAQF4gTIaAmWCDAEBBgQDAgOCRNszCYFIAYVPgnYBBQEqgTIChAs7ghmCIyeCKHqBJIEkgTuBBU2CMwQYAQEOASc3gw6CTxqBFIExLYN6diV3hSWCE2iKF4ZPiBEHB2GBVjIBVRMXCwcFQ3c8AyJvaoFWgTmBUUOBFQaBQi8bIQtcgTeBLgYVBIEORj+CSmlLOgINAjaCJCRZgk+DWIFCgUCCB4EmQIQmglEdNwkDC209Fh8GAgwbS0IdEp0jAQqBHEaCN4EiFUoZFBdFGRQUgVwCjhEBhD8kkR4PXJJPjjGEJIoNgj6LMooQl2kDkmABmHcio0MJhTVjAWAjOoFcTSOCHIEbTwMZD1iCaIphgVqCIMYlIjU7AgcBCgEBAwmGSIhCDQGBSwEB +x-ironport-outbreak-status: No, level 0, Unknown - Unknown +x-mga-submission: + MDFIz377tYGRr3/oKkWUSdWu7KOmXuPNGLo41ZfR+d9H4sEQkgRfLvd4cFIjMttsAAMmWvN/NM+ltZqAm+djH1WSG5IeKpsaqVsEi/wYdmUHyyrgLN8SWNyu6eqLxR1Sckar9ZgI7Qsxc6wQu6/YxRLKAqW7nsl69AlKRsBfQTcFcg== +auto-submitted: auto-generated +X-Microsoft-Antispam-Mailbox-Delivery: + ucf:0;jmr:0;auth:0;dest:I;ENG:(910001)(920097)(930097)(140003)(1420198); +X-Microsoft-Antispam-Message-Info: + =?utf-8?B?WVFiK1BkR1JRU2hIQ0plRndycEZnM1dpRGVSK3lGdkN4emRUTFdqbis0eDlW?= + =?utf-8?B?RUZsWHFGcXJUUEpjR2gwOE1Cd0FMaE43cXp6SXQ1MlhoK3NhUTd5b0RDNEdZ?= + =?utf-8?B?WlByT2RBMWtlZTNaUG10N2RJMVliK0lXWWU4YzVYT1FRRGtlMTRMNHZDUkNa?= + =?utf-8?B?Q1lManpnK0RtZXlrMFpqWmJLTkdEYWlzQWVCUGVrNjFJVzMwMnllT0FnQ3JJ?= + =?utf-8?B?cjdtQzR6NDF3byt5d1c1OWt4VUVpSWREM3g2RWp3NW5aT1drdWZ0dmQrR3Q1?= + =?utf-8?B?WG1JMjRkVCs1Nzdsby9paG1qUUhhVk56WHEvdVRyMDBkZHdGYWQ0d28zSExV?= + =?utf-8?B?QS9NcnhLMEprNTBoTkRldm5kU3c0c1lzZWRQaHZvQzdwUUN3WGc1d25aZ0pL?= + =?utf-8?B?REFrOW1ESUN6NVlvYTJUVXIydjZGWVJFYVRhTU81b2xRM1JHV1lKT2VSSWVj?= + =?utf-8?B?WFhXRXB2bnB0akRmaXp1QXpDb2lZZVlxeTNQTzZCV0d0RnRUK0hkQmlzc0Ni?= + =?utf-8?B?VkVERGl2UDJwUkdsUGxIb0NPWVp5SGZpY21BbHV4SGFDck5kbU9VcnNQS0pi?= + =?utf-8?B?bGpuaVNzbDdmcFZPL0VTWnVmMnNZNmlDZ1pRUXYwYVF4TzljaGV3WVJtVjlI?= + =?utf-8?B?Q0swNjlvV3NYUGVCaDlkV3BYV2N6dFZBUGk5dDlhZFh4Z1d2QzlGeVE2SmhC?= + =?utf-8?B?eHJER0NqZ3JyWFdLdmJDK1pUV3l4Q3gxSG16ZUVpZ2hiOExJTExrdHExYTFL?= + =?utf-8?B?cHdBNmxYK0pCY3BjVC9QU3BjakJhVldoVVpvN2Z6dnVnTEF2WEw0Y3QwcnU2?= + =?utf-8?B?VUcwUmhmTmszSG4wV2l5bDVLNGp6dHF3cGNNRkJ0WnM1SURtelh2RHJ0b0Fn?= + =?utf-8?B?d0dzd2IzYjB3aVlteERQQTFtSHpaRVhRTkJmUVNoMDBUbHdCakphcGdXUW5w?= + =?utf-8?B?Z05Ec0gzM3VSSnlsZ2xia1ptZVJ0dHZHRm9vVUlKQmR2Ynd1eVc4bllBZHlw?= + =?utf-8?B?ZkhIUkgwYzdoYkNMN0VKTDdIK29VbktrTlpzbEY5c1V4MTArMHRhMVFXNXVH?= + =?utf-8?B?Zit1RlNCSjkrZXBmbnVKdnhuclZBN0luWUZnZTNmeUhiZGkyZWZDODZjSHVQ?= + =?utf-8?B?WENFY1UvWEFJcU9oM0I2M3BMT0hDVTd0Y3BjYnRMcjFDRTZ1cnRzSzVSR04y?= + =?utf-8?B?UkZHK2NQZlJ3TkF3eDMyZlo2MjZVbFpNdHdldjAwY0g1RENEdTRnb1pEK20z?= + =?utf-8?B?Mzc4U3VXY2JmeHhXeVVsQmgrWEs1OWVHbVlsNHRoYVViaDc2bFRlOC9nNXFC?= + =?utf-8?B?Y0I5eXNuMzVhTmVONFZFSXJiS3JNTWE0UUlGQnF3ckNrczMrQWVKR3pPUWpv?= + =?utf-8?B?TlRtbWd3bnJKc0I5Rzk0cmNZdGhMa2ZSTXc4T29UWmJHcGtlbG51RE80aHZM?= + =?utf-8?B?aW5yNnZCdXJXbzZkMXBaUHBHNVdoVGhXamhkeTJ4OS85cEIxQyttQlRQb0Ix?= + =?utf-8?B?Y3UvbFo4TE9BdFZDNitkUlBFK3JabjFDWUJ2RE9PWGgxWGhzamkrb3haMDN1?= + =?utf-8?B?V21qZzJkQVpyYVZ5bmRyeHNhbW92Q2o1aytVYy96d0liNE5uV1EvVWV6ejFG?= + =?utf-8?B?eTN3bXlNbjMwSUFaV0tMM1oxdjVmMlpoNzFzbUM2dnFXb3h5K2JRZ0drSkM5?= + =?utf-8?B?L2cwbjRQSTh1L2d5OEV2VUtadE1Fc3AyaUVLT05uQ0FEY0hzdldldXdGUUQ3?= + =?utf-8?B?dkNRNXNQRXdVaWQwV3FSYUdzYW9KZ3RSdEJ6Yng5eEtLZjBCZlMzdWM0dDI5?= + =?utf-8?B?UDFmM1FRWTRzUjVDMGFDQlBYTlZ1TFliNjVOMFJPTkF3czllYnpiY0REbHhH?= + =?utf-8?B?UE01SUxNOE0xZk9ydWZNRTdkSkxnMUdJc1R3bXlnZ0hmOTlVSVBXRlJ3NUl0?= + =?utf-8?B?Z0ZFUndqUTltVnZXZDVRamppZ1p5WXgxRXNOOFpMcHhnVXM0a3N4dnVVY0dB?= + =?utf-8?B?aXptUHRMRDM2aW1uYUpYVVlyeTNIbDlHY2hPck83T3pKZHJEaldIU3UxUDJv?= + =?utf-8?B?ZTJ4elFETC9wKzloVWdhdUZiYWdJYVpFak05dklVdHN4T3BycjBkd1JXbVc5?= + =?utf-8?B?engyWFF2STJyM0xONVdJUHpLRTR2N0hCbTQrY1d4eWhOQjdya09YcEZrZG1S?= + =?utf-8?B?S2xxSGIyM1RlNU0zNThzVVNTZXBDaVhtNm9JSTRIMkgzLzIvS2pRMko4R0dO?= + =?utf-8?B?NzdQZUhJS1Iya0ppZGs5b01JRjM1Z3NpVWpnaHZ6eFk1WnZZZXhENW0yQzRn?= + =?utf-8?B?T082V29JbFJQbW1DM04vZTVZc0FySFBYRW0vRVZ0UGlqRVBxU0J5OEZDcnIx?= + =?utf-8?B?Q2hNanZKemZRR1FMZm5yK0FObkF1Y3RxeVpNcmRSZDM4enYrOE4xTVFNTW9N?= + =?utf-8?B?b3Q5aEowQ2RONEVaakxFVmZ0TG52c1pYUmdhT0kvcnhrQndPQ1ltRnB1UTV5?= + =?utf-8?B?VmJsQWgvVC9ueTR5V0VUOW53WFZNSGFHMllEaEdtVERpUjdUelNZV05FeUVE?= + =?utf-8?B?OHY0ZjZCRy9xSnpoejl5L3lZSkQ1SkI2VGVNRWNNelpEKzRjMStwN2xSd2Fm?= + =?utf-8?B?WUVNK1pzQVdnT2ZBaWtibCtTMnZXQ2hyTEtIRHozWkxtVHA1eTcyMkxVazlw?= + =?utf-8?B?OUZRTXF0bm5hK0hCN1pEVWxuMG9lRUoyT2lFYVQ4Z0xLNitERm5OVnJjeldY?= + =?utf-8?B?NnAxN2tTL3R5RlRUV2pmZkdzMHBuL3FkMmd6NDRESE5xS2N2QUVzWHhKdWw3?= + =?utf-8?B?RHNqcE1MOGFQNVBoKzN3c1hGN0Fmejl3NXZkM0xDMWpkdCs1QnhpcmRaeFVG?= + =?utf-8?B?bVRrTHJVclhld1V6WjVjQnpiUT09?= +Content-Type: multipart/related; + boundary="_004_71995954233001731505840801app150053phx201servicenowcom_"; + type="multipart/alternative" +MIME-Version: 1.0 + +--_004_71995954233001731505840801app150053phx201servicenowcom_ +Content-Type: multipart/alternative; + boundary="_000_71995954233001731505840801app150053phx201servicenowcom_" + +--_000_71995954233001731505840801app150053phx201servicenowcom_ +Content-Type: text/plain; charset="utf-8" + +CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. + + +Dear Customer, + + + +Tata Communication is in receipt of maintenance activity. The details of maintenance activity are as below. Your below mentioned service would experience an outage of “8 Days 23 Hours 58 Minutes” during the activity window. + + + +TATA COMMUNICATIONS [cid:logo.pngx@SNC.8e754fb1f9f9130c] + Planned Work Notification +Ticket Reference - TCL CHGP0123456 +Service ID A012345678901234567, B012345678901234567 +NIMS ID F0123-45678-901, F0123-45678-901 +Maintenance Type Normal +Activity Status Scheduled +Execution Owner International Cables +Location of activity Mumbai + +Activity Window (IST) 2024-12-22 05:31:00 IST to 2024-12-31 05:29:00 IST +Activity Window (GMT) 2024-12-22 00:01:00 GMT to 2024-12-30 23:59:00 GMT +Expected Impact Duration(DD:HH:MM) : 8 Days 23 Hours 58 Minutes + +Activity Description Planned activity for shunt fault repair of Seg 11 near Mumbai in TGNEA network. + +We request you to reschedule sensitive operations at your end accordingly. +We apologize for any inconvenience due to this event and resulting downtime. +If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below: +Mail ID :planned.activity@tatacommunications.com +Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660 +We look forward to your co-operation and a long term synergic association. +Best Regards, +Customer Service +TATA COMMUNICATIONS + + + + +Ref:MSGTCL000142929801 + +--_000_71995954233001731505840801app150053phx201servicenowcom_ +Content-Type: text/html; charset="utf-8" +Content-ID: + + + + + + +
+CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Dear Customer,

+

 

+

Tata Communication is in receipt of maintenance activity. The details of maintenance activity are as below. Your below mentioned service would experience an + outage of “8 Days 23 Hours 58 Minutes” during the activity window.

+

 

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service IDA012345678901234567, B012345678901234567
NIMS IDF0123-45678-901, F0123-45678-901
Maintenance TypeNormal
Activity StatusScheduled
Execution OwnerInternational Cables
Location of activityMumbai
 
Activity Window (IST)2024-12-22 05:31:00 IST to 2024-12-31 05:29:00 IST
Activity Window (GMT)2024-12-22 00:01:00 GMT to 2024-12-30 23:59:00 GMT
Expected Impact Duration(DD:HH:MM) :8 Days 23 Hours 58 Minutes
 
Activity DescriptionPlanned activity for shunt fault repair of Seg 11 near Mumbai in TGNEA network.
+

We request you to reschedule sensitive operations at your end accordingly.
+We apologize for any inconvenience due to this event and resulting downtime.
+If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+Mail ID :planned.activity@tatacommunications.com
+Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+We look forward to your co-operation and a long term synergic association.
+Best Regards,
+Customer Service
+TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000142929801
+
+ + + +--_000_71995954233001731505840801app150053phx201servicenowcom_-- + +--_004_71995954233001731505840801app150053phx201servicenowcom_ +Content-Type: image/png; name="image" +Content-Description: image +Content-Disposition: inline; filename="image"; size=189; + creation-date="Wed, 13 Nov 2024 13:52:32 GMT"; + modification-date="Fri, 15 Nov 2024 09:14:58 GMT" +Content-ID: +Content-Transfer-Encoding: base64 + + +--_004_71995954233001731505840801app150053phx201servicenowcom_-- \ No newline at end of file diff --git a/tests/unit/data/tata/tata_email_result.json b/tests/unit/data/tata/tata_email_result.json new file mode 100644 index 00000000..de8f89df --- /dev/null +++ b/tests/unit/data/tata/tata_email_result.json @@ -0,0 +1,25 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "A012345678901234567", + "impact": "OUTAGE" + }, + { + "circuit_id": "B012345678901234567", + "impact": "OUTAGE" + } + ], + "end": 1735603140, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "provider": "tata", + "sequence": 1, + "stamp": 1731505840, + "start": 1734825660, + "status": "CONFIRMED", + "summary": "TCL TT: \"CHGP0123456\" / \"Normal\" / \"Scheduled\" / Planned Work Notification", + "uid": "0" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_extension_body.html b/tests/unit/data/tata/tata_extension_body.html new file mode 100644 index 00000000..f781d02e --- /dev/null +++ b/tests/unit/data/tata/tata_extension_body.html @@ -0,0 +1,109 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Dear Customer,

+

Please note that this activity will be extended till + "2024-11-13 03:30:00 IST".

+

The details of the Extended Impact have been mentioned below:

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service IDI0123-45678-901
NIMS IDI0123-45678-901
Maintenance TypeNormal
Activity StatusImplement
Execution OwnerTata Backbone Network
Location of activitySVQ - Singapore & EMRS2 (Marseille)
 
Activity Window (IST)2024-11-12 19:30:00 IST to 2024-11-12 21:30:00 IST
Activity Window (GMT)2024-11-12 14:00:00 GMT to 2024-11-12 16:00:00 GMT
Expected Impact Duration(DD:HH:MM):30 Minutes
Extended Up to Time Window (IST)2024-11-13 03:30:00 IST
Extended Up to Time Window (GMT)2024-11-12 22:00:00 GMT
 
Activity DescriptionTata Backbone Team will implement Service Affecting planned activity for software upgrade.
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000142854135
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_extension_body_result.json b/tests/unit/data/tata/tata_extension_body_result.json new file mode 100644 index 00000000..ed8b6dc6 --- /dev/null +++ b/tests/unit/data/tata/tata_extension_body_result.json @@ -0,0 +1,15 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "I0123-45678-901", + "impact": "OUTAGE" + } + ], + "end": 1731448800, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1731420000 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_extension_subject.txt b/tests/unit/data/tata/tata_extension_subject.txt new file mode 100644 index 00000000..6ea22ec0 --- /dev/null +++ b/tests/unit/data/tata/tata_extension_subject.txt @@ -0,0 +1 @@ +Extension Notification /TCL TT: "CHGP0123456" / "Normal" / "Implement" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_extension_subject_result.json b/tests/unit/data/tata/tata_extension_subject_result.json new file mode 100644 index 00000000..27e4a3cb --- /dev/null +++ b/tests/unit/data/tata/tata_extension_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "RE-SCHEDULED", + "summary": "Extension Notification /TCL TT: \"CHGP0123456\" / \"Normal\" / \"Implement\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_final_reminder_body.html b/tests/unit/data/tata/tata_final_reminder_body.html new file mode 100644 index 00000000..3dd338bf --- /dev/null +++ b/tests/unit/data/tata/tata_final_reminder_body.html @@ -0,0 +1,104 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Final Reminder.

+

 

+

Dear Customer,

+

 

+

Tata Communication is in receipt of maintenance activity. The details of maintenance activity are as below. Your below mentioned service would experience an + outage of “18 Hours” during the activity window.

+

 

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service ID01234567890123456789
NIMS ID
Maintenance TypeNormal
Activity StatusScheduled
Execution OwnerInternational Cables
Location of activityJeddah
 
Activity Window (IST)2024-10-26 03:30:00 IST to 2024-10-26 21:30:00 IST
Activity Window (GMT)2024-10-25 22:00:00 GMT to 2024-10-26 16:00:00 GMT
Expected Impact Duration(DD:HH:MM) :18 Hours
 
Activity DescriptionPlanned activity to rectify the power degradation alarm at Jeddah in IMEWE network.
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000141157512
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_final_reminder_body_result.json b/tests/unit/data/tata/tata_final_reminder_body_result.json new file mode 100644 index 00000000..13eb7f60 --- /dev/null +++ b/tests/unit/data/tata/tata_final_reminder_body_result.json @@ -0,0 +1,15 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "01234567890123456789", + "impact": "OUTAGE" + } + ], + "end": 1729958400, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1729893600 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_final_reminder_subject.txt b/tests/unit/data/tata/tata_final_reminder_subject.txt new file mode 100644 index 00000000..727a362b --- /dev/null +++ b/tests/unit/data/tata/tata_final_reminder_subject.txt @@ -0,0 +1 @@ +Final Reminder /TCL TT: "CHGP0123456" / "Normal" / "Scheduled" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_final_reminder_subject_result.json b/tests/unit/data/tata/tata_final_reminder_subject_result.json new file mode 100644 index 00000000..edc0bc28 --- /dev/null +++ b/tests/unit/data/tata/tata_final_reminder_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "CONFIRMED", + "summary": "Final Reminder /TCL TT: \"CHGP0123456\" / \"Normal\" / \"Scheduled\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_first_reminder_body.html b/tests/unit/data/tata/tata_first_reminder_body.html new file mode 100644 index 00000000..a01bf47e --- /dev/null +++ b/tests/unit/data/tata/tata_first_reminder_body.html @@ -0,0 +1,104 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

First Reminder.

+

 

+

Dear Customer,

+

 

+

Tata Communication is in receipt of maintenance activity. The details of maintenance activity are as below. Your below mentioned service would experience an + outage of “2 Hours” during the activity window.

+

 

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service IDA0123-456-789
NIMS IDA0123-456-789
Maintenance TypeNormal
Activity StatusScheduled
Execution OwnerTata Backbone Network
Location of activityDT8 ( Dallas )
 
Activity Window (IST)2024-11-22 14:30:00 IST to 2024-11-22 18:00:00 IST
Activity Window (GMT)2024-11-22 09:00:00 GMT to 2024-11-22 12:30:00 GMT
Expected Impact Duration(DD:HH:MM) :2 Hours
 
Activity DescriptionTata Backbone Team will implement Service Affecting planned activity for software update
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000143055571
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_first_reminder_body_result.json b/tests/unit/data/tata/tata_first_reminder_body_result.json new file mode 100644 index 00000000..712cee33 --- /dev/null +++ b/tests/unit/data/tata/tata_first_reminder_body_result.json @@ -0,0 +1,15 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "A0123-456-789", + "impact": "OUTAGE" + } + ], + "end": 1732278600, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1732266000 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_first_reminder_subject.txt b/tests/unit/data/tata/tata_first_reminder_subject.txt new file mode 100644 index 00000000..394a49bc --- /dev/null +++ b/tests/unit/data/tata/tata_first_reminder_subject.txt @@ -0,0 +1 @@ +First Reminder /TCL TT: "CHGP0123456" / "Normal" / "Scheduled" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_first_reminder_subject_result.json b/tests/unit/data/tata/tata_first_reminder_subject_result.json new file mode 100644 index 00000000..eb116351 --- /dev/null +++ b/tests/unit/data/tata/tata_first_reminder_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "CONFIRMED", + "summary": "First Reminder /TCL TT: \"CHGP0123456\" / \"Normal\" / \"Scheduled\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_reschedule_body.html b/tests/unit/data/tata/tata_reschedule_body.html new file mode 100644 index 00000000..0d6dd3d4 --- /dev/null +++ b/tests/unit/data/tata/tata_reschedule_body.html @@ -0,0 +1,106 @@ + + + + +
+ CAUTION: This email has been sent from an external source. Do not click links, open attachments, or provide sensitive business information unless you can verify the sender’s legitimacy. +
+
+
+

+

+

+

Dear Customer, +

+

Please note that this activity has been rescheduled. +

+

The details of the same have been mentioned below. Your below mentioned service would experience an outage of + “7 Hours 59 Minutes” during the activity window.

+ + + + + + + +
TATA COMMUNICATIONS 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Planned Work Notification
Ticket Reference - TCLCHGP0123456
Service ID01234567890123456789
NIMS ID
Maintenance TypeNormal
Activity StatusScheduled
Execution OwnerInternational Cables
Location of activityJeddah-Mumbai
 
Revised Activity Window (IST)2024-11-27 21:30:01 IST to 2024-11-28 05:29:01 IST
Revised Activity Window (GMT)2024-11-27 16:00:01 GMT to 2024-11-27 23:59:01 GMT
Expected Impact Duration(DD:HH:MM) :7 Hours 59 Minutes
 
Activity DescriptionPlanned activity of Software upgrade between Jeddah- Mumbai in IMEWE network.
+ Note 1: During the maintenance window, traffic will be at high risk, and it might get impacted.
+ Note 2: Backup MW will only be used if the activity is not completed in the main MW.
+ Backup MW: 16:00 UTC/28th November 2024 to 23:59 UTC/ 28th November 2024
+

We request you to reschedule sensitive operations at your end accordingly.
+ We apologize for any inconvenience due to this event and resulting downtime.
+ If you have any queries with respect to this activity, feel free to contact us on the coordinates mentioned below:
+ Mail ID :planned.activity@tatacommunications.com
+ Contact Number : + 91 20 6614 4444 & Toll Free no: 1-8002660660
+ We look forward to your co-operation and a long term synergic association.
+ Best Regards,
+ Customer Service
+ TATA COMMUNICATIONS

+
+

 

+
 
+
Ref:MSGTCL000142843955
+
+ + + \ No newline at end of file diff --git a/tests/unit/data/tata/tata_reschedule_body_result.json b/tests/unit/data/tata/tata_reschedule_body_result.json new file mode 100644 index 00000000..22f636f8 --- /dev/null +++ b/tests/unit/data/tata/tata_reschedule_body_result.json @@ -0,0 +1,15 @@ +[ + { + "account": "N/A", + "circuits": [ + { + "circuit_id": "01234567890123456789", + "impact": "OUTAGE" + } + ], + "end": 1732751941, + "maintenance_id": "CHGP0123456", + "organizer": "planned.activity@tatacommunications.com", + "start": 1732723201 + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_reschedule_subject.txt b/tests/unit/data/tata/tata_reschedule_subject.txt new file mode 100644 index 00000000..6c3d1e67 --- /dev/null +++ b/tests/unit/data/tata/tata_reschedule_subject.txt @@ -0,0 +1 @@ +Reschedule Notification /TCL TT: "CHGP0123456" / "Normal" / "Scheduled" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_reschedule_subject_result.json b/tests/unit/data/tata/tata_reschedule_subject_result.json new file mode 100644 index 00000000..706a771f --- /dev/null +++ b/tests/unit/data/tata/tata_reschedule_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "RE-SCHEDULED", + "summary": "Reschedule Notification /TCL TT: \"CHGP0123456\" / \"Normal\" / \"Scheduled\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/tata/tata_subject.txt b/tests/unit/data/tata/tata_subject.txt new file mode 100644 index 00000000..c5757afb --- /dev/null +++ b/tests/unit/data/tata/tata_subject.txt @@ -0,0 +1 @@ +TCL TT: "CHGP0123456" / "Normal" / "Scheduled" / Planned Work Notification \ No newline at end of file diff --git a/tests/unit/data/tata/tata_subject_result.json b/tests/unit/data/tata/tata_subject_result.json new file mode 100644 index 00000000..de1926b5 --- /dev/null +++ b/tests/unit/data/tata/tata_subject_result.json @@ -0,0 +1,6 @@ +[ + { + "status": "CONFIRMED", + "summary": "TCL TT: \"CHGP0123456\" / \"Normal\" / \"Scheduled\" / Planned Work Notification" + } +] \ No newline at end of file diff --git a/tests/unit/data/windstream/windstream2.eml b/tests/unit/data/windstream/windstream2.eml new file mode 100644 index 00000000..56f01bc8 --- /dev/null +++ b/tests/unit/data/windstream/windstream2.eml @@ -0,0 +1,10 @@ +From: wci.maintenance.notifications@windstream.com +To: receiver@testing.com +Date: 6 Aug 2024 20:42:43 +0000 +Subject: Windstream (Demand Notification WMT#: 223456) +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: base64 +Message-Id: <20240806204244.B4EB91800071F@azlapp0432.windstream.com> +MIME-Version: 1.0 + +CjxodG1sPjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPjxzdHlsZT5ib2R5IHtmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Y29sb3I6ICM0MDQwNDA7bWFyZ2luOiAwcHg7cGFkZGluZzogMDt0ZXh0LWFsaWduOiBsZWZ0O2JhY2tncm91bmQtY29sb3I6ICNmZmY7bWFyZ2luOiAxMHB4IDVweCAxMHB4IDVweDt9LmhlYWRlclJvdyB7YmFja2dyb3VuZDogI0UxRjNDODtmb250LXdlaWdodDogYm9sZDt9LmNpcmN1aXRUYWJsZSB7Ym9yZGVyOiAycHggc29saWQgI0Q1RDVENTtib3JkZXItcmlnaHQ6MHB4O30uY2lyY3VpdFRhYmxlIHRkIHtwYWRkaW5nOjVweDtib3JkZXItcmlnaHQ6MnB4IHNvbGlkICNENUQ1RDU7fS5zdW1tYXJ5IHtwYWRkaW5nOiAwcHggNXB4O30udGJsUGFkZGluZyB7Ym9yZGVyOjJweCBzb2xpZCAjRDVENUQ1O2JvcmRlci1yaWdodDowcHg7Ym9yZGVyLWJvdHRvbTogMHB4O30udGJsUGFkZGluZyB0ZCB7cGFkZGluZzogNXB4O2JvcmRlcjoycHggc29saWQgI0Q1RDVENTtib3JkZXItdG9wOjBweDtib3JkZXItbGVmdDowcHg7fS5ib3R0b21Cb3JkZXIgdGR7Ym9yZGVyLWJvdHRvbToycHggc29saWQgI0Q1RDVENTt9LmFsdENvbG9yIHtiYWNrZ3JvdW5kOiAjRjBGMEYwO31oMSB7Zm9udC1zaXplOjIycHg7dGV4dC1hbGlnbjpjZW50ZXI7fWgyIHtmb250LXNpemU6MTRweDttYXJnaW4tYm90dG9tOjVweDttYXJnaW4tbGVmdDo1cHh9LmRlc2NyaXB0aW9uIHtwYWRkaW5nLWxlZnQ6N3B4O30udGltZVpvbmVUYWJsZSB7Ym9yZGVyOjFweCBzb2xpZCAjMDAwMDAwOyBib3JkZXItYm90dG9tOiAwcHg7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IENhbGlicmksIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fS50aW1lWm9uZVRhYmxlIHRkIHtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMDAwMDAwOyBwYWRkaW5nLWxlZnQ6IDEycHg7IHBhZGRpbmctcmlnaHQ6IDEycHg7IHBhZGRpbmctdG9wOiA1cHg7fTwvc3R5bGU+PC9oZWFkPjxib2R5PjxwIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PGltZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjY3IiBzcmM9Imh0dHBzOi8vd2UtdWF0YS53aW5kc3RyZWFtLmNvbS9jZG4yL3dpbl9tb3BfbG9nby5wbmciPjxoMT5EZW1hbmQgTWFpbnRlbmFuY2UgTm90aWZpY2F0aW9uPC9oMT48L3A+PGRpdiBjbGFzcz0ic3VtbWFyeSI+PGJyPldpbmRzdHJlYW0gaGFzIGlkZW50aWZpZWQgYSBuZXR3b3JrIGZhdWx0IGFuZCBtdXN0IHBlcmZvcm0gZGVtYW5kIG1haW50ZW5hbmNlIGluIG9yZGVyIHRvIHJlc3RvcmUgb3VyIG5ldHdvcmsgc2VydmljZXMgdG8gdGhlaXIgZnVsbCBjYXBhYmlsaXRpZXMuIFRoaXMgbWFpbnRlbmFuY2UgaXMgcmVxdWlyZWQgdG8gcmVzb2x2ZSBjdXJyZW50IHNlcnZpY2UgaW1wYWN0cyBvciByZW1vdmUgdGhlIHJpc2sgZm9yIHBvdGVudGlhbCBpbXBhY3RzLiBXZSB1bmRlcnN0YW5kIHRoZSBjaGFsbGVuZ2VzIHRoaXMgbWF5IHByZXNlbnQgYW5kIGFyZSB3b3JraW5nIHRvIG1pbmltaXplIGRpc3J1cHRpb25zLiBUaGUgZGV0YWlscyBvZiB0aGUgcGxhbm5lZCBtYWludGVuYW5jZSBhcmUgbGlzdGVkIGJlbG93IGFsb25nIHdpdGggZGVzY3JpcHRpb25zIGFuZCBwbGFubmVkIGltcGFjdCB0aW1lZnJhbWVzLjxicj48YnI+PGgyPkRFU0NSSVBUSU9OIE9GIE1BSU5URU5BTkNFPC9oMj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPkZpYmVyIE1haW50ZW5hbmNlIC0gQ2FibGUgUmVsb2NhdGU8YnI+PGJyPjxiPkdQUyBMb2NhdGlvbihzKTogPC9iPjx0YWJsZT48dGhlYWQ+PHRyPjx0aD5MYXRpdHVkZSwgTG9uZ2l0dWRlPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDAuNDc5ODU0LCAtOTkuMzQ0NzExPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3NwYW4+PGJyPjxicj48aDI+TUFJTlRFTkFOQ0UgSU5GT1JNQVRJT048L2gyPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+PHRyPjx0ZCB2YWxpZ249InRvcCI+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBjbGFzcz0idGJsUGFkZGluZyI+PHRyPjx0ZD48Yj5XTVQ6PC9iPjwvdGQ+PHRkPjIyMzQ1NjwvdGQ+PC90cj48dHI+PHRkPjxiPk1haW50ZW5hbmNlIEFkZHJlc3M6PC9iPjwvdGQ+PHRkPjxkaXY+U1RSRUVUIEFERFJFU1M8L2Rpdj48L3RkPjwvdHI+PHRyPjx0ZD48Yj5TZXJ2aWNlIEFmZmVjdGluZzo8L2I+PC90ZD48dGQ+WUVTPC90ZD48L3RyPjx0cj48dGQ+PGI+RXZlbnQgU3RhcnQgRGF0ZSAmYW1wOyBUaW1lOjwvYj48L3RkPjx0ZD4wOC8xMy8yNCAwMTowMCBFVDwvdGQ+PC90cj48dHI+PHRkPjxiPkV2ZW50IEVuZCBEYXRlICZhbXA7IFRpbWU6PC9iPjwvdGQ+PHRkPjA4LzEzLzI0IDA5OjAwIEVUPC90ZD48L3RyPjwvdGFibGU+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweDsiPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgY2xhc3M9InRibFBhZGRpbmciPjx0cj48dGQ+PGI+SW1wYWN0IFR5cGU6PC9iPjwvdGQ+PHRkPjxiPkR1cmF0aW9uPC9iPjwvdGQ+PHRkPjxiPkltcGFjdCBTdGFydDwvYj48L3RkPjx0ZD48Yj5JbXBhY3QgRW5kPC9iPjwvdGQ+PC90cj48dHI+PHRkPk91dGFnZTwvdGQ+PHRkPjQ4MCBtaW51dGUocyk8L3RkPjx0ZD4wOC8xMy8yNCAwMTowMCBFVDwvdGQ+PHRkPjA4LzEzLzI0IDA5OjAwIEVUPC90ZD48L3RyPjx0cj48dGQgY29sc3Bhbj0iNCI+PGVtIHN0eWxlPSJmb250LXNpemU6MTFwdCI+Tm90ZTogU2VydmljZSBpbXBhY3QgbWF5IGJlIGV4cGVyaWVuY2VkIGF0IHZhcnlpbmcgdGltZXMgdGhyb3VnaG91dCB0aGUgaW1wbGVtZW50YXRpb24gd2luZG93LjwvZW0+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjxicj48YnI+PGgyPjwvaDI+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0iY2lyY3VpdFRhYmxlIj48dHIgY2xhc3M9ImhlYWRlclJvdyBib3R0b21Cb3JkZXIiPjx0ZD5OYW1lPC90ZD48dGQ+QWNjb3VudDwvdGQ+PHRkPkNpcmN1aXQgSUQ8L3RkPjx0ZD5SYXRlIENvZGU8L3RkPjx0ZD5DdXN0IENrdCBJRDwvdGQ+PHRkPkEtTG9jPC90ZD48dGQ+QS1Mb2MgQWRkcmVzczwvdGQ+PHRkPlotTG9jPC90ZD48dGQ+Wi1Mb2MgQWRkcmVzczwvdGQ+PC90cj48dHI+PHRkPkFjY291bnQgTmFtZTwvdGQ+PHRkPioqKioqMTIzNDwvdGQ+PHRkPldTL0FCQ0QvMTIzNDU2LyAgIC9XWE4gLzwvdGQ+PHRkPlJQUi0wMDwvdGQ+PHRkPjEyMzQ1Njc4PC90ZD48dGQ+QUJDREVPMTI8L3RkPjx0ZD4xMjNUSCBTVDwvdGQ+PHRkPkFCQ0RFRkc8L3RkPjx0ZD4xMjMgRmFrZSBTdHJlZXQ8L3RkPjwvdHI+PC90YWJsZT48YnI+PGJyPklmIHlvdSBleHBlcmllbmNlIGFueSB0cm91YmxlIHdpdGggeW91ciBzZXJ2aWNlIHByaW9yIHRvIG9yIGFmdGVyIHRoaXMgbWFpbnRlbmFuY2Ugd2luZG93IHRpbWUgZnJhbWUgc2hvd24gaW4gdGhpcyBub3RpZmljYXRpb24sIHBsZWFzZSBjb250YWN0IHRoZSBhcHByb3ByaWF0ZSBTZXJ2aWNlIEFzc3VyYW5jZSBncm91cC48YnI+PHVsPjxsaT48Yj5FbnRlcnByaXNlPC9iPjogODAwLTYwMC01MDUwPC9saT48bGk+PGI+V2hvbGVzYWxlPC9iPjogODQ0LTk0Ni0yNjYyPC9saT48bGk+PGI+RmliZXIgVG8gVGhlIFRvd2VyPC9iPjogODc3LTQ3My04MDQyPC9saT48L3VsPjxicj5JZiB5b3UgaGF2ZSBxdWVzdGlvbnMgcGVydGFpbmluZyB0byBvciBpbiByZWZlcmVuY2UgdG8gdGhpcyBtYWludGVuYW5jZSwgcGxlYXNlIGNvbnRhY3QgdGhlIFdpbmRzdHJlYW0gQ2hhbmdlIE1hbmFnZW1lbnQgVGVhbSB2aWEgZW1haWwgZGlyZWN0bHkgYXQgd2NpLm1haW50ZW5hbmNlLm5vdGlmaWNhdGlvbnNAd2luZHN0cmVhbS5jb20gb3IgYnkgY2FsbGluZyB1cyBhdCA4MDAtODkyLTY3ODUuPGJyPjxicj5UaGFuayB5b3UgZm9yIHlvdXIgYnVzaW5lc3MhPC9kaXY+PC9ib2R5PjwvaHRtbD4= diff --git a/tests/unit/data/windstream/windstream2_result.json b/tests/unit/data/windstream/windstream2_result.json new file mode 100644 index 00000000..4bbf3422 --- /dev/null +++ b/tests/unit/data/windstream/windstream2_result.json @@ -0,0 +1,19 @@ +[ + { + "account": "Account Name", + "circuits": [ + { + "circuit_id": "WS/ABCD/123456/ /WXN /", + "impact": "OUTAGE" + } + ], + "end": 1723554000, + "maintenance_id": "223456", + "organizer": "wci.maintenance.notifications@windstream.com", + "provider": "windstream", + "stamp": 1722976963, + "start": 1723525200, + "status": "CONFIRMED", + "summary": "Windstream has identified a network fault and must perform demand maintenance in order to restore our network services to their full capabilities. This maintenance is required to resolve current service impacts or remove the risk for potential impacts. We understand the challenges this may present and are working to minimize disruptions. The details of the planned maintenance are listed below along with descriptions and planned impact timeframes." + } +] \ No newline at end of file diff --git a/tests/unit/test_e2e.py b/tests/unit/test_e2e.py index 674c79b5..25702bd6 100644 --- a/tests/unit/test_e2e.py +++ b/tests/unit/test_e2e.py @@ -34,6 +34,7 @@ PacketFabric, Seaborn, Sparkle, + Tata, Telstra, Turkcell, Verizon, @@ -677,6 +678,16 @@ Path(dir_path, "data", "sparkle", "sparkle1_result.json"), ], ), + # Tata + ( + Tata, + [ + ("email", Path(dir_path, "data", "tata", "tata_email.eml")), + ], + [ + Path(dir_path, "data", "tata", "tata_email_result.json"), + ], + ), # Telstra ( Telstra, @@ -862,6 +873,13 @@ ], [Path(dir_path, "data", "windstream", "windstream1_result.json")], ), + ( + Windstream, + [ + ("email", Path(dir_path, "data", "windstream", "windstream2.eml")), + ], + [Path(dir_path, "data", "windstream", "windstream2_result.json")], + ), # Zayo ( Zayo, diff --git a/tests/unit/test_parsers.py b/tests/unit/test_parsers.py index 3c2b2a81..60a62926 100644 --- a/tests/unit/test_parsers.py +++ b/tests/unit/test_parsers.py @@ -30,6 +30,7 @@ SubjectParserSeaborn2, ) from circuit_maintenance_parser.parsers.sparkle import HtmlParserSparkle1 +from circuit_maintenance_parser.parsers.tata import HtmlParserTata, SubjectParserTata from circuit_maintenance_parser.parsers.telstra import HtmlParserTelstra1, HtmlParserTelstra2 from circuit_maintenance_parser.parsers.turkcell import HtmlParserTurkcell1 from circuit_maintenance_parser.parsers.verizon import HtmlParserVerizon1 @@ -495,6 +496,77 @@ def default(self, o): Path(dir_path, "data", "sparkle", "sparkle1.eml"), Path(dir_path, "data", "sparkle", "sparkle1_html_parser_result.json"), ), + # Tata + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_first_reminder_body.html"), + Path(dir_path, "data", "tata", "tata_first_reminder_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_first_reminder_subject.txt"), + Path(dir_path, "data", "tata", "tata_first_reminder_subject_result.json"), + ), + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_final_reminder_body.html"), + Path(dir_path, "data", "tata", "tata_final_reminder_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_final_reminder_subject.txt"), + Path(dir_path, "data", "tata", "tata_final_reminder_subject_result.json"), + ), + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_body.html"), + Path(dir_path, "data", "tata", "tata_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_subject.txt"), + Path(dir_path, "data", "tata", "tata_subject_result.json"), + ), + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_cancellation_body.html"), + Path(dir_path, "data", "tata", "tata_cancellation_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_cancellation_subject.txt"), + Path(dir_path, "data", "tata", "tata_cancellation_subject_result.json"), + ), + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_completion_body.html"), + Path(dir_path, "data", "tata", "tata_completion_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_completion_subject.txt"), + Path(dir_path, "data", "tata", "tata_completion_subject_result.json"), + ), + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_extension_body.html"), + Path(dir_path, "data", "tata", "tata_extension_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_extension_subject.txt"), + Path(dir_path, "data", "tata", "tata_extension_subject_result.json"), + ), + ( + HtmlParserTata, + Path(dir_path, "data", "tata", "tata_reschedule_body.html"), + Path(dir_path, "data", "tata", "tata_reschedule_body_result.json"), + ), + ( + SubjectParserTata, + Path(dir_path, "data", "tata", "tata_reschedule_subject.txt"), + Path(dir_path, "data", "tata", "tata_reschedule_subject_result.json"), + ), # Telstra ( HtmlParserTelstra1,