import traceback from typing import Any def print_with_line_number(message): line_number = traceback.extract_stack()[-2][1] line_length = 30 # Length of cutting line print(f"\033[92mLine {line_number}\033[0m \033[92m{'=' * line_length}\033[0m") print(f"{message}") class HttpResponse: def __init__(self, status: int, data: Any): self.status = status self.data = data # async def get_url( # url: str, type: Literal["string", "bytes", "json"] = "string" # ) -> HttpResponse: # """ # An async wrapper function for http requests that works in both regular Python and # Pyodide. # In Pyodide, it uses the pyodide.http.pyfetch() function, which is a wrapper for the # JavaScript fetch() function. pyfetch() is asynchronous, so this whole function must # also be async. # In regular Python, it uses the urllib.request.urlopen() function. # Args: # url: The URL to download. # type: How to parse the content. If "string", it returns the response as a # string. If "bytes", it returns the response as a bytes object. If "json", it # parses the reponse as JSON, then converts it to a Python object, usually a # dictionary or list. # Returns: # A HttpResponse object # """ # import sys # if "pyodide" in sys.modules: # import pyodide.http # response = await pyodide.http.pyfetch(url) # if type == "json": # # .json() parses the response as JSON and converts to dictionary. # data = await response.json() # elif type == "string": # # .string() returns the response as a string. # data = await response.string() # elif type == "bytes": # # .bytes() returns the response as a byte object. # data = await response.bytes() # return HttpResponse(response.status, data) # else: # import urllib.request # response = urllib.request.urlopen(url) # if type == "json": # data = json.loads(response.read().decode("utf-8")) # elif type == "string": # data = response.read().decode("utf-8") # elif type == "bytes": # data = response.read() # return HttpResponse(response.status, data) datafields = { "cloudBase": "cloudBase(km)", "cloudCeiling": "cloudCeiling(km)", "dewPoint": "dewPoint(℃)", "evapotranspiration": "evapotranspiration(mm)", "freezingRainIntensity": "freezingRainIntensity(mm/hr)", "humidity": "humidity(%)", "iceAccumulation": "iceAccumulation(mm)", "pressureSurfaceLevel": "pressureSurfaceLevel(hPa)", "rainAccumulation": "rainAccumulation(mm)", "rainIntensity": "rainIntensity(mm/hr)", "sleetAccumulation": "sleetAccumulation(mm)", "sleetIntensity": "sleetIntensity(mm/hr)", "snowAccumulation": "snowAccumulation(mm)", "snowDepth": "snowDepth(cm)", "snowIntensity": "snowIntensity(mm/hr)", "temperature": "temperature(℃)", "temperatureApparent": "temperatureApparent(℃)", "uvHealthConcern": "uvHealthConcern", "uvIndex": "uvIndex", "visibility": "visibility(km)", "windDirection": "windDirection(°)", "windGust": "windGust(m/s)", "windSpeed": "windSpeed(m/s)" } weatherCode = { "0": "Unknown", "1000": "Clear, Sunny", "1100": "Mostly Clear", "1101": "Partly Cloudy", "1102": "Mostly Cloudy", "1001": "Cloudy", "2000": "Fog", "2100": "Light Fog", "4000": "Drizzle", "4001": "Rain", "4200": "Light Rain", "4201": "Heavy Rain", "5000": "Snow", "5001": "Flurries", "5100": "Light Snow", "5101": "Heavy Snow", "6000": "Freezing Drizzle", "6001": "Freezing Rain", "6200": "Light Freezing Rain", "6201": "Heavy Freezing Rain", "7000": "Ice Pellets", "7101": "Heavy Ice Pellets", "7102": "Light Ice Pellets", "8000": "Thunderstorm" }, weatherCodeFullDay = { "0": "Unknown", "1000": "Clear, Sunny", "1100": "Mostly Clear", "1101": "Partly Cloudy", "1102": "Mostly Cloudy", "1001": "Cloudy", "1103": "Partly Cloudy and Mostly Clear", "2100": "Light Fog", "2101": "Mostly Clear and Light Fog", "2102": "Partly Cloudy and Light Fog", "2103": "Mostly Cloudy and Light Fog", "2106": "Mostly Clear and Fog", "2107": "Partly Cloudy and Fog", "2108": "Mostly Cloudy and Fog", "2000": "Fog", "4204": "Partly Cloudy and Drizzle", "4203": "Mostly Clear and Drizzle", "4205": "Mostly Cloudy and Drizzle", "4000": "Drizzle", "4200": "Light Rain", "4213": "Mostly Clear and Light Rain", "4214": "Partly Cloudy and Light Rain", "4215": "Mostly Cloudy and Light Rain", "4209": "Mostly Clear and Rain", "4208": "Partly Cloudy and Rain", "4210": "Mostly Cloudy and Rain", "4001": "Rain", "4211": "Mostly Clear and Heavy Rain", "4202": "Partly Cloudy and Heavy Rain", "4212": "Mostly Cloudy and Heavy Rain", "4201": "Heavy Rain", "5115": "Mostly Clear and Flurries", "5116": "Partly Cloudy and Flurries", "5117": "Mostly Cloudy and Flurries", "5001": "Flurries", "5100": "Light Snow", "5102": "Mostly Clear and Light Snow", "5103": "Partly Cloudy and Light Snow", "5104": "Mostly Cloudy and Light Snow", "5122": "Drizzle and Light Snow", "5105": "Mostly Clear and Snow", "5106": "Partly Cloudy and Snow", "5107": "Mostly Cloudy and Snow", "5000": "Snow", "5101": "Heavy Snow", "5119": "Mostly Clear and Heavy Snow", "5120": "Partly Cloudy and Heavy Snow", "5121": "Mostly Cloudy and Heavy Snow", "5110": "Drizzle and Snow", "5108": "Rain and Snow", "5114": "Snow and Freezing Rain", "5112": "Snow and Ice Pellets", "6000": "Freezing Drizzle", "6003": "Mostly Clear and Freezing drizzle", "6002": "Partly Cloudy and Freezing drizzle", "6004": "Mostly Cloudy and Freezing drizzle", "6204": "Drizzle and Freezing Drizzle", "6206": "Light Rain and Freezing Drizzle", "6205": "Mostly Clear and Light Freezing Rain", "6203": "Partly Cloudy and Light Freezing Rain", "6209": "Mostly Cloudy and Light Freezing Rain", "6200": "Light Freezing Rain", "6213": "Mostly Clear and Freezing Rain", "6214": "Partly Cloudy and Freezing Rain", "6215": "Mostly Cloudy and Freezing Rain", "6001": "Freezing Rain", "6212": "Drizzle and Freezing Rain", "6220": "Light Rain and Freezing Rain", "6222": "Rain and Freezing Rain", "6207": "Mostly Clear and Heavy Freezing Rain", "6202": "Partly Cloudy and Heavy Freezing Rain", "6208": "Mostly Cloudy and Heavy Freezing Rain", "6201": "Heavy Freezing Rain", "7110": "Mostly Clear and Light Ice Pellets", "7111": "Partly Cloudy and Light Ice Pellets", "7112": "Mostly Cloudy and Light Ice Pellets", "7102": "Light Ice Pellets", "7108": "Mostly Clear and Ice Pellets", "7107": "Partly Cloudy and Ice Pellets", "7109": "Mostly Cloudy and Ice Pellets", "7000": "Ice Pellets", "7105": "Drizzle and Ice Pellets", "7106": "Freezing Rain and Ice Pellets", "7115": "Light Rain and Ice Pellets", "7117": "Rain and Ice Pellets", "7103": "Freezing Rain and Heavy Ice Pellets", "7113": "Mostly Clear and Heavy Ice Pellets", "7114": "Partly Cloudy and Heavy Ice Pellets", "7116": "Mostly Cloudy and Heavy Ice Pellets", "7101": "Heavy Ice Pellets", "8001": "Mostly Clear and Thunderstorm", "8003": "Partly Cloudy and Thunderstorm", "8002": "Mostly Cloudy and Thunderstorm", "8000": "Thunderstorm" }, weatherCodeDay = { "0": "Unknown", "10000": "Clear, Sunny", "11000": "Mostly Clear", "11010": "Partly Cloudy", "11020": "Mostly Cloudy", "10010": "Cloudy", "11030": "Partly Cloudy and Mostly Clear", "21000": "Light Fog", "21010": "Mostly Clear and Light Fog", "21020": "Partly Cloudy and Light Fog", "21030": "Mostly Cloudy and Light Fog", "21060": "Mostly Clear and Fog", "21070": "Partly Cloudy and Fog", "21080": "Mostly Cloudy and Fog", "20000": "Fog", "42040": "Partly Cloudy and Drizzle", "42030": "Mostly Clear and Drizzle", "42050": "Mostly Cloudy and Drizzle", "40000": "Drizzle", "42000": "Light Rain", "42130": "Mostly Clear and Light Rain", "42140": "Partly Cloudy and Light Rain", "42150": "Mostly Cloudy and Light Rain", "42090": "Mostly Clear and Rain", "42080": "Partly Cloudy and Rain", "42100": "Mostly Cloudy and Rain", "40010": "Rain", "42110": "Mostly Clear and Heavy Rain", "42020": "Partly Cloudy and Heavy Rain", "42120": "Mostly Cloudy and Heavy Rain", "42010": "Heavy Rain", "51150": "Mostly Clear and Flurries", "51160": "Partly Cloudy and Flurries", "51170": "Mostly Cloudy and Flurries", "50010": "Flurries", "51000": "Light Snow", "51020": "Mostly Clear and Light Snow", "51030": "Partly Cloudy and Light Snow", "51040": "Mostly Cloudy and Light Snow", "51220": "Drizzle and Light Snow", "51050": "Mostly Clear and Snow", "51060": "Partly Cloudy and Snow", "51070": "Mostly Cloudy and Snow", "50000": "Snow", "51010": "Heavy Snow", "51190": "Mostly Clear and Heavy Snow", "51200": "Partly Cloudy and Heavy Snow", "51210": "Mostly Cloudy and Heavy Snow", "51100": "Drizzle and Snow", "51080": "Rain and Snow", "51140": "Snow and Freezing Rain", "51120": "Snow and Ice Pellets", "60000": "Freezing Drizzle", "60030": "Mostly Clear and Freezing drizzle", "60020": "Partly Cloudy and Freezing drizzle", "60040": "Mostly Cloudy and Freezing drizzle", "62040": "Drizzle and Freezing Drizzle", "62060": "Light Rain and Freezing Drizzle", "62050": "Mostly Clear and Light Freezing Rain", "62030": "Partly Cloudy and Light Freezing Rain", "62090": "Mostly Cloudy and Light Freezing Rain", "62000": "Light Freezing Rain", "62130": "Mostly Clear and Freezing Rain", "62140": "Partly Cloudy and Freezing Rain", "62150": "Mostly Cloudy and Freezing Rain", "60010": "Freezing Rain", "62120": "Drizzle and Freezing Rain", "62200": "Light Rain and Freezing Rain", "62220": "Rain and Freezing Rain", "62070": "Mostly Clear and Heavy Freezing Rain", "62020": "Partly Cloudy and Heavy Freezing Rain", "62080": "Mostly Cloudy and Heavy Freezing Rain", "62010": "Heavy Freezing Rain", "71100": "Mostly Clear and Light Ice Pellets", "71110": "Partly Cloudy and Light Ice Pellets", "71120": "Mostly Cloudy and Light Ice Pellets", "71020": "Light Ice Pellets", "71080": "Mostly Clear and Ice Pellets", "71070": "Partly Cloudy and Ice Pellets", "71090": "Mostly Cloudy and Ice Pellets", "70000": "Ice Pellets", "71050": "Drizzle and Ice Pellets", "71060": "Freezing Rain and Ice Pellets", "71150": "Light Rain and Ice Pellets", "71170": "Rain and Ice Pellets", "71030": "Freezing Rain and Heavy Ice Pellets", "71130": "Mostly Clear and Heavy Ice Pellets", "71140": "Partly Cloudy and Heavy Ice Pellets", "71160": "Mostly Cloudy and Heavy Ice Pellets", "71010": "Heavy Ice Pellets", "80010": "Mostly Clear and Thunderstorm", "80030": "Partly Cloudy and Thunderstorm", "80020": "Mostly Cloudy and Thunderstorm", "80000": "Thunderstorm" }, weatherCodeNight = { "0": "Unknown", "10001": "Clear", "11001": "Mostly Clear", "11011": "Partly Cloudy", "11021": "Mostly Cloudy", "10011": "Cloudy", "11031": "Partly Cloudy and Mostly Clear", "21001": "Light Fog", "21011": "Mostly Clear and Light Fog", "21021": "Partly Cloudy and Light Fog", "21031": "Mostly Cloudy and Light Fog", "21061": "Mostly Clear and Fog", "21071": "Partly Cloudy and Fog", "21081": "Mostly Cloudy and Fog", "20001": "Fog", "42041": "Partly Cloudy and Drizzle", "42031": "Mostly Clear and Drizzle", "42051": "Mostly Cloudy and Drizzle", "40001": "Drizzle", "42001": "Light Rain", "42131": "Mostly Clear and Light Rain", "42141": "Partly Cloudy and Light Rain", "42151": "Mostly Cloudy and Light Rain", "42091": "Mostly Clear and Rain", "42081": "Partly Cloudy and Rain", "42101": "Mostly Cloudy and Rain", "40011": "Rain", "42111": "Mostly Clear and Heavy Rain", "42021": "Partly Cloudy and Heavy Rain", "42121": "Mostly Cloudy and Heavy Rain", "42011": "Heavy Rain", "51151": "Mostly Clear and Flurries", "51161": "Partly Cloudy and Flurries", "51171": "Mostly Cloudy and Flurries", "50011": "Flurries", "51001": "Light Snow", "51021": "Mostly Clear and Light Snow", "51031": "Partly Cloudy and Light Snow", "51041": "Mostly Cloudy and Light Snow", "51221": "Drizzle and Light Snow", "51051": "Mostly Clear and Snow", "51061": "Partly Cloudy and Snow", "51071": "Mostly Cloudy and Snow", "50001": "Snow", "51011": "Heavy Snow", "51191": "Mostly Clear and Heavy Snow", "51201": "Partly Cloudy and Heavy Snow", "51211": "Mostly Cloudy and Heavy Snow", "51101": "Drizzle and Snow", "51081": "Rain and Snow", "51141": "Snow and Freezing Rain", "51121": "Snow and Ice Pellets", "60001": "Freezing Drizzle", "60031": "Mostly Clear and Freezing drizzle", "60021": "Partly Cloudy and Freezing drizzle", "60041": "Mostly Cloudy and Freezing drizzle", "62041": "Drizzle and Freezing Drizzle", "62061": "Light Rain and Freezing Drizzle", "62051": "Mostly Clear and Light Freezing Rain", "62031": "Partly cloudy and Light Freezing Rain", "62091": "Mostly Cloudy and Light Freezing Rain", "62001": "Light Freezing Rain", "62131": "Mostly Clear and Freezing Rain", "62141": "Partly Cloudy and Freezing Rain", "62151": "Mostly Cloudy and Freezing Rain", "60011": "Freezing Rain", "62121": "Drizzle and Freezing Rain", "62201": "Light Rain and Freezing Rain", "62221": "Rain and Freezing Rain", "62071": "Mostly Clear and Heavy Freezing Rain", "62021": "Partly Cloudy and Heavy Freezing Rain", "62081": "Mostly Cloudy and Heavy Freezing Rain", "62011": "Heavy Freezing Rain", "71101": "Mostly Clear and Light Ice Pellets", "71111": "Partly Cloudy and Light Ice Pellets", "71121": "Mostly Cloudy and Light Ice Pellets", "71021": "Light Ice Pellets", "71081": "Mostly Clear and Ice Pellets", "71071": "Partly Cloudy and Ice Pellets", "71091": "Mostly Cloudy and Ice Pellets", "70001": "Ice Pellets", "71051": "Drizzle and Ice Pellets", "71061": "Freezing Rain and Ice Pellets", "71151": "Light Rain and Ice Pellets", "71171": "Rain and Ice Pellets", "71031": "Freezing Rain and Heavy Ice Pellets", "71131": "Mostly Clear and Heavy Ice Pellets", "71141": "Partly Cloudy and Heavy Ice Pellets", "71161": "Mostly Cloudy and Heavy Ice Pellets", "71011": "Heavy Ice Pellets", "80011": "Mostly Clear and Thunderstorm", "80031": "Partly Cloudy and Thunderstorm", "80021": "Mostly Cloudy and Thunderstorm", "80001": "Thunderstorm" }