-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathweathergroup.py
93 lines (85 loc) · 2.74 KB
/
weathergroup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import re
from aviation_weather.components import Component
from aviation_weather.exceptions import WeatherGroupDecodeError
class WeatherGroup(Component):
# TODO: see FMH-1 12.6.8 for specific formatting instructions
INTENSITIES = {
"-": "light",
"": "moderate",
"+": "heavy",
"VC": "in the vicinity" # proximity
}
DESCRIPTORS = {
"BC": "patches",
"BL": "blowing",
"DR": "low drifting",
"FZ": "freezing",
"MI": "shallow",
"PR": "partial",
"SH": "shower(s)",
"TS": "thunderstorm",
"NSW": "no significant weather"
}
PHENOMENA = {
# Precipitation
"DZ": "drizzle",
"GR": "hail",
"GS": "small hail and/or snow pellets",
"IC": "ice crystals",
"PL": "ice pellets",
"RA": "rain",
"SG": "snow grains",
"SN": "snow",
"UP": "unknown precipitation",
# Obscuration
"BR": "mist",
"DU": "widespread dust",
"FG": "fog",
"FU": "smoke",
"HZ": "haze",
"PY": "spray",
"SA": "sand",
"VA": "volcanic ash",
# Other
"DS": "duststorm",
"FC": "funnel clouds",
"PO": "well-developed dust/sand whirls",
"SQ": "squalls",
"SS": "sandstorm"
}
def __init__(self, raw):
"""Parse `raw` to create a new WeatherGroup object.
Args:
raw (str): The weather group to be parsed.
Raises:
WeatherGroupDecodeError: If `raw` could not be parsed.
"""
m = re.search(
r"(?P<intensity>(?:%(intensities)s))?"
r"(?P<descriptor>(?:%(descriptors)s))?"
r"(?P<phenomenon>(?:%(phenomena)s){1,3})?\b"
%
{
"intensities": "|".join(WeatherGroup.INTENSITIES).replace("+", "\+").replace("||", "|").strip("|"),
"descriptors": "|".join(WeatherGroup.DESCRIPTORS),
"phenomena": "|".join(WeatherGroup.PHENOMENA)
},
raw
)
if not (m and (m.group("descriptor") or m.group("phenomenon"))):
raise WeatherGroupDecodeError("WeatherGroup(%r) could not be parsed" % raw)
self.intensity = m.group("intensity") or "" # Empty string for moderate intensity
self.descriptor = m.group("descriptor")
p = m.group("phenomenon")
if p and len(p) > 2:
self.phenomenon = tuple((p[0+i:2+i] for i in range(0, len(p), 2)))
else:
self.phenomenon = p
@property
def raw(self):
raw = self.intensity
if self.descriptor:
raw += self.descriptor
if self.phenomenon:
raw += "".join(self.phenomenon)
return raw