mirror of
https://github.com/jdejaegh/irm-kmi-ha.git
synced 2025-06-27 11:39:26 +02:00
Add docstring
This commit is contained in:
parent
8a93adb053
commit
eec3564d17
1 changed files with 24 additions and 1 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
"""Parse pollen info from SVG from IRM KMI api"""
|
||||||
import logging
|
import logging
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from typing import List
|
from typing import List
|
||||||
|
@ -8,6 +9,22 @@ _LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class PollenParser:
|
class PollenParser:
|
||||||
|
"""
|
||||||
|
The SVG looks as follows (see test fixture for a real example)
|
||||||
|
|
||||||
|
Active pollens
|
||||||
|
---------------------------------
|
||||||
|
Oak active
|
||||||
|
Ash active
|
||||||
|
---------------------------------
|
||||||
|
Birch ---|---|---|---|-*-
|
||||||
|
Alder -*-|---|---|---|---
|
||||||
|
|
||||||
|
This classe parses the oak and ash as active, birch as purple and alder as green in the example.
|
||||||
|
For active pollen, check if an active text is present on the same line as the pollen name
|
||||||
|
For the color scale, look for a white dot (nearly) at the same level as the pollen name. From the white dot
|
||||||
|
horizontal position, determine the level
|
||||||
|
"""
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
xml_string: str
|
xml_string: str
|
||||||
|
@ -16,6 +33,7 @@ class PollenParser:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _validate_svg(elements: List[ET.Element]) -> bool:
|
def _validate_svg(elements: List[ET.Element]) -> bool:
|
||||||
|
"""Make sure that the colors of the scale are still where we expect them"""
|
||||||
x_values = {"rectgreen": 80,
|
x_values = {"rectgreen": 80,
|
||||||
"rectyellow": 95,
|
"rectyellow": 95,
|
||||||
"rectorange": 110,
|
"rectorange": 110,
|
||||||
|
@ -32,14 +50,17 @@ class PollenParser:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_default_data() -> dict:
|
def get_default_data() -> dict:
|
||||||
|
"""Return all the known pollen with 'none' value"""
|
||||||
return {k.lower(): 'none' for k in POLLEN_NAMES}
|
return {k.lower(): 'none' for k in POLLEN_NAMES}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_option_values() -> List[str]:
|
def get_option_values() -> List[str]:
|
||||||
|
"""List all the values that the pollen can have"""
|
||||||
return ['active', 'green', 'yellow', 'orange', 'red', 'purple', 'none']
|
return ['active', 'green', 'yellow', 'orange', 'red', 'purple', 'none']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _extract_elements(root) -> List[ET.Element]:
|
def _extract_elements(root) -> List[ET.Element]:
|
||||||
|
"""Recursively collect all elements of the SVG in a list"""
|
||||||
elements = []
|
elements = []
|
||||||
for child in root:
|
for child in root:
|
||||||
elements.append(child)
|
elements.append(child)
|
||||||
|
@ -48,7 +69,7 @@ class PollenParser:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _dot_to_color_value(dot: ET.Element) -> str:
|
def _dot_to_color_value(dot: ET.Element) -> str:
|
||||||
|
"""Map the dot horizontal position to a color or 'none'"""
|
||||||
try:
|
try:
|
||||||
cx = float(dot.attrib.get('cx'))
|
cx = float(dot.attrib.get('cx'))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
@ -70,6 +91,8 @@ class PollenParser:
|
||||||
return 'none'
|
return 'none'
|
||||||
|
|
||||||
def get_pollen_data(self) -> dict:
|
def get_pollen_data(self) -> dict:
|
||||||
|
"""From the XML string, parse the SVG and extract the pollen data from the image.
|
||||||
|
If an error occurs, return the default value"""
|
||||||
pollen_data = self.get_default_data()
|
pollen_data = self.get_default_data()
|
||||||
try:
|
try:
|
||||||
root = ET.fromstring(self._xml)
|
root = ET.fromstring(self._xml)
|
||||||
|
|
Loading…
Add table
Reference in a new issue