Source code for pyiem.nws.products.sel
"""Parsing of Storm Prediction Center SEL Product."""
import re
from pyiem.models.sel import SELModel
from pyiem.nws.product import TextProduct
# The product format has been remarkably consistent over 16+ years!
WATCH_RE = re.compile(
r"(?P<typ>SEVERE THUNDERSTORM|TORNADO)\s+WATCH\s+NUMBER\s+"
r"(?P<num>\d\d\d\d|\d\d\d|\d\d|\d)",
re.I,
)
def _parse_data(tp):
"""Fill out the data model."""
# Only look in top 15 lines for the watch details
meat = (" ".join(tp.unixtext.split("\n")[:15])).replace(" -", "")
ws = WATCH_RE.search(meat).groupdict()
return SELModel(
typ="TOR" if ws["typ"].startswith("T") else "SVR",
num=int(ws["num"]),
)
[docs]
class SELProduct(TextProduct):
"""Class representing a SEL Product"""
def __init__(self, text, utcnow=None):
"""Constructor
Args:
text (str): text to parse
"""
super().__init__(text, utcnow=utcnow, ugc_provider={})
self.data = _parse_data(self)
[docs]
def is_test(self):
"""Is this a test product?"""
return self.data.num > 9000 or self.unixtext.find("...TEST") > 0
[docs]
def sql(self, txn):
"""Do the necessary database work
Args:
(psycopg.transaction): a database transaction
"""
# Don't do anything if this is not an issuance
if self.unixtext.upper().find("HAS ISSUED A") < 0:
return
# First, check to see if we already have this num
txn.execute(
"SELECT num from watches where "
"extract(year from issued at time zone 'UTC') = %s and num = %s "
"and type = %s",
(self.valid.year, self.data.num, self.data.typ),
)
if txn.rowcount == 0:
# Insert an entry
txn.execute(
"INSERT into watches (num, issued, type) VALUES (%s, %s, %s)",
(self.data.num, self.valid, self.data.typ),
)
# Now, update the data
txn.execute(
"UPDATE watches SET "
"product_id_sel = %s "
"WHERE extract(year from issued at time zone 'UTC') = %s "
"and num = %s",
(
self.get_product_id(),
self.valid.year,
self.data.num,
),
)
[docs]
def parser(text, utcnow=None, _ugc_provider=None, _nwsli_provider=None):
"""Parse SPC SEL Product.
Args:
text (str): the raw text to parse
utcnow (datetime): the current datetime with timezone set!
Returns:
WWPProduct instance
"""
return SELProduct(text, utcnow=utcnow)