From 95cc43a313266713bf9cb7b1fb21195aaa1cb17c Mon Sep 17 00:00:00 2001 From: akrherz Date: Tue, 23 Jul 2024 06:49:14 -0500 Subject: [PATCH 1/2] rename Temp1Hour to TempTgroup --- metar/Metar.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/metar/Metar.py b/metar/Metar.py index 3859417b..b0da20b7 100644 --- a/metar/Metar.py +++ b/metar/Metar.py @@ -153,7 +153,7 @@ class ParserError(Exception): (?P\d\d\d)\s+""", re.VERBOSE, ) -TEMP_1HR_RE = re.compile( +TEMP_TGROUP_RE = re.compile( r"""^T(?P0|1) (?P\d\d\d) ((?P0|1) @@ -882,7 +882,7 @@ def _handlePrecip1hrRemark(self, d): value = float(d["precip"]) / 100.0 self.precip_1hr = precipitation(value, "IN") - def _handleTemp1hrRemark(self, d): + def _handleTempTgroupRemark(self, d): """ Parse a temperature & dewpoint remark group. @@ -1084,7 +1084,7 @@ def _unparsedRemark(self, d): (WIND_SHIFT_RE, _handleWindShiftRemark), (LIGHTNING_RE, _handleLightningRemark), (TS_LOC_RE, _handleTSLocRemark), - (TEMP_1HR_RE, _handleTemp1hrRemark), + (TEMP_TGROUP_RE, _handleTempTgroupRemark), (PRECIP_1HR_RE, _handlePrecip1hrRemark), (PRECIP_24HR_RE, _handlePrecip24hrRemark), (PRESS_3HR_RE, _handlePress3hrRemark), From d9f1d6e46a0b8ddf13fec132a6687ffd04d96a0d Mon Sep 17 00:00:00 2001 From: akrherz Date: Tue, 23 Jul 2024 07:11:54 -0500 Subject: [PATCH 2/2] feat: ensure T-group temperatures are consistent closes #182 --- metar/Metar.py | 13 +++++++++++++ test/test_metar.py | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/metar/Metar.py b/metar/Metar.py index b0da20b7..f5556c23 100644 --- a/metar/Metar.py +++ b/metar/Metar.py @@ -888,14 +888,27 @@ def _handleTempTgroupRemark(self, d): These values replace the temp and dewpt from the body of the report. """ + def _checkT(current, newvalue, label): + """Helper.""" + if current and abs(newvalue - current.value()) > 1: + raise ValueError( + f"{label} from T group ({newvalue:.1f}) does not " + "agree with previously parsed value of " + f"{current.value():.0f}" + ) + value = float(d["temp"]) / 10.0 if d["tsign"] == "1": value = -value + # Ensure that Tgroup value rounds to integer provided temperature + _checkT(self.temp, value, "Temperature") self.temp = temperature(value) if d["dewpt"]: value2 = float(d["dewpt"]) / 10.0 if d["dsign"] == "1": value2 = -value2 + # Ensure that Tgroup value rounds to integer provided dewpoint + _checkT(self.dewpt, value2, "Dew Point") self.dewpt = temperature(value2) def _handleTemp6hrRemark(self, d): diff --git a/test/test_metar.py b/test/test_metar.py index c68dc104..73ac0c57 100644 --- a/test/test_metar.py +++ b/test/test_metar.py @@ -39,6 +39,19 @@ def test_module(): assert hasattr(metar, "__version__") +def test_issue182_conflicting_temperatures(): + """Test that a T-group with conflicting temperatures raises an error.""" + # IRL + code = ( + "KRDU 081851Z 33003KT 10SM SCT030 SCT120 BKN200 " + "35/24 A3004 RMK T03440339" + ) + with pytest.raises(Metar.ParserError): + Metar.Metar(code, 7, 2024, strict=True) + mtr = Metar.Metar(code, 7, 2024, strict=False) + assert mtr.dewpt.value() == 24.0 + + def test_issue114_multiplebecominggroups(): """multiple BECMG (becoming) groups should be possible""" code = (