From 9a6d93bb57878c36035bb2e416c730b55a713f18 Mon Sep 17 00:00:00 2001 From: FengW01 Date: Tue, 2 Sep 2025 16:25:20 +1000 Subject: [PATCH 1/9] Refactor: unify UTCI calculations in extract_df.py and add time_filtering in template_graphs.py to reduce duplication --- pages/lib/extract_df.py | 80 +++++++++++++++++++----------------- pages/lib/template_graphs.py | 27 ++++++------ 2 files changed, 54 insertions(+), 53 deletions(-) diff --git a/pages/lib/extract_df.py b/pages/lib/extract_df.py index bda5e38..f3fb811 100644 --- a/pages/lib/extract_df.py +++ b/pages/lib/extract_df.py @@ -76,6 +76,44 @@ def get_location_info(lst, file_name): return location_info +# ==== Unified UTCI computation and binning ==== +UTCI_BINS = [-999, -40, -27, -13, 0, 9, 26, 32, 38, 46, 999] +UTCI_LABELS = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] + +def utci_calc(df: pd.DataFrame, t_air_col, t_rad_col, wind_col, rh_col=ColNames.RH): + """Call utci() using values from df columns.""" + return utci(df[t_air_col], df[t_rad_col], df[wind_col], df[rh_col]) + +def add_utci_variants(df: pd.DataFrame) -> pd.DataFrame: + """ + Generate the four UTCI variants: + - noSun_Wind : DBT + DBT + wind_speed_utci + - noSun_noWind : DBT + DBT + wind_speed_utci_0 + - Sun_Wind : DBT + MRT + wind_speed_utci + - Sun_noWind : DBT + MRT + wind_speed_utci_0 + """ + recipes = { + ColNames.UTCI_NO_SUN_WIND: (ColNames.DBT, ColNames.DBT, ColNames.WIND_SPEED_UTCI), + ColNames.UTCI_NO_SUN_NO_WIND: (ColNames.DBT, ColNames.DBT, ColNames.WIND_SPEED_UTCI_0), + ColNames.UTCI_SUN_WIND: (ColNames.DBT, ColNames.MRT, ColNames.WIND_SPEED_UTCI), + ColNames.UTCI_SUN_NO_WIND: (ColNames.DBT, ColNames.MRT, ColNames.WIND_SPEED_UTCI_0), + } + for out_col, (t_air, t_rad, wind) in recipes.items(): + df[out_col] = utci_calc(df, t_air, t_rad, wind) + return df + +def add_utci_categories(df: pd.DataFrame) -> pd.DataFrame: + """Bin the four UTCI columns into categories.""" + mapping = { + ColNames.UTCI_NO_SUN_WIND: ColNames.UTCI_NOSUN_WIND_CATEGORIES, + ColNames.UTCI_NO_SUN_NO_WIND: ColNames.UTCI_NOSUN_NOWIND_CATEGORIES, + ColNames.UTCI_SUN_WIND: ColNames.UTCI_SUN_WIND_CATEGORIES, + ColNames.UTCI_SUN_NO_WIND: ColNames.UTCI_SUN_NOWIND_CATEGORIES, + } + for src_col, dst_col in mapping.items(): + df[dst_col] = pd.cut(x=df[src_col], bins=UTCI_BINS, labels=UTCI_LABELS) + return df + @code_timer def create_df(lst, file_name): @@ -280,45 +318,11 @@ def create_df(lst, file_name): epw_df[ColNames.WIND_SPEED_UTCI_0] = epw_df[ColNames.WIND_SPEED_UTCI].mask( epw_df[ColNames.WIND_SPEED_UTCI] >= 0, 0.5 ) - epw_df[ColNames.UTCI_NO_SUN_WIND] = utci( - epw_df[ColNames.DBT], - epw_df[ColNames.DBT], - epw_df[ColNames.WIND_SPEED_UTCI], - epw_df[ColNames.RH], - ) - epw_df[ColNames.UTCI_NO_SUN_NO_WIND] = utci( - epw_df[ColNames.DBT], - epw_df[ColNames.DBT], - epw_df[ColNames.WIND_SPEED_UTCI_0], - epw_df[ColNames.RH], - ) - epw_df[ColNames.UTCI_SUN_WIND] = utci( - epw_df[ColNames.DBT], - epw_df[ColNames.MRT], - epw_df[ColNames.WIND_SPEED_UTCI], - epw_df[ColNames.RH], - ) - epw_df[ColNames.UTCI_SUN_NO_WIND] = utci( - epw_df[ColNames.DBT], - epw_df[ColNames.MRT], - epw_df[ColNames.WIND_SPEED_UTCI_0], - epw_df[ColNames.RH], - ) + + epw_df = add_utci_variants(epw_df) + + epw_df = add_utci_categories(epw_df) - utci_bins = [-999, -40, -27, -13, 0, 9, 26, 32, 38, 46, 999] - utci_labels = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] - epw_df[ColNames.UTCI_NOSUN_WIND_CATEGORIES] = pd.cut( - x=epw_df[ColNames.UTCI_NO_SUN_WIND], bins=utci_bins, labels=utci_labels - ) - epw_df[ColNames.UTCI_NOSUN_NOWIND_CATEGORIES] = pd.cut( - x=epw_df[ColNames.UTCI_NO_SUN_NO_WIND], bins=utci_bins, labels=utci_labels - ) - epw_df[ColNames.UTCI_SUN_WIND_CATEGORIES] = pd.cut( - x=epw_df[ColNames.UTCI_SUN_WIND], bins=utci_bins, labels=utci_labels - ) - epw_df[ColNames.UTCI_SUN_NOWIND_CATEGORIES] = pd.cut( - x=epw_df[ColNames.UTCI_SUN_NO_WIND], bins=utci_bins, labels=utci_labels - ) # Add psy values ta_rh = np.vectorize(psy.psy_ta_rh)(epw_df[ColNames.DBT], epw_df[ColNames.RH]) diff --git a/pages/lib/template_graphs.py b/pages/lib/template_graphs.py index c57fd22..24e34b8 100644 --- a/pages/lib/template_graphs.py +++ b/pages/lib/template_graphs.py @@ -843,6 +843,14 @@ def barchart(df, var, time_filter_info, data_filter_info, normalize, si_ip): ) return fig +def time_filtering(df, start_time, end_time, time_col, target_col): + + if start_time <= end_time: + mask = (df[time_col] < start_time) | (df[time_col] > end_time) + else: + mask = (df[time_col] >= end_time) & (df[time_col] <= start_time) + df.loc[mask, target_col] = None + return df def filter_df_by_month_and_hour( df, time_filter, month, hour, invert_month, invert_hour, var @@ -852,21 +860,10 @@ def filter_df_by_month_and_hour( ) if time_filter: - if start_month <= end_month: - mask = (df[ColNames.MONTH] < start_month) | (df[ColNames.MONTH] > end_month) - df.loc[mask, var] = None - else: - mask = (df[ColNames.MONTH] >= end_month) & ( - df[ColNames.MONTH] <= start_month - ) - df.loc[mask, var] = None - - if start_hour <= end_hour: - mask = (df[ColNames.HOUR] <= start_hour) | (df[ColNames.HOUR] > end_hour) - df.loc[mask, var] = None - else: - mask = (df[ColNames.HOUR] > end_hour) & (df[ColNames.HOUR] <= start_hour) - df.loc[mask, var] = None + # Month filter + time_filtering(df, start_month, end_month, ColNames.MONTH, var) + # Hour filter + time_filtering(df, start_hour, end_hour, ColNames.HOUR, var) return df From edb73dfc770ed8e117b68a5cca8600b54bbbcc06 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Tue, 2 Sep 2025 17:46:25 +1000 Subject: [PATCH 2/9] Refactor: extract reusable functions for temperature conversion, default value lists, and data range calculations --- pages/lib/charts_data_explorer.py | 14 ++++++++------ pages/lib/charts_sun.py | 14 +++++++++----- pages/lib/extract_df.py | 26 ++++++++++++++------------ pages/lib/template_graphs.py | 26 ++++++++++++++------------ pages/lib/utils.py | 7 +++++++ pages/natural_ventilation.py | 8 ++++++-- pages/psy-chart.py | 13 ++++++++----- 7 files changed, 66 insertions(+), 42 deletions(-) diff --git a/pages/lib/charts_data_explorer.py b/pages/lib/charts_data_explorer.py index c747763..848152f 100644 --- a/pages/lib/charts_data_explorer.py +++ b/pages/lib/charts_data_explorer.py @@ -1,9 +1,11 @@ -from math import ceil, floor - import numpy as np import math import plotly.express as px import plotly.graph_objects as go +from pages.lib.utils import ( + get_data_max, + get_data_min, +) from pages.lib.global_scheme import template, mapping_dictionary, month_lst from pages.lib.global_column_names import ColNames @@ -43,8 +45,8 @@ def custom_heatmap(df, global_local, var, time_filter_info, data_filter_info, si range_z = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_z = [data_min, data_max] title = var_name + " (" + var_unit + ")" @@ -121,8 +123,8 @@ def three_var_graph( if global_local != "global": # Set maximum and minimum according to data - data_max = 5 * math.ceil(df[var].max() / 5) - data_min = 5 * math.floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) var_range = [data_min, data_max] color_scale = var_color diff --git a/pages/lib/charts_sun.py b/pages/lib/charts_sun.py index c6449dd..309fec1 100644 --- a/pages/lib/charts_sun.py +++ b/pages/lib/charts_sun.py @@ -1,11 +1,15 @@ from datetime import timedelta -from math import ceil, cos, floor, radians +from math import cos, radians import numpy as np import pandas as pd import plotly.graph_objects as go from config import UnitSystem +from pages.lib.utils import ( + get_data_max, + get_data_min, +) from pages.lib.global_scheme import ( template, mapping_dictionary, @@ -135,8 +139,8 @@ def polar_graph(df, meta, global_local, var, si_ip): range_z = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(solpos[var].max() / 5) - data_min = 5 * floor(solpos[var].min() / 5) + data_max = get_data_max(solpos[var]) + data_min = get_data_min(solpos[var]) range_z = [data_min, data_max] tz = "UTC" @@ -348,8 +352,8 @@ def custom_cartesian_solar(df, meta, global_local, var, si_ip): range_z = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_z = [data_min, data_max] if var == "None": diff --git a/pages/lib/extract_df.py b/pages/lib/extract_df.py index f3fb811..9968108 100644 --- a/pages/lib/extract_df.py +++ b/pages/lib/extract_df.py @@ -279,14 +279,14 @@ def create_df(lst, file_name): # Add in UTCI sol_altitude = epw_df[ColNames.ELEVATION].mask(epw_df[ColNames.ELEVATION] <= 0, 0) - sharp = [45] * 8760 + sharp = check_value(45) sol_radiation_dir = epw_df[ColNames.DIR_NOR_RAD] - sol_transmittance = [1] * 8760 # CHECK VALUE - f_svv = [1] * 8760 # CHECK VALUE - f_bes = [1] * 8760 # CHECK VALUE - asw = [0.7] * 8760 # CHECK VALUE - posture = ["standing"] * 8760 - floor_reflectance = [0.6] * 8760 # EXPOSE AS A VARIABLE? + sol_transmittance = check_value(1) # CHECK VALUE + f_svv = check_value(1) # CHECK VALUE + f_bes = check_value(1) # CHECK VALUE + asw = check_value(0.7) # CHECK VALUE + posture = check_value("standing") + floor_reflectance = check_value(0.6) # EXPOSE AS A VARIABLE? mrt = np.vectorize(solar_gain)( sol_altitude, @@ -411,11 +411,11 @@ def enthalpy(df, name): def convert_data(df, mapping_json): - df[ColNames.ADAPTIVE_COMFORT] = df[ColNames.ADAPTIVE_COMFORT] * 1.8 + 32 - df[ColNames.ADAPTIVE_CMF_80_LOW] = df[ColNames.ADAPTIVE_CMF_80_LOW] * 1.8 + 32 - df[ColNames.ADAPTIVE_CMF_80_UP] = df[ColNames.ADAPTIVE_CMF_80_UP] * 1.8 + 32 - df[ColNames.ADAPTIVE_CMF_90_LOW] = df[ColNames.ADAPTIVE_CMF_90_LOW] * 1.8 + 32 - df[ColNames.ADAPTIVE_CMF_90_UP] = df[ColNames.ADAPTIVE_CMF_90_UP] * 1.8 + 32 + temperature(df, ColNames.ADAPTIVE_COMFORT) + temperature(df, ColNames.ADAPTIVE_CMF_80_LOW) + temperature(df, ColNames.ADAPTIVE_CMF_80_UP) + temperature(df, ColNames.ADAPTIVE_CMF_90_LOW) + temperature(df, ColNames.ADAPTIVE_CMF_90_UP) mapping_dict = json.loads(mapping_json) for key in json.loads(mapping_json): @@ -426,6 +426,8 @@ def convert_data(df, mapping_json): conversion_function(df, key) return json.dumps(mapping_dict) +def check_value(value, hours=8760): + return [value] * hours if __name__ == "__main__": # fmt: off diff --git a/pages/lib/template_graphs.py b/pages/lib/template_graphs.py index 24e34b8..d978d10 100644 --- a/pages/lib/template_graphs.py +++ b/pages/lib/template_graphs.py @@ -1,11 +1,13 @@ -from math import ceil, floor - import numpy as np import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots from config import UnitSystem +from pages.lib.utils import ( + get_data_max, + get_data_min, +) from pages.lib.global_scheme import mapping_dictionary import dash_bootstrap_components as dbc from .global_scheme import month_lst, template, tight_margins @@ -25,8 +27,8 @@ def violin(df, var, global_local, si_ip): data_night = df.loc[mask_night, var] if global_local != "global": - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) var_range = [data_min, data_max] fig = go.Figure() @@ -95,8 +97,8 @@ def yearly_profile(df, var, global_local, si_ip): range_y = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_y = [data_min, data_max] var_single_color = var_color[len(var_color) // 2] @@ -255,8 +257,8 @@ def daily_profile(df, var, global_local, si_ip): range_y = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_y = [data_min, data_max] var_single_color = var_color[len(var_color) // 2] @@ -371,8 +373,8 @@ def heatmap_with_filter( range_z = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_z = [data_min, data_max] fig = go.Figure( data=go.Heatmap( @@ -430,8 +432,8 @@ def heatmap(df, var, global_local, si_ip): range_z = var_range else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[var].max() / 5) - data_min = 5 * floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_z = [data_min, data_max] fig = go.Figure( data=go.Heatmap( diff --git a/pages/lib/utils.py b/pages/lib/utils.py index 2455b14..505d740 100644 --- a/pages/lib/utils.py +++ b/pages/lib/utils.py @@ -1,6 +1,7 @@ import copy import functools import time +import math import dash_bootstrap_components as dbc import pandas as pd @@ -289,3 +290,9 @@ def dropdown(options=None, **kwargs): clearable=False, **kwargs, ) + +def get_data_max(series, base=5): + return base * math.ceil(series.max() / base) + +def get_data_min(series, base=5): + return base * math.floor(series.min() / base) diff --git a/pages/natural_ventilation.py b/pages/natural_ventilation.py index 1f5f7ce..5fa8190 100644 --- a/pages/natural_ventilation.py +++ b/pages/natural_ventilation.py @@ -17,6 +17,10 @@ container_row_center_full, container_col_center_one_of_three, ) +from pages.lib.utils import ( + get_data_max, + get_data_min, +) from pages.lib.template_graphs import filter_df_by_month_and_hour from pages.lib.global_column_names import ColNames from pages.lib.global_element_ids import ElementIds @@ -373,8 +377,8 @@ def nv_heatmap( if global_local == "global": range_z = var_range else: - data_max = 5 * math.ceil(df[var].max() / 5) - data_min = 5 * math.floor(df[var].min() / 5) + data_max = get_data_max(df[var]) + data_min = get_data_min(df[var]) range_z = [data_min, data_max] title = ( diff --git a/pages/psy-chart.py b/pages/psy-chart.py index fc49e8f..dc56c85 100644 --- a/pages/psy-chart.py +++ b/pages/psy-chart.py @@ -1,5 +1,3 @@ -from math import ceil, floor - import dash from dash import dcc, html import dash_bootstrap_components as dbc @@ -12,6 +10,11 @@ from pythermalcomfort import psychrometrics as psy from config import PageUrls, DocLinks, PageInfo, UnitSystem +from pages.lib.utils import ( + get_data_max, + get_data_min, +) +from pages.lib.extract_df import temperature from pages.lib.global_element_ids import ElementIds from pages.lib.global_column_names import ColNames from pages.lib.global_id_buttons import IdButtons @@ -321,8 +324,8 @@ def update_psych_chart( else: # Set maximum and minimum according to data - data_max = 5 * ceil(df[ColNames.DBT].max() / 5) - data_min = 5 * floor(df[ColNames.DBT].min() / 5) + data_max = get_data_max(df[ColNames.DBT]) + data_min = get_data_min(df[ColNames.DBT]) var_range_x = [data_min, data_max] data_max = round(df[ColNames.HR].max(), 4) @@ -358,7 +361,7 @@ def update_psych_chart( if si_ip == UnitSystem.IP: for j in range(len(dbt_list)): - dbt_list_convert[j] = dbt_list_convert[j] * 1.8 + 32 + temperature(dbt_list_convert, j) fig.add_trace( go.Scatter( From 2be6e2d05b98daf6f141787579474009ecbada51 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Tue, 2 Sep 2025 18:08:30 +1000 Subject: [PATCH 3/9] style: format code using ruff --- Pipfile | 62 +++- Pipfile.lock | 548 +++++++++++++++++++++++------- pages/lib/charts_data_explorer.py | 1 - pages/lib/extract_df.py | 39 ++- pages/lib/template_graphs.py | 3 +- pages/lib/utils.py | 2 + pages/natural_ventilation.py | 2 - 7 files changed, 518 insertions(+), 139 deletions(-) diff --git a/Pipfile b/Pipfile index 9128883..6f6cf39 100644 --- a/Pipfile +++ b/Pipfile @@ -4,18 +4,66 @@ verify_ssl = true name = "pypi" [packages] -dash = "==2.15" -pvlib = "==0.9.1" -pythermalcomfort = "==2.9.1" +pre-commit = "*" +ansi2html = "==1.9.2" +black = "==25.1.0" +blinker = "==1.9.0" +bump2version = "==1.0.1" +cachelib = "==0.9.0" +certifi = "==2025.7.14" +charset-normalizer = "==3.4.2" +cleanpy = "==0.5.1" +click = "==8.2.1" +dash = "==2.15.0" dash-bootstrap-components = "==1.2.0" +dash-core-components = "==2.0.0" dash-extensions = "==1.0.7" +dash-html-components = "==2.0.0" +dash-iconify = "==0.1.2" dash-mantine-components = "==0.12.1" -requests = "==2.32.4" -plotly = "==5.18.0" -pandas = "==2.2.0" +dash-table = "==5.0.0" +dataclass-wizard = "==0.22.3" +editorconfig = "==0.17.1" +flask = "==2.3.3" +flask-caching = "==2.0.2" +h5py = "==3.14.0" +idna = "==3.10" +importlib-metadata = "==8.7.0" +iniconfig = "==2.1.0" +itsdangerous = "==2.2.0" +jinja2 = "==3.1.6" +jsbeautifier = "==1.15.4" +llvmlite = "==0.44.0" +markupsafe = "==3.0.2" +more-itertools = "==9.1.0" +mypy-extensions = "==1.1.0" +narwhals = "==2.0.1" +nest-asyncio = "==1.6.0" +numba = "==0.61.2" numpy = "==1.26.3" -dash-iconify = "*" +packaging = "==25.0" +pandas = "==2.2.0" +pathspec = "==0.12.1" +platformdirs = "==4.3.8" +plotly = "==5.18.0" +pluggy = "==1.6.0" +pvlib = "==0.9.1" +pygments = "==2.19.2" +pytest = "==8.4.1" +pythermalcomfort = "==2.9.1" +python-dateutil = "==2.9.0.post0" +pytz = "==2025.2" +requests = "==2.32.4" +retrying = "==1.4.1" +ruff = "==0.12.7" scipy = "==1.12.0" +six = "==1.17.0" +tenacity = "==9.1.2" +typing-extensions = "==4.14.1" +tzdata = "==2025.2" +urllib3 = "==2.5.0" +werkzeug = "==3.0.6" +zipp = "==3.23.0" [dev-packages] cleanpy = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 15c208f..72cd812 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "7214a1158f64483648ecff36a57b61b67020408e0f16770b77d7165a9d6f47e0" + "sha256": "341e878aaca3828643931f1288597cb2f6cc4aa34cb18972ac9d7954272df6c3" }, "pipfile-spec": 6, "requires": { @@ -16,131 +16,205 @@ ] }, "default": { + "ansi2html": { + "hashes": [ + "sha256:3453bf87535d37b827b05245faaa756dbab4ec3d69925e352b6319c3c955c0a5", + "sha256:dccb75aa95fb018e5d299be2b45f802952377abfdce0504c17a6ee6ef0a420c5" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.9.2" + }, + "black": { + "hashes": [ + "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", + "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", + "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", + "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", + "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", + "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", + "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", + "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", + "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", + "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", + "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", + "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", + "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", + "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", + "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", + "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", + "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", + "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", + "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", + "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", + "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", + "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==25.1.0" + }, "blinker": { "hashes": [ "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==1.9.0" }, + "bump2version": { + "hashes": [ + "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410", + "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6" + ], + "index": "pypi", + "markers": "python_version >= '3.5'", + "version": "==1.0.1" + }, "cachelib": { "hashes": [ "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5", "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3" ], + "index": "pypi", "markers": "python_version >= '3.7'", "version": "==0.9.0" }, "certifi": { "hashes": [ - "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", - "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5" + "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", + "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2025.8.3" + "version": "==2025.7.14" + }, + "cfgv": { + "hashes": [ + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" + ], + "markers": "python_version >= '3.8'", + "version": "==3.4.0" }, "charset-normalizer": { "hashes": [ - "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", - "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", - "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", - "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", - "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", - "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", - "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", - "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", - "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", - "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", - "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", - "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", - "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", - "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", - "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", - "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", - "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", - "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", - "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", - "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", - "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", - "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", - "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", - "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", - "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", - "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", - "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", - "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", - "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", - "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", - "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", - "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", - "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", - "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", - "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", - "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", - "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", - "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", - "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", - "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", - "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", - "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", - "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", - "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", - "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", - "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", - "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", - "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", - "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", - "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", - "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", - "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", - "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", - "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", - "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", - "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", - "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", - "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", - "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", - "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", - "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", - "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", - "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", - "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", - "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", - "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", - "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", - "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", - "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", - "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", - "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", - "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", - "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", - "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", - "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", - "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", - "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", - "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", - "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.4.3" + "version": "==3.4.2" + }, + "cleanpy": { + "hashes": [ + "sha256:9ddfa7ce80dd888b597a8b0bfeea3b69567839b6f41b775a4f76f46914d5170e", + "sha256:c60589d5da68527ca0c9151e28ed56fffae69df4ab6c9bfd8c1cf1d9e76a09b8" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.5.1" }, "click": { "hashes": [ "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" ], + "index": "pypi", "markers": "python_version >= '3.10'", "version": "==8.2.1" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, "dash": { "hashes": [ "sha256:d38891337fc855d5673f75e5346354daa063c4ff45a8a6a21f25e858fcae41c2", @@ -164,6 +238,7 @@ "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346", "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee" ], + "index": "pypi", "version": "==2.0.0" }, "dash-extensions": { @@ -180,6 +255,7 @@ "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50", "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63" ], + "index": "pypi", "version": "==2.0.0" }, "dash-iconify": { @@ -203,6 +279,7 @@ "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308", "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9" ], + "index": "pypi", "version": "==5.0.0" }, "dataclass-wizard": { @@ -210,21 +287,39 @@ "sha256:4c46591782265058f1148cfd1f54a3a91221e63986fdd04c9d59f4ced61f4424", "sha256:63751203e54b9b9349212cc185331da73c1adc99c51312575eb73bb5c00c1962" ], + "index": "pypi", "version": "==0.22.3" }, + "distlib": { + "hashes": [ + "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", + "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d" + ], + "version": "==0.4.0" + }, "editorconfig": { "hashes": [ "sha256:1eda9c2c0db8c16dbd50111b710572a5e6de934e39772de1959d41f64fc17c82", "sha256:23c08b00e8e08cc3adcddb825251c497478df1dada6aefeb01e626ad37303745" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==0.17.1" }, + "filelock": { + "hashes": [ + "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", + "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d" + ], + "markers": "python_version >= '3.9'", + "version": "==3.19.1" + }, "flask": { "hashes": [ "sha256:09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc", "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==2.3.3" }, @@ -233,6 +328,7 @@ "sha256:19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad", "sha256:24b60c552d59a9605cc1b6a42c56cdb39a82a28dab4532bbedb9222ae54ecb4e" ], + "index": "pypi", "markers": "python_version >= '3.7'", "version": "==2.0.2" }, @@ -265,14 +361,24 @@ "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088", "sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==3.14.0" }, + "identify": { + "hashes": [ + "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b", + "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32" + ], + "markers": "python_version >= '3.9'", + "version": "==2.6.13" + }, "idna": { "hashes": [ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], + "index": "pypi", "markers": "python_version >= '3.6'", "version": "==3.10" }, @@ -281,14 +387,25 @@ "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==8.7.0" }, + "iniconfig": { + "hashes": [ + "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", + "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.1.0" + }, "itsdangerous": { "hashes": [ "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==2.2.0" }, @@ -297,6 +414,7 @@ "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" ], + "index": "pypi", "markers": "python_version >= '3.7'", "version": "==3.1.6" }, @@ -305,6 +423,7 @@ "sha256:5bb18d9efb9331d825735fbc5360ee8f1aac5e52780042803943aa7f854f7592", "sha256:72f65de312a3f10900d7685557f84cb61a9733c50dcc27271a39f5b0051bf528" ], + "index": "pypi", "version": "==1.15.4" }, "llvmlite": { @@ -331,6 +450,7 @@ "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610" ], + "index": "pypi", "markers": "python_version >= '3.10'", "version": "==0.44.0" }, @@ -398,6 +518,7 @@ "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==3.0.2" }, @@ -406,17 +527,45 @@ "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d", "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3" ], + "index": "pypi", "markers": "python_version >= '3.7'", "version": "==9.1.0" }, + "mypy-extensions": { + "hashes": [ + "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", + "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.1.0" + }, + "narwhals": { + "hashes": [ + "sha256:235e61ca807bc21110ca36a4d53888ecc22c42dcdf50a7c886e10dde3fd7f38c", + "sha256:837457e36a2ba1710c881fb69e1f79ce44fb81728c92ac378f70892a53af8ddb" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==2.0.1" + }, "nest-asyncio": { "hashes": [ "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" ], + "index": "pypi", "markers": "python_version >= '3.5'", "version": "==1.6.0" }, + "nodeenv": { + "hashes": [ + "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", + "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.9.1" + }, "numba": { "hashes": [ "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", @@ -441,6 +590,7 @@ "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2" ], + "index": "pypi", "markers": "python_version >= '3.10'", "version": "==0.61.2" }, @@ -492,6 +642,7 @@ "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==25.0" }, @@ -531,6 +682,24 @@ "markers": "python_version >= '3.9'", "version": "==2.2.0" }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "platformdirs": { + "hashes": [ + "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", + "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==4.3.8" + }, "plotly": { "hashes": [ "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de", @@ -540,6 +709,24 @@ "markers": "python_version >= '3.6'", "version": "==5.18.0" }, + "pluggy": { + "hashes": [ + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==1.6.0" + }, + "pre-commit": { + "hashes": [ + "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", + "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==4.3.0" + }, "pvlib": { "hashes": [ "sha256:ead96f47898befd7728ab0b61b9747231008e151ef78a26d5e41d0b6a95a3a9d", @@ -549,6 +736,24 @@ "markers": "python_version >= '3.6'", "version": "==0.9.1" }, + "pygments": { + "hashes": [ + "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", + "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.19.2" + }, + "pytest": { + "hashes": [ + "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", + "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==8.4.1" + }, "pythermalcomfort": { "hashes": [ "sha256:607995f6920a03911c7b9fddd06d819db1fa6e658d742b4ec8395a2c90707da5", @@ -563,7 +768,8 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "pytz": { @@ -571,8 +777,68 @@ "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" ], + "index": "pypi", "version": "==2025.2" }, + "pyyaml": { + "hashes": [ + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" + ], + "markers": "python_version >= '3.8'", + "version": "==6.0.2" + }, "requests": { "hashes": [ "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", @@ -584,11 +850,37 @@ }, "retrying": { "hashes": [ - "sha256:bbc004aeb542a74f3569aeddf42a2516efefcdaff90df0eb38fbfbf19f179f59", - "sha256:d102e75d53d8d30b88562d45361d6c6c934da06fab31bd81c0420acb97a8ba39" + "sha256:4d206e0ed2aff5ef2f3cd867abb9511e9e8f31127c5aca20f1d5246e476903b0", + "sha256:d736050c1adfc0a71fa022d9198ee130b0e66be318678a3fdd8b1b8872dc0997" ], + "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==1.4.2" + "version": "==1.4.1" + }, + "ruff": { + "hashes": [ + "sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606", + "sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71", + "sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3", + "sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860", + "sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa", + "sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c", + "sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb", + "sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e", + "sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5", + "sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd", + "sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303", + "sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb", + "sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f", + "sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4", + "sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423", + "sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77", + "sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69", + "sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==0.12.7" }, "scipy": { "hashes": [ @@ -635,7 +927,8 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "tenacity": { @@ -643,6 +936,7 @@ "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==9.1.2" }, @@ -651,6 +945,7 @@ "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==4.14.1" }, @@ -659,6 +954,7 @@ "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9" ], + "index": "pypi", "markers": "python_version >= '2'", "version": "==2025.2" }, @@ -667,14 +963,24 @@ "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==2.5.0" }, + "virtualenv": { + "hashes": [ + "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", + "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a" + ], + "markers": "python_version >= '3.8'", + "version": "==20.34.0" + }, "werkzeug": { "hashes": [ "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17", "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==3.0.6" }, @@ -683,6 +989,7 @@ "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==3.23.0" } @@ -748,6 +1055,7 @@ "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" ], + "index": "pypi", "markers": "python_version >= '3.10'", "version": "==8.2.1" }, @@ -779,6 +1087,7 @@ "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==2.1.0" }, @@ -787,6 +1096,7 @@ "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==1.1.0" }, @@ -803,6 +1113,7 @@ "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==25.0" }, @@ -811,6 +1122,7 @@ "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==0.12.1" }, @@ -819,6 +1131,7 @@ "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==4.3.8" }, @@ -827,6 +1140,7 @@ "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==1.6.0" }, @@ -844,6 +1158,7 @@ "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" ], + "index": "pypi", "markers": "python_version >= '3.8'", "version": "==2.19.2" }, @@ -917,29 +1232,28 @@ }, "ruff": { "hashes": [ - "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", - "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", - "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", - "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", - "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", - "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", - "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", - "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", - "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", - "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", - "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", - "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", - "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", - "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", - "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", - "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", - "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", - "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", - "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e" + "sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606", + "sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71", + "sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3", + "sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860", + "sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa", + "sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c", + "sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb", + "sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e", + "sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5", + "sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd", + "sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303", + "sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb", + "sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f", + "sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4", + "sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423", + "sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77", + "sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69", + "sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.12.9" + "version": "==0.12.7" }, "virtualenv": { "hashes": [ diff --git a/pages/lib/charts_data_explorer.py b/pages/lib/charts_data_explorer.py index 848152f..c9fdbb2 100644 --- a/pages/lib/charts_data_explorer.py +++ b/pages/lib/charts_data_explorer.py @@ -1,5 +1,4 @@ import numpy as np -import math import plotly.express as px import plotly.graph_objects as go from pages.lib.utils import ( diff --git a/pages/lib/extract_df.py b/pages/lib/extract_df.py index 9968108..2807db2 100644 --- a/pages/lib/extract_df.py +++ b/pages/lib/extract_df.py @@ -76,14 +76,17 @@ def get_location_info(lst, file_name): return location_info + # ==== Unified UTCI computation and binning ==== -UTCI_BINS = [-999, -40, -27, -13, 0, 9, 26, 32, 38, 46, 999] +UTCI_BINS = [-999, -40, -27, -13, 0, 9, 26, 32, 38, 46, 999] UTCI_LABELS = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] + def utci_calc(df: pd.DataFrame, t_air_col, t_rad_col, wind_col, rh_col=ColNames.RH): """Call utci() using values from df columns.""" return utci(df[t_air_col], df[t_rad_col], df[wind_col], df[rh_col]) + def add_utci_variants(df: pd.DataFrame) -> pd.DataFrame: """ Generate the four UTCI variants: @@ -93,22 +96,35 @@ def add_utci_variants(df: pd.DataFrame) -> pd.DataFrame: - Sun_noWind : DBT + MRT + wind_speed_utci_0 """ recipes = { - ColNames.UTCI_NO_SUN_WIND: (ColNames.DBT, ColNames.DBT, ColNames.WIND_SPEED_UTCI), - ColNames.UTCI_NO_SUN_NO_WIND: (ColNames.DBT, ColNames.DBT, ColNames.WIND_SPEED_UTCI_0), - ColNames.UTCI_SUN_WIND: (ColNames.DBT, ColNames.MRT, ColNames.WIND_SPEED_UTCI), - ColNames.UTCI_SUN_NO_WIND: (ColNames.DBT, ColNames.MRT, ColNames.WIND_SPEED_UTCI_0), + ColNames.UTCI_NO_SUN_WIND: ( + ColNames.DBT, + ColNames.DBT, + ColNames.WIND_SPEED_UTCI, + ), + ColNames.UTCI_NO_SUN_NO_WIND: ( + ColNames.DBT, + ColNames.DBT, + ColNames.WIND_SPEED_UTCI_0, + ), + ColNames.UTCI_SUN_WIND: (ColNames.DBT, ColNames.MRT, ColNames.WIND_SPEED_UTCI), + ColNames.UTCI_SUN_NO_WIND: ( + ColNames.DBT, + ColNames.MRT, + ColNames.WIND_SPEED_UTCI_0, + ), } for out_col, (t_air, t_rad, wind) in recipes.items(): df[out_col] = utci_calc(df, t_air, t_rad, wind) return df + def add_utci_categories(df: pd.DataFrame) -> pd.DataFrame: """Bin the four UTCI columns into categories.""" mapping = { - ColNames.UTCI_NO_SUN_WIND: ColNames.UTCI_NOSUN_WIND_CATEGORIES, + ColNames.UTCI_NO_SUN_WIND: ColNames.UTCI_NOSUN_WIND_CATEGORIES, ColNames.UTCI_NO_SUN_NO_WIND: ColNames.UTCI_NOSUN_NOWIND_CATEGORIES, - ColNames.UTCI_SUN_WIND: ColNames.UTCI_SUN_WIND_CATEGORIES, - ColNames.UTCI_SUN_NO_WIND: ColNames.UTCI_SUN_NOWIND_CATEGORIES, + ColNames.UTCI_SUN_WIND: ColNames.UTCI_SUN_WIND_CATEGORIES, + ColNames.UTCI_SUN_NO_WIND: ColNames.UTCI_SUN_NOWIND_CATEGORIES, } for src_col, dst_col in mapping.items(): df[dst_col] = pd.cut(x=df[src_col], bins=UTCI_BINS, labels=UTCI_LABELS) @@ -318,12 +334,11 @@ def create_df(lst, file_name): epw_df[ColNames.WIND_SPEED_UTCI_0] = epw_df[ColNames.WIND_SPEED_UTCI].mask( epw_df[ColNames.WIND_SPEED_UTCI] >= 0, 0.5 ) - + epw_df = add_utci_variants(epw_df) epw_df = add_utci_categories(epw_df) - # Add psy values ta_rh = np.vectorize(psy.psy_ta_rh)(epw_df[ColNames.DBT], epw_df[ColNames.RH]) psy_df = pd.DataFrame.from_records(ta_rh) @@ -426,8 +441,10 @@ def convert_data(df, mapping_json): conversion_function(df, key) return json.dumps(mapping_dict) + def check_value(value, hours=8760): - return [value] * hours + return [value] * hours + if __name__ == "__main__": # fmt: off diff --git a/pages/lib/template_graphs.py b/pages/lib/template_graphs.py index d978d10..bca80de 100644 --- a/pages/lib/template_graphs.py +++ b/pages/lib/template_graphs.py @@ -845,8 +845,8 @@ def barchart(df, var, time_filter_info, data_filter_info, normalize, si_ip): ) return fig -def time_filtering(df, start_time, end_time, time_col, target_col): +def time_filtering(df, start_time, end_time, time_col, target_col): if start_time <= end_time: mask = (df[time_col] < start_time) | (df[time_col] > end_time) else: @@ -854,6 +854,7 @@ def time_filtering(df, start_time, end_time, time_col, target_col): df.loc[mask, target_col] = None return df + def filter_df_by_month_and_hour( df, time_filter, month, hour, invert_month, invert_hour, var ): diff --git a/pages/lib/utils.py b/pages/lib/utils.py index 505d740..7368e7a 100644 --- a/pages/lib/utils.py +++ b/pages/lib/utils.py @@ -291,8 +291,10 @@ def dropdown(options=None, **kwargs): **kwargs, ) + def get_data_max(series, base=5): return base * math.ceil(series.max() / base) + def get_data_min(series, base=5): return base * math.floor(series.min() / base) diff --git a/pages/natural_ventilation.py b/pages/natural_ventilation.py index 5fa8190..919143a 100644 --- a/pages/natural_ventilation.py +++ b/pages/natural_ventilation.py @@ -1,5 +1,3 @@ -import math - import dash from dash import dcc, html import dash_bootstrap_components as dbc From f7edaf350a18e40892c9d34b19622696e2604780 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Tue, 2 Sep 2025 18:41:55 +1000 Subject: [PATCH 4/9] docs: remove duplicated code style section in contributing.md --- docs/contributing/contributing.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md index 2f9007e..3018a69 100644 --- a/docs/contributing/contributing.md +++ b/docs/contributing/contributing.md @@ -98,25 +98,6 @@ More information about pre-commit hooks can be found [here](https://pre-commit.c Install Black: -We use ruff to enforce the code style and code formatting. You can run it with: - -```bash -pipenv run ruff check . -pipenv run ruff format . -``` - -To ensure that the code is formatted correctly, we use a pre-commit hook that runs Ruff before every commit. -Run the following once to enable hooks in your local repo: - -```bash -pipenv run pre-commit install -# optional: run on all files -pipenv run pre-commit run --all-files -``` - -Hence, you will need to make sure that the code is formatted correctly before committing your changes; otherwise, the commit will fail. -More information about pre-commit hooks can be found [here](https://pre-commit.com/). - ```bash pipenv install black ``` From 1c55ec72b9822e5ceb9a130f00e8c8a9ae185bd3 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Wed, 3 Sep 2025 15:47:02 +1000 Subject: [PATCH 5/9] refactor: Rename functions and add docstrings/type hints for clarity --- Pipfile | 67 +--- Pipfile.lock | 497 ++++++------------------------ pages/lib/charts_data_explorer.py | 11 +- pages/lib/charts_sun.py | 11 +- pages/lib/extract_df.py | 25 +- pages/lib/template_graphs.py | 46 ++- pages/lib/utils.py | 15 +- pages/natural_ventilation.py | 8 +- pages/psy-chart.py | 8 +- 9 files changed, 167 insertions(+), 521 deletions(-) diff --git a/Pipfile b/Pipfile index 6f6cf39..d6f89d9 100644 --- a/Pipfile +++ b/Pipfile @@ -4,73 +4,20 @@ verify_ssl = true name = "pypi" [packages] -pre-commit = "*" -ansi2html = "==1.9.2" -black = "==25.1.0" -blinker = "==1.9.0" -bump2version = "==1.0.1" -cachelib = "==0.9.0" -certifi = "==2025.7.14" -charset-normalizer = "==3.4.2" -cleanpy = "==0.5.1" -click = "==8.2.1" -dash = "==2.15.0" +dash = "==2.15" +pvlib = "==0.9.1" +pythermalcomfort = "==2.9.1" dash-bootstrap-components = "==1.2.0" -dash-core-components = "==2.0.0" dash-extensions = "==1.0.7" -dash-html-components = "==2.0.0" -dash-iconify = "==0.1.2" dash-mantine-components = "==0.12.1" -dash-table = "==5.0.0" -dataclass-wizard = "==0.22.3" -editorconfig = "==0.17.1" -flask = "==2.3.3" -flask-caching = "==2.0.2" -h5py = "==3.14.0" -idna = "==3.10" -importlib-metadata = "==8.7.0" -iniconfig = "==2.1.0" -itsdangerous = "==2.2.0" -jinja2 = "==3.1.6" -jsbeautifier = "==1.15.4" -llvmlite = "==0.44.0" -markupsafe = "==3.0.2" -more-itertools = "==9.1.0" -mypy-extensions = "==1.1.0" -narwhals = "==2.0.1" -nest-asyncio = "==1.6.0" -numba = "==0.61.2" -numpy = "==1.26.3" -packaging = "==25.0" -pandas = "==2.2.0" -pathspec = "==0.12.1" -platformdirs = "==4.3.8" -plotly = "==5.18.0" -pluggy = "==1.6.0" -pvlib = "==0.9.1" -pygments = "==2.19.2" -pytest = "==8.4.1" -pythermalcomfort = "==2.9.1" -python-dateutil = "==2.9.0.post0" -pytz = "==2025.2" requests = "==2.32.4" -retrying = "==1.4.1" -ruff = "==0.12.7" +plotly = "==5.18.0" +pandas = "==2.2.0" +numpy = "==1.26.3" +dash-iconify = "*" scipy = "==1.12.0" -six = "==1.17.0" -tenacity = "==9.1.2" -typing-extensions = "==4.14.1" -tzdata = "==2025.2" -urllib3 = "==2.5.0" -werkzeug = "==3.0.6" -zipp = "==3.23.0" [dev-packages] -cleanpy = "*" -pytest = "*" -bump2version = "*" -black = "*" -ruff = "*" pre-commit = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index 72cd812..3b8b17e 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "341e878aaca3828643931f1288597cb2f6cc4aa34cb18972ac9d7954272df6c3" + "sha256": "4fe266b227936bffb73552e6657f642511470c74fa9f3236f6eb0b6c2e7b095c" }, "pipfile-spec": 6, "requires": { @@ -59,7 +59,6 @@ "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==1.9.0" }, @@ -77,18 +76,16 @@ "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5", "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==0.9.0" }, "certifi": { "hashes": [ - "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", - "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995" + "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", + "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5" ], - "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2025.7.14" + "version": "==2025.8.3" }, "cfgv": { "hashes": [ @@ -100,102 +97,88 @@ }, "charset-normalizer": { "hashes": [ - "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", - "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", - "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", - "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", - "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", - "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", - "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", - "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", - "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", - "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", - "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", - "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", - "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", - "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", - "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", - "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", - "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", - "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", - "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", - "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", - "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", - "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", - "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", - "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", - "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", - "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", - "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", - "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", - "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", - "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", - "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", - "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", - "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", - "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", - "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", - "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", - "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", - "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", - "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", - "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", - "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", - "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", - "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", - "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", - "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", - "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", - "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", - "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", - "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", - "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", - "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", - "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", - "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", - "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", - "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", - "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", - "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", - "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", - "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", - "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", - "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", - "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", - "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", - "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", - "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", - "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", - "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", - "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", - "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", - "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", - "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", - "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", - "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", - "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", - "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", - "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", - "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", - "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", - "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", - "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", - "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", - "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", - "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", - "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", - "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", - "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", - "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", - "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", - "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", - "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", - "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", - "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" + "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", + "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", + "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", + "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", + "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", + "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", + "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", + "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", + "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", + "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", + "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", + "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", + "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", + "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", + "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", + "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", + "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", + "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", + "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", + "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", + "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", + "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", + "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", + "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", + "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", + "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", + "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", + "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", + "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", + "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", + "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", + "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", + "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", + "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", + "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", + "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", + "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", + "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", + "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", + "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", + "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", + "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", + "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", + "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", + "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", + "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", + "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", + "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", + "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", + "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", + "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", + "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", + "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", + "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", + "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", + "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", + "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", + "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", + "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", + "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", + "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", + "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", + "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", + "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", + "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", + "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", + "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", + "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", + "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", + "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", + "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", + "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", + "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", + "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", + "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", + "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", + "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", + "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", + "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" ], - "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.4.2" + "version": "==3.4.3" }, "cleanpy": { "hashes": [ @@ -211,7 +194,6 @@ "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" ], - "index": "pypi", "markers": "python_version >= '3.10'", "version": "==8.2.1" }, @@ -238,7 +220,6 @@ "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346", "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee" ], - "index": "pypi", "version": "==2.0.0" }, "dash-extensions": { @@ -255,7 +236,6 @@ "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50", "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63" ], - "index": "pypi", "version": "==2.0.0" }, "dash-iconify": { @@ -279,7 +259,6 @@ "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308", "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9" ], - "index": "pypi", "version": "==5.0.0" }, "dataclass-wizard": { @@ -287,7 +266,6 @@ "sha256:4c46591782265058f1148cfd1f54a3a91221e63986fdd04c9d59f4ced61f4424", "sha256:63751203e54b9b9349212cc185331da73c1adc99c51312575eb73bb5c00c1962" ], - "index": "pypi", "version": "==0.22.3" }, "distlib": { @@ -302,7 +280,6 @@ "sha256:1eda9c2c0db8c16dbd50111b710572a5e6de934e39772de1959d41f64fc17c82", "sha256:23c08b00e8e08cc3adcddb825251c497478df1dada6aefeb01e626ad37303745" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==0.17.1" }, @@ -319,7 +296,6 @@ "sha256:09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc", "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b" ], - "index": "pypi", "markers": "python_version >= '3.8'", "version": "==2.3.3" }, @@ -328,7 +304,6 @@ "sha256:19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad", "sha256:24b60c552d59a9605cc1b6a42c56cdb39a82a28dab4532bbedb9222ae54ecb4e" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==2.0.2" }, @@ -361,7 +336,6 @@ "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088", "sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==3.14.0" }, @@ -378,7 +352,6 @@ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], - "index": "pypi", "markers": "python_version >= '3.6'", "version": "==3.10" }, @@ -387,7 +360,6 @@ "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==8.7.0" }, @@ -405,7 +377,6 @@ "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" ], - "index": "pypi", "markers": "python_version >= '3.8'", "version": "==2.2.0" }, @@ -414,7 +385,6 @@ "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==3.1.6" }, @@ -423,7 +393,6 @@ "sha256:5bb18d9efb9331d825735fbc5360ee8f1aac5e52780042803943aa7f854f7592", "sha256:72f65de312a3f10900d7685557f84cb61a9733c50dcc27271a39f5b0051bf528" ], - "index": "pypi", "version": "==1.15.4" }, "llvmlite": { @@ -450,7 +419,6 @@ "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610" ], - "index": "pypi", "markers": "python_version >= '3.10'", "version": "==0.44.0" }, @@ -518,7 +486,6 @@ "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==3.0.2" }, @@ -527,7 +494,6 @@ "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d", "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==9.1.0" }, @@ -554,7 +520,6 @@ "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" ], - "index": "pypi", "markers": "python_version >= '3.5'", "version": "==1.6.0" }, @@ -590,7 +555,6 @@ "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2" ], - "index": "pypi", "markers": "python_version >= '3.10'", "version": "==0.61.2" }, @@ -642,7 +606,6 @@ "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], - "index": "pypi", "markers": "python_version >= '3.8'", "version": "==25.0" }, @@ -768,7 +731,6 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, @@ -777,7 +739,6 @@ "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" ], - "index": "pypi", "version": "==2025.2" }, "pyyaml": { @@ -850,12 +811,11 @@ }, "retrying": { "hashes": [ - "sha256:4d206e0ed2aff5ef2f3cd867abb9511e9e8f31127c5aca20f1d5246e476903b0", - "sha256:d736050c1adfc0a71fa022d9198ee130b0e66be318678a3fdd8b1b8872dc0997" + "sha256:bbc004aeb542a74f3569aeddf42a2516efefcdaff90df0eb38fbfbf19f179f59", + "sha256:d102e75d53d8d30b88562d45361d6c6c934da06fab31bd81c0420acb97a8ba39" ], - "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==1.4.1" + "version": "==1.4.2" }, "ruff": { "hashes": [ @@ -927,7 +887,6 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, @@ -936,25 +895,22 @@ "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==9.1.2" }, "typing-extensions": { "hashes": [ - "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", - "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" + "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", + "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" ], - "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==4.14.1" + "version": "==4.15.0" }, "tzdata": { "hashes": [ "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9" ], - "index": "pypi", "markers": "python_version >= '2'", "version": "==2025.2" }, @@ -963,7 +919,6 @@ "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==2.5.0" }, @@ -980,7 +935,6 @@ "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17", "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d" ], - "index": "pypi", "markers": "python_version >= '3.8'", "version": "==3.0.6" }, @@ -989,279 +943,8 @@ "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" ], - "index": "pypi", "markers": "python_version >= '3.9'", "version": "==3.23.0" } - }, - "develop": { - "black": { - "hashes": [ - "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", - "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", - "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", - "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", - "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", - "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", - "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", - "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", - "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", - "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", - "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", - "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", - "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", - "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", - "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", - "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", - "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", - "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", - "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", - "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", - "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", - "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==25.1.0" - }, - "bump2version": { - "hashes": [ - "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410", - "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6" - ], - "index": "pypi", - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cleanpy": { - "hashes": [ - "sha256:9ddfa7ce80dd888b597a8b0bfeea3b69567839b6f41b775a4f76f46914d5170e", - "sha256:c60589d5da68527ca0c9151e28ed56fffae69df4ab6c9bfd8c1cf1d9e76a09b8" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==0.5.1" - }, - "click": { - "hashes": [ - "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", - "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==8.2.1" - }, - "distlib": { - "hashes": [ - "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", - "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d" - ], - "version": "==0.4.0" - }, - "filelock": { - "hashes": [ - "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", - "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d" - ], - "markers": "python_version >= '3.9'", - "version": "==3.19.1" - }, - "identify": { - "hashes": [ - "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b", - "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.13" - }, - "iniconfig": { - "hashes": [ - "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", - "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.1.0" - }, - "mypy-extensions": { - "hashes": [ - "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", - "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.1.0" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "packaging": { - "hashes": [ - "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", - "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==25.0" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "platformdirs": { - "hashes": [ - "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", - "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==4.3.8" - }, - "pluggy": { - "hashes": [ - "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", - "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.6.0" - }, - "pre-commit": { - "hashes": [ - "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", - "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==4.3.0" - }, - "pygments": { - "hashes": [ - "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", - "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.19.2" - }, - "pytest": { - "hashes": [ - "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", - "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==8.4.1" - }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.2" - }, - "ruff": { - "hashes": [ - "sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606", - "sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71", - "sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3", - "sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860", - "sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa", - "sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c", - "sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb", - "sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e", - "sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5", - "sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd", - "sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303", - "sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb", - "sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f", - "sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4", - "sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423", - "sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77", - "sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69", - "sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==0.12.7" - }, - "virtualenv": { - "hashes": [ - "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", - "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a" - ], - "markers": "python_version >= '3.8'", - "version": "==20.34.0" - } } } diff --git a/pages/lib/charts_data_explorer.py b/pages/lib/charts_data_explorer.py index c9fdbb2..4101271 100644 --- a/pages/lib/charts_data_explorer.py +++ b/pages/lib/charts_data_explorer.py @@ -1,10 +1,7 @@ import numpy as np import plotly.express as px import plotly.graph_objects as go -from pages.lib.utils import ( - get_data_max, - get_data_min, -) +from pages.lib.utils import get_max_min_value from pages.lib.global_scheme import template, mapping_dictionary, month_lst from pages.lib.global_column_names import ColNames @@ -44,8 +41,7 @@ def custom_heatmap(df, global_local, var, time_filter_info, data_filter_info, si range_z = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_z = [data_min, data_max] title = var_name + " (" + var_unit + ")" @@ -122,8 +118,7 @@ def three_var_graph( if global_local != "global": # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) var_range = [data_min, data_max] color_scale = var_color diff --git a/pages/lib/charts_sun.py b/pages/lib/charts_sun.py index 309fec1..9bd9747 100644 --- a/pages/lib/charts_sun.py +++ b/pages/lib/charts_sun.py @@ -6,10 +6,7 @@ import plotly.graph_objects as go from config import UnitSystem -from pages.lib.utils import ( - get_data_max, - get_data_min, -) +from pages.lib.utils import get_max_min_value from pages.lib.global_scheme import ( template, mapping_dictionary, @@ -139,8 +136,7 @@ def polar_graph(df, meta, global_local, var, si_ip): range_z = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(solpos[var]) - data_min = get_data_min(solpos[var]) + data_max, data_min = get_max_min_value(solpos[var]) range_z = [data_min, data_max] tz = "UTC" @@ -352,8 +348,7 @@ def custom_cartesian_solar(df, meta, global_local, var, si_ip): range_z = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_z = [data_min, data_max] if var == "None": diff --git a/pages/lib/extract_df.py b/pages/lib/extract_df.py index 2807db2..b91b740 100644 --- a/pages/lib/extract_df.py +++ b/pages/lib/extract_df.py @@ -295,14 +295,14 @@ def create_df(lst, file_name): # Add in UTCI sol_altitude = epw_df[ColNames.ELEVATION].mask(epw_df[ColNames.ELEVATION] <= 0, 0) - sharp = check_value(45) + sharp = expand_to_hours(45) sol_radiation_dir = epw_df[ColNames.DIR_NOR_RAD] - sol_transmittance = check_value(1) # CHECK VALUE - f_svv = check_value(1) # CHECK VALUE - f_bes = check_value(1) # CHECK VALUE - asw = check_value(0.7) # CHECK VALUE - posture = check_value("standing") - floor_reflectance = check_value(0.6) # EXPOSE AS A VARIABLE? + sol_transmittance = expand_to_hours(1) # CHECK VALUE + f_svv = expand_to_hours(1) # CHECK VALUE + f_bes = expand_to_hours(1) # CHECK VALUE + asw = expand_to_hours(0.7) # CHECK VALUE + posture = expand_to_hours("standing") + floor_reflectance = expand_to_hours(0.6) # EXPOSE AS A VARIABLE? mrt = np.vectorize(solar_gain)( sol_altitude, @@ -442,7 +442,16 @@ def convert_data(df, mapping_json): return json.dumps(mapping_dict) -def check_value(value, hours=8760): +def expand_to_hours(value, hours=8760): + """Return a list with the input value repeated for a given number of hours. + + Args: + value: The value to repeat. + hours: Number of repetitions. Defaults to 8760 (hours in a year). + + Returns: + A list containing the value repeated `hours` times. + """ return [value] * hours diff --git a/pages/lib/template_graphs.py b/pages/lib/template_graphs.py index bca80de..216f0fa 100644 --- a/pages/lib/template_graphs.py +++ b/pages/lib/template_graphs.py @@ -4,10 +4,7 @@ from plotly.subplots import make_subplots from config import UnitSystem -from pages.lib.utils import ( - get_data_max, - get_data_min, -) +from pages.lib.utils import get_max_min_value from pages.lib.global_scheme import mapping_dictionary import dash_bootstrap_components as dbc from .global_scheme import month_lst, template, tight_margins @@ -27,8 +24,7 @@ def violin(df, var, global_local, si_ip): data_night = df.loc[mask_night, var] if global_local != "global": - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) var_range = [data_min, data_max] fig = go.Figure() @@ -97,8 +93,7 @@ def yearly_profile(df, var, global_local, si_ip): range_y = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_y = [data_min, data_max] var_single_color = var_color[len(var_color) // 2] @@ -257,8 +252,7 @@ def daily_profile(df, var, global_local, si_ip): range_y = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_y = [data_min, data_max] var_single_color = var_color[len(var_color) // 2] @@ -373,8 +367,7 @@ def heatmap_with_filter( range_z = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_z = [data_min, data_max] fig = go.Figure( data=go.Heatmap( @@ -432,8 +425,7 @@ def heatmap(df, var, global_local, si_ip): range_z = var_range else: # Set maximum and minimum according to data - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_z = [data_min, data_max] fig = go.Figure( data=go.Heatmap( @@ -847,6 +839,18 @@ def barchart(df, var, time_filter_info, data_filter_info, normalize, si_ip): def time_filtering(df, start_time, end_time, time_col, target_col): + """Mask values in the target column based on the given time range. + + Args: + df: Input dataframe. + start_time: Start of the time range. + end_time: End of the time range. + time_col: Column name representing time (e.g., hour or month). + target_col: Column name to apply the mask on. + + Returns: + A modified DataFrame with masked values outside the given time range. + """ if start_time <= end_time: mask = (df[time_col] < start_time) | (df[time_col] > end_time) else: @@ -858,6 +862,20 @@ def time_filtering(df, start_time, end_time, time_col, target_col): def filter_df_by_month_and_hour( df, time_filter, month, hour, invert_month, invert_hour, var ): + """Apply month and hour filtering to the DataFrame based on user selections. + + Args: + df: Input DataFrame. + time_filter: Whether to apply the time filter. + month: Selected month range. + hour: Selected hour range. + invert_month: Whether to invert the month range. + invert_hour: Whether to invert the hour range. + var: Target variable column name. + + Returns: + Filtered DataFrame with appropriate masking applied. + """ start_month, end_month, start_hour, end_hour = determine_month_and_hour_filter( month, hour, invert_month, invert_hour ) diff --git a/pages/lib/utils.py b/pages/lib/utils.py index 7368e7a..8671ba7 100644 --- a/pages/lib/utils.py +++ b/pages/lib/utils.py @@ -292,9 +292,16 @@ def dropdown(options=None, **kwargs): ) -def get_data_max(series, base=5): - return base * math.ceil(series.max() / base) +def get_max_min_value(series, base=5): + """Calculate rounded-up max and rounded-down min values based on a base step. + Args: + series: Pandas Series of numeric values. + base: The rounding base. Default is 5. -def get_data_min(series, base=5): - return base * math.floor(series.min() / base) + Returns: + Tuple of (max_value, min_value) adjusted to nearest base step. + """ + data_max = base * math.ceil(series.max() / base) + data_min = base * math.floor(series.min() / base) + return data_max, data_min diff --git a/pages/natural_ventilation.py b/pages/natural_ventilation.py index 919143a..ee002e2 100644 --- a/pages/natural_ventilation.py +++ b/pages/natural_ventilation.py @@ -15,10 +15,7 @@ container_row_center_full, container_col_center_one_of_three, ) -from pages.lib.utils import ( - get_data_max, - get_data_min, -) +from pages.lib.utils import get_max_min_value from pages.lib.template_graphs import filter_df_by_month_and_hour from pages.lib.global_column_names import ColNames from pages.lib.global_element_ids import ElementIds @@ -375,8 +372,7 @@ def nv_heatmap( if global_local == "global": range_z = var_range else: - data_max = get_data_max(df[var]) - data_min = get_data_min(df[var]) + data_max, data_min = get_max_min_value(df[var]) range_z = [data_min, data_max] title = ( diff --git a/pages/psy-chart.py b/pages/psy-chart.py index dc56c85..c38e7b1 100644 --- a/pages/psy-chart.py +++ b/pages/psy-chart.py @@ -10,10 +10,7 @@ from pythermalcomfort import psychrometrics as psy from config import PageUrls, DocLinks, PageInfo, UnitSystem -from pages.lib.utils import ( - get_data_max, - get_data_min, -) +from pages.lib.utils import get_max_min_value from pages.lib.extract_df import temperature from pages.lib.global_element_ids import ElementIds from pages.lib.global_column_names import ColNames @@ -324,8 +321,7 @@ def update_psych_chart( else: # Set maximum and minimum according to data - data_max = get_data_max(df[ColNames.DBT]) - data_min = get_data_min(df[ColNames.DBT]) + data_max, data_min = get_max_min_value(df[ColNames.DBT]) var_range_x = [data_min, data_max] data_max = round(df[ColNames.HR].max(), 4) From d373c5e6b2c152006e3ecc2e8a80c651db23f622 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Wed, 3 Sep 2025 16:57:59 +1000 Subject: [PATCH 6/9] refactor: Add convert_t_to_f as alias to temperature with docstring --- pages/lib/extract_df.py | 23 ++++++++++++++++++----- pages/psy-chart.py | 4 ++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/pages/lib/extract_df.py b/pages/lib/extract_df.py index b91b740..066b9db 100644 --- a/pages/lib/extract_df.py +++ b/pages/lib/extract_df.py @@ -426,11 +426,11 @@ def enthalpy(df, name): def convert_data(df, mapping_json): - temperature(df, ColNames.ADAPTIVE_COMFORT) - temperature(df, ColNames.ADAPTIVE_CMF_80_LOW) - temperature(df, ColNames.ADAPTIVE_CMF_80_UP) - temperature(df, ColNames.ADAPTIVE_CMF_90_LOW) - temperature(df, ColNames.ADAPTIVE_CMF_90_UP) + convert_t_to_f(df, ColNames.ADAPTIVE_COMFORT) + convert_t_to_f(df, ColNames.ADAPTIVE_CMF_80_LOW) + convert_t_to_f(df, ColNames.ADAPTIVE_CMF_80_UP) + convert_t_to_f(df, ColNames.ADAPTIVE_CMF_90_LOW) + convert_t_to_f(df, ColNames.ADAPTIVE_CMF_90_UP) mapping_dict = json.loads(mapping_json) for key in json.loads(mapping_json): @@ -442,6 +442,19 @@ def convert_data(df, mapping_json): return json.dumps(mapping_dict) +def convert_t_to_f(df, name): + """Convert temperature from Celsius to Fahrenheit in-place for a given column. + + Args: + df: The DataFrame containing the temperature column. + name: Column name to convert. + + Returns: + None. The DataFrame is modified in-place. + """ + df[name] = df[name] * 1.8 + 32 + + def expand_to_hours(value, hours=8760): """Return a list with the input value repeated for a given number of hours. diff --git a/pages/psy-chart.py b/pages/psy-chart.py index c38e7b1..7cf0dfb 100644 --- a/pages/psy-chart.py +++ b/pages/psy-chart.py @@ -11,7 +11,7 @@ from config import PageUrls, DocLinks, PageInfo, UnitSystem from pages.lib.utils import get_max_min_value -from pages.lib.extract_df import temperature +from pages.lib.extract_df import convert_t_to_f from pages.lib.global_element_ids import ElementIds from pages.lib.global_column_names import ColNames from pages.lib.global_id_buttons import IdButtons @@ -357,7 +357,7 @@ def update_psych_chart( if si_ip == UnitSystem.IP: for j in range(len(dbt_list)): - temperature(dbt_list_convert, j) + convert_t_to_f(dbt_list_convert, j) fig.add_trace( go.Scatter( From 6570dc7bb302784bebe5fe3267afa0801422b0f9 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Thu, 4 Sep 2025 19:49:35 +1000 Subject: [PATCH 7/9] deps: restore dev dependencies in Pipfile --- Pipfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Pipfile b/Pipfile index d6f89d9..9128883 100644 --- a/Pipfile +++ b/Pipfile @@ -18,6 +18,11 @@ dash-iconify = "*" scipy = "==1.12.0" [dev-packages] +cleanpy = "*" +pytest = "*" +bump2version = "*" +black = "*" +ruff = "*" pre-commit = "*" [requires] From a6460a6a6007f6d80e919b3e348887e3df43c1c5 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Thu, 4 Sep 2025 20:12:23 +1000 Subject: [PATCH 8/9] refactor: add type annotations to utility functions --- pages/lib/extract_df.py | 12 +++++++++--- pages/lib/template_graphs.py | 4 +++- pages/lib/utils.py | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pages/lib/extract_df.py b/pages/lib/extract_df.py index 066b9db..81cdda5 100644 --- a/pages/lib/extract_df.py +++ b/pages/lib/extract_df.py @@ -82,7 +82,13 @@ def get_location_info(lst, file_name): UTCI_LABELS = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] -def utci_calc(df: pd.DataFrame, t_air_col, t_rad_col, wind_col, rh_col=ColNames.RH): +def utci_calc( + df: pd.DataFrame, + t_air_col: str, + t_rad_col: str, + wind_col: str, + rh_col: str = ColNames.RH, +) -> pd.Series: """Call utci() using values from df columns.""" return utci(df[t_air_col], df[t_rad_col], df[wind_col], df[rh_col]) @@ -442,7 +448,7 @@ def convert_data(df, mapping_json): return json.dumps(mapping_dict) -def convert_t_to_f(df, name): +def convert_t_to_f(df: pd.DataFrame, name: str): """Convert temperature from Celsius to Fahrenheit in-place for a given column. Args: @@ -455,7 +461,7 @@ def convert_t_to_f(df, name): df[name] = df[name] * 1.8 + 32 -def expand_to_hours(value, hours=8760): +def expand_to_hours(value: any, hours: int = 8760) -> list[any]: """Return a list with the input value repeated for a given number of hours. Args: diff --git a/pages/lib/template_graphs.py b/pages/lib/template_graphs.py index 216f0fa..f8e3641 100644 --- a/pages/lib/template_graphs.py +++ b/pages/lib/template_graphs.py @@ -838,7 +838,9 @@ def barchart(df, var, time_filter_info, data_filter_info, normalize, si_ip): return fig -def time_filtering(df, start_time, end_time, time_col, target_col): +def time_filtering( + df: pd.DataFrame, start_time: int, end_time: int, time_col: str, target_col: str +) -> pd.DataFrame: """Mask values in the target column based on the given time range. Args: diff --git a/pages/lib/utils.py b/pages/lib/utils.py index 8671ba7..539ca23 100644 --- a/pages/lib/utils.py +++ b/pages/lib/utils.py @@ -292,7 +292,7 @@ def dropdown(options=None, **kwargs): ) -def get_max_min_value(series, base=5): +def get_max_min_value(series: pd.Series, base: int = 5) -> tuple[int, int]: """Calculate rounded-up max and rounded-down min values based on a base step. Args: From eaa2eb33ed39737d87e2cdbd6212b556040e0459 Mon Sep 17 00:00:00 2001 From: Wenshu Lyu Date: Fri, 5 Sep 2025 16:24:28 +1000 Subject: [PATCH 9/9] deps: fix dev dependencies in Pipfile.lock --- Pipfile.lock | 551 ++++++++++++++++++++++++++------------------------- 1 file changed, 277 insertions(+), 274 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 3b8b17e..15c208f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "4fe266b227936bffb73552e6657f642511470c74fa9f3236f6eb0b6c2e7b095c" + "sha256": "7214a1158f64483648ecff36a57b61b67020408e0f16770b77d7165a9d6f47e0" }, "pipfile-spec": 6, "requires": { @@ -16,44 +16,6 @@ ] }, "default": { - "ansi2html": { - "hashes": [ - "sha256:3453bf87535d37b827b05245faaa756dbab4ec3d69925e352b6319c3c955c0a5", - "sha256:dccb75aa95fb018e5d299be2b45f802952377abfdce0504c17a6ee6ef0a420c5" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==1.9.2" - }, - "black": { - "hashes": [ - "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", - "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", - "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", - "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", - "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", - "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", - "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", - "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", - "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", - "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", - "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", - "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", - "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", - "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", - "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", - "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", - "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", - "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", - "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", - "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", - "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", - "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==25.1.0" - }, "blinker": { "hashes": [ "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", @@ -62,15 +24,6 @@ "markers": "python_version >= '3.9'", "version": "==1.9.0" }, - "bump2version": { - "hashes": [ - "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410", - "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6" - ], - "index": "pypi", - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, "cachelib": { "hashes": [ "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5", @@ -87,14 +40,6 @@ "markers": "python_version >= '3.7'", "version": "==2025.8.3" }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, "charset-normalizer": { "hashes": [ "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", @@ -180,15 +125,6 @@ "markers": "python_version >= '3.7'", "version": "==3.4.3" }, - "cleanpy": { - "hashes": [ - "sha256:9ddfa7ce80dd888b597a8b0bfeea3b69567839b6f41b775a4f76f46914d5170e", - "sha256:c60589d5da68527ca0c9151e28ed56fffae69df4ab6c9bfd8c1cf1d9e76a09b8" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==0.5.1" - }, "click": { "hashes": [ "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", @@ -197,6 +133,14 @@ "markers": "python_version >= '3.10'", "version": "==8.2.1" }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==0.4.6" + }, "dash": { "hashes": [ "sha256:d38891337fc855d5673f75e5346354daa063c4ff45a8a6a21f25e858fcae41c2", @@ -268,13 +212,6 @@ ], "version": "==0.22.3" }, - "distlib": { - "hashes": [ - "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", - "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d" - ], - "version": "==0.4.0" - }, "editorconfig": { "hashes": [ "sha256:1eda9c2c0db8c16dbd50111b710572a5e6de934e39772de1959d41f64fc17c82", @@ -283,14 +220,6 @@ "markers": "python_version >= '3.9'", "version": "==0.17.1" }, - "filelock": { - "hashes": [ - "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", - "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d" - ], - "markers": "python_version >= '3.9'", - "version": "==3.19.1" - }, "flask": { "hashes": [ "sha256:09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc", @@ -339,14 +268,6 @@ "markers": "python_version >= '3.9'", "version": "==3.14.0" }, - "identify": { - "hashes": [ - "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b", - "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.13" - }, "idna": { "hashes": [ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", @@ -363,15 +284,6 @@ "markers": "python_version >= '3.9'", "version": "==8.7.0" }, - "iniconfig": { - "hashes": [ - "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", - "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.1.0" - }, "itsdangerous": { "hashes": [ "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", @@ -497,24 +409,6 @@ "markers": "python_version >= '3.7'", "version": "==9.1.0" }, - "mypy-extensions": { - "hashes": [ - "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", - "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.1.0" - }, - "narwhals": { - "hashes": [ - "sha256:235e61ca807bc21110ca36a4d53888ecc22c42dcdf50a7c886e10dde3fd7f38c", - "sha256:837457e36a2ba1710c881fb69e1f79ce44fb81728c92ac378f70892a53af8ddb" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.0.1" - }, "nest-asyncio": { "hashes": [ "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", @@ -523,14 +417,6 @@ "markers": "python_version >= '3.5'", "version": "==1.6.0" }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, "numba": { "hashes": [ "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", @@ -645,24 +531,6 @@ "markers": "python_version >= '3.9'", "version": "==2.2.0" }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "platformdirs": { - "hashes": [ - "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", - "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==4.3.8" - }, "plotly": { "hashes": [ "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de", @@ -672,24 +540,6 @@ "markers": "python_version >= '3.6'", "version": "==5.18.0" }, - "pluggy": { - "hashes": [ - "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", - "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.6.0" - }, - "pre-commit": { - "hashes": [ - "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", - "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==4.3.0" - }, "pvlib": { "hashes": [ "sha256:ead96f47898befd7728ab0b61b9747231008e151ef78a26d5e41d0b6a95a3a9d", @@ -699,24 +549,6 @@ "markers": "python_version >= '3.6'", "version": "==0.9.1" }, - "pygments": { - "hashes": [ - "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", - "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.19.2" - }, - "pytest": { - "hashes": [ - "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", - "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==8.4.1" - }, "pythermalcomfort": { "hashes": [ "sha256:607995f6920a03911c7b9fddd06d819db1fa6e658d742b4ec8395a2c90707da5", @@ -731,7 +563,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytz": { @@ -741,65 +573,6 @@ ], "version": "==2025.2" }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.2" - }, "requests": { "hashes": [ "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", @@ -817,31 +590,6 @@ "markers": "python_version >= '3.6'", "version": "==1.4.2" }, - "ruff": { - "hashes": [ - "sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606", - "sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71", - "sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3", - "sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860", - "sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa", - "sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c", - "sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb", - "sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e", - "sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5", - "sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd", - "sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303", - "sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb", - "sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f", - "sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4", - "sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423", - "sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77", - "sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69", - "sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==0.12.7" - }, "scipy": { "hashes": [ "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc", @@ -887,7 +635,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, "tenacity": { @@ -900,11 +648,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", - "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" + "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", + "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" ], "markers": "python_version >= '3.9'", - "version": "==4.15.0" + "version": "==4.14.1" }, "tzdata": { "hashes": [ @@ -922,14 +670,6 @@ "markers": "python_version >= '3.9'", "version": "==2.5.0" }, - "virtualenv": { - "hashes": [ - "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", - "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a" - ], - "markers": "python_version >= '3.8'", - "version": "==20.34.0" - }, "werkzeug": { "hashes": [ "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17", @@ -946,5 +686,268 @@ "markers": "python_version >= '3.9'", "version": "==3.23.0" } + }, + "develop": { + "black": { + "hashes": [ + "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", + "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", + "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", + "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", + "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", + "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", + "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", + "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", + "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", + "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", + "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", + "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", + "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", + "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", + "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", + "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", + "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", + "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", + "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", + "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", + "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", + "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==25.1.0" + }, + "bump2version": { + "hashes": [ + "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410", + "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6" + ], + "index": "pypi", + "markers": "python_version >= '3.5'", + "version": "==1.0.1" + }, + "cfgv": { + "hashes": [ + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" + ], + "markers": "python_version >= '3.8'", + "version": "==3.4.0" + }, + "cleanpy": { + "hashes": [ + "sha256:9ddfa7ce80dd888b597a8b0bfeea3b69567839b6f41b775a4f76f46914d5170e", + "sha256:c60589d5da68527ca0c9151e28ed56fffae69df4ab6c9bfd8c1cf1d9e76a09b8" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.5.1" + }, + "click": { + "hashes": [ + "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", + "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" + ], + "markers": "python_version >= '3.10'", + "version": "==8.2.1" + }, + "distlib": { + "hashes": [ + "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", + "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d" + ], + "version": "==0.4.0" + }, + "filelock": { + "hashes": [ + "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", + "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d" + ], + "markers": "python_version >= '3.9'", + "version": "==3.19.1" + }, + "identify": { + "hashes": [ + "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b", + "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32" + ], + "markers": "python_version >= '3.9'", + "version": "==2.6.13" + }, + "iniconfig": { + "hashes": [ + "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", + "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + ], + "markers": "python_version >= '3.8'", + "version": "==2.1.0" + }, + "mypy-extensions": { + "hashes": [ + "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", + "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" + ], + "markers": "python_version >= '3.8'", + "version": "==1.1.0" + }, + "nodeenv": { + "hashes": [ + "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", + "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.9.1" + }, + "packaging": { + "hashes": [ + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" + ], + "markers": "python_version >= '3.8'", + "version": "==25.0" + }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "platformdirs": { + "hashes": [ + "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", + "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" + ], + "markers": "python_version >= '3.9'", + "version": "==4.3.8" + }, + "pluggy": { + "hashes": [ + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" + ], + "markers": "python_version >= '3.9'", + "version": "==1.6.0" + }, + "pre-commit": { + "hashes": [ + "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", + "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==4.3.0" + }, + "pygments": { + "hashes": [ + "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", + "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" + ], + "markers": "python_version >= '3.8'", + "version": "==2.19.2" + }, + "pytest": { + "hashes": [ + "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", + "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==8.4.1" + }, + "pyyaml": { + "hashes": [ + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" + ], + "markers": "python_version >= '3.8'", + "version": "==6.0.2" + }, + "ruff": { + "hashes": [ + "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", + "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", + "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", + "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", + "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", + "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", + "sha256:63c8c819739d86b96d500cce885956a1a48ab056bbcbc61b747ad494b2485089", + "sha256:6fb15b1977309741d7d098c8a3cb7a30bc112760a00fb6efb7abc85f00ba5908", + "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", + "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", + "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", + "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", + "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", + "sha256:cc7a37bd2509974379d0115cc5608a1a4a6c4bff1b452ea69db83c8855d53f93", + "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", + "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", + "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", + "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", + "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==0.12.9" + }, + "virtualenv": { + "hashes": [ + "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", + "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a" + ], + "markers": "python_version >= '3.8'", + "version": "==20.34.0" + } } }