Skip to content

Commit

Permalink
fix pledge box; add generic parser; fix KeyError: tracking_number
Browse files Browse the repository at this point in the history
  • Loading branch information
ljmerza committed Jun 14, 2023
1 parent 8f27773 commit 54d2678
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 5 deletions.
6 changes: 6 additions & 0 deletions custom_components/email/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@
EMAIL_ATTR_FROM = 'from'
EMAIL_ATTR_SUBJECT = 'subject'
EMAIL_ATTR_BODY = 'body'

USPS_TRACKING_NUMBER_REGEX = r"\b(94\d{20}|\d{4}\s\d{4}\s\d{4}\s\d{4}\s\d{4}\s\d{2})\b"
UPS_TRACKING_NUMBER_REGEX = r"\b(1Z[A-HJ-NP-Z0-9]{16})\b"
FEDEX_TRACKING_NUMBER_REGEX = r"\b(\d{12})\b"

EMAIL_DOMAIN_REGEX = r"@([\w.-]+)"
32 changes: 32 additions & 0 deletions custom_components/email/parsers/generic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import logging
import re

from bs4 import BeautifulSoup
from ..const import EMAIL_ATTR_BODY, USPS_TRACKING_NUMBER_REGEX, UPS_TRACKING_NUMBER_REGEX, FEDEX_TRACKING_NUMBER_REGEX

_LOGGER = logging.getLogger(__name__)
ATTR_GENERIC = 'generic'
EMAIL_DOMAIN_GENERIC = ''

def parse_generic(email):
"""Tries to parse tracking numbers for any type of email."""
tracking_numbers = []

soup = BeautifulSoup(email[EMAIL_ATTR_BODY], 'html.parser')

matches = re.findall(UPS_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
for tracking_number in matches:
if tracking_number not in tracking_numbers:
tracking_numbers.append(tracking_number)

matches = re.findall(USPS_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
for tracking_number in matches:
if tracking_number not in tracking_numbers:
tracking_numbers.append(tracking_number)

matches = re.findall(FEDEX_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
for tracking_number in matches:
if tracking_number not in tracking_numbers:
tracking_numbers.append(tracking_number)

return tracking_numbers,
7 changes: 6 additions & 1 deletion custom_components/email/parsers/pledgebox.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import re

from bs4 import BeautifulSoup
from ..const import EMAIL_ATTR_BODY
from ..const import EMAIL_ATTR_BODY, USPS_TRACKING_NUMBER_REGEX


_LOGGER = logging.getLogger(__name__)
Expand All @@ -24,4 +24,9 @@ def parse_pledgebox(email):
if match and match.group(1) not in tracking_numbers:
tracking_numbers.append(match.group(1))

matches = re.findall(USPS_TRACKING_NUMBER_REGEX, email[EMAIL_ATTR_BODY])
for tracking_number in matches:
if tracking_number not in tracking_numbers:
tracking_numbers.append(tracking_number)

return tracking_numbers
12 changes: 8 additions & 4 deletions custom_components/email/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@
from .parsers.sylvane import ATTR_SYLVANE, EMAIL_DOMAIN_SYLVANE, parse_sylvane
from .parsers.adafruit import ATTR_ADAFRUIT, EMAIL_DOMAIN_ADAFRUIT, parse_adafruit

from .parsers.generic import ATTR_GENERIC, EMAIL_DOMAIN_GENERIC, parse_generic


parsers = [
(ATTR_UPS, EMAIL_DOMAIN_UPS, parse_ups),
Expand Down Expand Up @@ -106,12 +108,14 @@
(ATTR_SONY, EMAIL_DOMAIN_SONY, parse_sony),
(ATTR_SYLVANE, EMAIL_DOMAIN_SYLVANE, parse_sylvane),
(ATTR_ADAFRUIT, EMAIL_DOMAIN_ADAFRUIT, parse_adafruit),

(ATTR_GENERIC, EMAIL_DOMAIN_GENERIC, parse_generic),
]

_LOGGER = logging.getLogger(__name__)

DOMAIN = 'email'
SCAN_INTERVAL = timedelta(seconds=5*60)
SCAN_INTERVAL = timedelta(seconds=30*60)

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_EMAIL): cv.string,
Expand Down Expand Up @@ -160,15 +164,15 @@
ups_regex = "(" + ")|(".join(ups_pattern) + ")"

def find_carrier(tracking_number, email_domain):
_LOGGER.debug(f'find_carrier email_domain: {email_domain}')
_LOGGER.debug(f'find_carrier email_domain: {email_domain} {tracking_number}')

# we may have the carrier/link already parsed from parser
if type(tracking_number) is dict:
return {
'tracking_number': tracking_number['tracking_number'],
'tracking_number': tracking_number.get('tracking_number', ''),
'carrier': email_domain,
'origin': email_domain,
'link': tracking_number['link'],
'link': tracking_number.get('link', ''),
}

link = ""
Expand Down

0 comments on commit 54d2678

Please sign in to comment.