diff --git a/buildingmotif/api/serializers/parser.py b/buildingmotif/api/serializers/parser.py index b1f5769a6..1f8b31e8b 100644 --- a/buildingmotif/api/serializers/parser.py +++ b/buildingmotif/api/serializers/parser.py @@ -1,6 +1,7 @@ import warnings from functools import lru_cache -from typing import Any, Literal, Tuple, Type, Union, get_type_hints +from inspect import Parameter, signature +from typing import Any, Type, Union, get_type_hints from rdflib import URIRef from typing_extensions import TypedDict @@ -96,34 +97,7 @@ def _get_token_by_name(token_name: str) -> Type[Token]: raise NameError(f'Token of type "{token_name}" does not exist') -@lru_cache -def _get_parser_args_info( - parser: Type[Parser], -) -> Tuple[Union[str, Literal[None]], Union[str, Literal[None]]]: - """Get information about the args in a parser's constructor. - This has been moved to it's own function to allow for speed improvements by - caching results. - - :param parser: parser to inspect - :type parser: Type[Parser] - :return: variable length positional arguments name, variable length keyword arguments name - :rtype: tuple[str, str]""" - flags = parser.__init__.__code__.co_flags - varargs_flag = (flags & 4) != 0 - varkeyargs_flag = (flags & 8) != 0 - var_names = parser.__init__.__code__.co_varnames[1:] - varargs_name = None - varkeyargs_name = None - if varkeyargs_flag: - varkeyargs_name = var_names[-1] - if varargs_flag: - varargs_name = var_names[-1] - if varkeyargs_flag: - varargs_name = var_names[-2] - return (varargs_name, varkeyargs_name) - - -def _construct_class(cls: Type[Parser], args: dict) -> Parser: +def _construct_class(cls: Type[Parser], args_dict: dict) -> Parser: """Construct class from type and arguments :param cls: type of class to construct @@ -132,21 +106,24 @@ def _construct_class(cls: Type[Parser], args: dict) -> Parser: :type args: dict :return: Instance of class :rtype: Any""" - varargs_name, varkeyargs_name = _get_parser_args_info(cls) - if varkeyargs_name: - varkeyargs_value = args[varkeyargs_name] - del args[varkeyargs_name] - args = {**args, **varkeyargs_value} - if varargs_name: - if varargs_name in args: - varargs_value: list = args[varargs_name] - if not isinstance(varargs_value, list): - raise TypeError( - "Serialized variadic arguments are not encoded as a list" - ) - del args[varargs_name] - return cls(*varargs_value, **args) - return cls(**args) + parameters = signature(cls.__init__).parameters + args = [] + kwargs = {} + for name, param in parameters.items(): + if name not in args_dict: + continue + kind = param.kind + value = args_dict[name] + if kind == Parameter.POSITIONAL_ONLY: + args.append(value) + elif kind in [Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY]: + kwargs[name] = value + elif kind == Parameter.VAR_POSITIONAL: + args = [*args, *value] + elif kind == Parameter.VAR_KEYWORD: + kwargs.update(value) + + return cls(*args, **kwargs) def deserialize(parser_dict: Union[ParserDict, dict]) -> Parser: @@ -186,7 +163,7 @@ def _deserialize_token(token_dict: dict) -> Union[Token, Type[Token]]: :rtype: Token""" token = _get_token_by_name(token_dict["token"]) if "value" in token_dict: - value_type = _get_token_value_type(token) + value_type = _get_token_value_type(token) # type: ignore return token(value_type(token_dict["value"])) return token @@ -247,4 +224,4 @@ def _token_like(item: dict) -> bool: return False if "token" not in item: return False - return True + return True \ No newline at end of file diff --git a/buildingmotif/label_parsing/build_parser.py b/buildingmotif/label_parsing/build_parser.py new file mode 100644 index 000000000..49468bd3f --- /dev/null +++ b/buildingmotif/label_parsing/build_parser.py @@ -0,0 +1,503 @@ +import csv +import random +import re +from typing import List + +import numpy as np +from sklearn import metrics +from sklearn.cluster import DBSCAN +from sklearn.neighbors import NearestNeighbors +from sklearn.preprocessing import MinMaxScaler + +from buildingmotif.label_parsing.token_classify import classify_tokens_with_llm +from buildingmotif.label_parsing.tools import abbreviationsTool, tokenizer, wordChecker + +MIN_CONSTANT_LENGTH = 3 +scaler = MinMaxScaler() + + +def classify_tokens(split: List): + """ + Classifies tokens into one of three classes: alpha (letters), numbers, or special characters. Used for + token similarity/difference metrics. + + :param tokens: List of tokens. + :type tokens: List[str] + + :return: List of classified tokens. + :rtype: List[str] + """ + + classified = [] + for group in split: + if group.isalpha(): + classified.append("alpha") + elif group.isdigit(): + classified.append("num") + else: + classified.append("special") + return classified + + +def similarity_ratio_ordered(a: str, b: str): + """ + Calculates ratio of how similar two strings are based on the ratio of the tokens they have similar (order matters) to + the length of the longer tokenized list. + + :param a: The first input string that will be tokenized. + :type a: str + :param b: The second input string that will be tokenized. + :type b: str + + :return: The similarity ratio between the two strings, ranging from 0.0 to 1.0. + :rtype: float + """ + + classified_tokens_a = classify_tokens(tokenizer.shift_split(a)) + classified_tokens_b = classify_tokens(tokenizer.shift_split(b)) + + first_unmatched = 0 + if min(len(classified_tokens_a), len(classified_tokens_b)) == len( + classified_tokens_a + ): + for i in range(len(classified_tokens_a)): + if classified_tokens_a[i] == classified_tokens_b[i]: + first_unmatched += 1 + else: + break + return first_unmatched / len(classified_tokens_b) + else: + for i in range(len(classified_tokens_b)): + if classified_tokens_b[i] == classified_tokens_a[i]: + first_unmatched += 1 + else: + break + return first_unmatched / len(classified_tokens_a) + + +def get_column_data(csv_file: str, column_name: str): + """ + Returns a list of the data inside a specified CSV column, + in which whitespaces and new lines are removed from each entry. + Raises exception if file cannot be found or cannot be read. + + :param csv_file: File path to a CSV file. + :type csv_file: str + :param column_name: Column name where data exists. + :type column_name: str + + :return: List of the data inside the specified CSV column, + with whitespaces and new lines removed from each entry. + :rtype: List + """ + + try: + with open(csv_file, mode="r", newline="") as file: + reader = csv.DictReader(file) + if column_name not in reader.fieldnames: + raise ValueError( + f"Column '{column_name}' does not exist in the CSV file." + ) + + column_contents = [ + row[column_name].replace("\n", "").replace(" ", "") for row in reader + ] + + return column_contents + + except FileNotFoundError: + print(f"Error: The file '{csv_file}' was not found.") + return None + + except IOError: + print(f"Error: Unable to read the file '{csv_file}'.") + return None + + except Exception as e: + print(f"Error: {str(e)}") + return None + + +def make_program(user_text: str, matched_token_classes, list_of_dicts: List): + """ + Assigns code parsers to tokens based on types and the result of applying specific parsers, resorting to + LLM Ollama3 to seperate constants and identifiers. + + Flags unknown abbreviations with LLM Ollama3, then combines parsers assigned parsers based on the factors like + which token they parse or if there is a sequence of similar parsers. + + :param user_text: Building point label. + :type user_text: str + :param matched_token_classes: Custom class containing each token of the string and corresponding LLM Prediction: + Identifier, Abbreviations, Constant, or Delimiter. See token_classify.py for more details. + :type matched_token_classes: LLM_Token_Prediction + :param list_of_dicts: List of dictionaries mapping an abbreviation to a brick constant. + :type list_of_dicts: List + + :return: Ordered list of parsers based on the order of the original tokens. + :return: List of LLM-Flagged Abbreviations. + :rtype: List + """ + + tokens = tokenizer.split_and_group(user_text, list_of_dicts) + unparsed = tokens.copy() + dict_predictions = {} + flagged = [] + + valid_tokens = set() + delimiters = set() + combined_abbreviations = abbreviationsTool.make_combined_abbreviations( + list_of_dicts + ) # combines dictionaries, sorts keys by decreasing length, and makes combined dictionary an abbreviations object + + for token in tokens: + if not token.isalnum(): + delimiters.add(token) + elif combined_abbreviations(token) and not any( + r.error for r in combined_abbreviations(token) + ): + dict_predictions[token] = "COMBINED_ABBREVIATIONS" + elif ( + wordChecker.check_word_validity(token) and len(token) >= MIN_CONSTANT_LENGTH and not token.isnumeric() + ): + valid_tokens.add(token) + + # Assign classifications + for token in delimiters: + dict_predictions[token] = "delimiters" + for token in valid_tokens: + dict_predictions[token] = f'regex(r"[a-zA-Z]{{1,{len(token)}}}", Constant)' + + unparsed = [ + token + for token in tokens + if token not in delimiters + and token not in valid_tokens + and token not in dict_predictions.keys() + ] # remove already parsed tokens + + # make dictionary for LLM_Token_Predictions where the key is the token and value is the classification + class_token_dict = { + ct.token: ct.classification for ct in matched_token_classes.predictions + } + + for token in unparsed: + classification = class_token_dict.get(token) + if classification: + if classification == "Abbreviations": + flagged.append( + token + ) # append all tokens the llm predicts as an Abbreviations to the flagged list + if classification == "Constant" and not token.isnumeric(): # check if a token is constant by using a word checker library or with llm prediction + dict_predictions[token] = f'regex(r"[a-zA-Z]{{1,{len(token)}}}", Constant)' + else: + dict_predictions[token] = ( + f'regex(r"[a-zA-Z0-9]{{1,{len(token)}}}", Identifier)' + ) + + arr = [dict_predictions.get(token) for token in tokens] + # add all parsers to a list based on the original token order + final_groups = [] + left = 0 + right = 1 + arr_size = len(arr) + + # use two pointers to walk through parser list and combine them with parser classes like until, many, and rest + while right < arr_size: + if ( + arr[left] == "COMBINED_ABBREVIATIONS" + and arr[right] == "COMBINED_ABBREVIATIONS" + ): # two abbreviations in sequence + final_groups.append("many(" + arr[left] + ")") + left += 2 + right = left + 1 + elif ( + "Identifier" in arr[left] + and "Constant" not in arr[right] + and "Identifier" not in arr[right] + ): # identifier before an abbreviation or delimiter + final_groups.append(f"until({arr[right]}, Identifier)") + final_groups.append(arr[right]) + left += 2 + right = left + 1 + elif ( + "Constant" in arr[left] + and "Constant" not in arr[right] + and "Identifier" not in arr[right] + ): # constant before an abbreviation or delimiter + final_groups.append(f"until({arr[right]}, Constant)") + final_groups.append(arr[right]) + left += 2 + right = left + 1 + elif ( + "Identifier" in arr[left] and "Identifier" in arr[right] + ): # two identifiers in sequence + if ( + right + 1 == arr_size - 1 and "Identifier" in arr[right + 1] + ) or right == arr_size - 1: # last two or three elements are all identifiers + final_groups.append("identifier") + left = len(arr) + break + elif ( + right + 1 == arr_size - 2 + and "Identifier" not in arr[right + 1] + and "Constant" not in arr[right + 1] + ): + # two elements are identifiers, third element is either a delimiter or abbrev + final_groups.append(f"until({arr[right + 1]}, Identifier)") + left = right + 1 + else: + # Calculate the maximum lengths of first_regex and second_regex + max_length_first = int(re.search(r"\{1,(\d+)\}", arr[left]).group(1)) + max_length_second = int(re.search(r"\{1,(\d+)\}", arr[right]).group(1)) + combined_length = max_length_first + max_length_second + + combined_regex = r"[a-zA-Z0-9]{1,%d}" % combined_length + combined_regex = str(combined_regex) + + combined = f'regex(r"{combined_regex}", Identifier)' + final_groups.append(combined) + left += 2 + right = left + 1 + elif ( + "Constant" in arr[left] and "Constant" in arr[right] + ): # two constants in sequence + if ( + right + 1 == arr_size - 1 and "Constant" in arr[right + 1] + ) or right == arr_size - 1: # last two or three elements are all constants + final_groups.append('regex(r"[a-zA-Z]+", Constant)') + left = len(arr) + break + elif ( + right + 1 == arr_size - 2 + and "Identifier" not in arr[right + 1] + and "Constant" not in arr[right + 1] + ): + final_groups.append( + f"until({arr[right + 1]}, Constant)" + ) # two elements are constanrs, third element is either a delimiter or abbrev + left = right + 1 + else: + max_length_first = int(re.search(r"\{1,(\d+)\}", arr[left]).group(1)) + max_length_second = int(re.search(r"\{1,(\d+)\}", arr[right]).group(1)) + combined_length = max_length_first + max_length_second + + combined_regex = r"[a-zA-Z]{1,%d}" % combined_length + combined_regex = str(combined_regex) + + combined = f'regex(r"{combined_regex}", Constant)' + final_groups.append(combined) + left += 2 + right = left + 1 + else: + final_groups.append(arr[left]) + left += 1 + right = left + 1 + if left < len(arr): + final_groups.append( + arr[left] + ) # append last element if left pointer is not at end + + if "Constant" in final_groups[len(final_groups) - 1]: # last element is a constant + final_groups.pop(len(final_groups) - 1) + final_groups.append('regex(r"[a-zA-Z]+", Constant)') + elif ( + "Identifier" + in final_groups[len(final_groups) - 1] # last element is an identifier + ): # last element is an identifier + final_groups.pop(len(final_groups) - 1) + final_groups.append("identifier") + return final_groups, flagged + + +def group_by_clusters(filename: str, col_name: str): + """ + Uses DBScan clustering to group list of names returned from CSV file column. + + :param filename: File path to CSV file. + :type filename: str + :param col_name: Column name. + :type col_name: str + + :return: List of lists of clustered building points. + :rtype: List[List] + :return: List of lists of noise points. + :rtype: List[List] + """ + + noise = [] + clusters = [] + distance_matrix_metrics = {} + clustering_metrics = {} + + if get_column_data(filename, col_name) is not None: + data_list = get_column_data(filename, col_name) + + n = len(data_list) + distance_matrix = np.zeros((n, n)) + for i in range(n): + for j in range(i, n): + dist = similarity_ratio_ordered(data_list[i], data_list[j]) + distance_matrix[i, j] = dist + distance_matrix[j, i] = dist + + distance_matrix_metrics = { + "mean": np.mean(distance_matrix), + "median": np.median(distance_matrix), + "std": np.std(distance_matrix), + "min": np.min(distance_matrix), + "max": np.max(distance_matrix), + "range": np.max(distance_matrix) - np.min(distance_matrix), + } + + scaled_distance_matrix = scaler.fit_transform(distance_matrix) + neigh = NearestNeighbors(n_neighbors=4, metric="precomputed") + nbrs = neigh.fit(scaled_distance_matrix) + distances, indices = nbrs.kneighbors(scaled_distance_matrix) + distances = np.sort(distances[:, 1]) + + dbscan = DBSCAN(eps=0.125, min_samples=4).fit(scaled_distance_matrix) + labels = dbscan.fit_predict(scaled_distance_matrix) + + # Number of clusters in labels, ignoring noise if present. + n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) + n_noise_ = list(labels).count(-1) + clustering_metrics = { + "clusters": n_clusters_, + "noise_points": n_noise_, + "clustering_score": metrics.silhouette_score(scaled_distance_matrix, labels), + } + + for cluster_id in np.unique(labels): + cluster_strings = [data_list[i] for i in np.where(labels == cluster_id)[0]] + if cluster_id == -1: + noise.append(cluster_strings) + else: + clusters.append(cluster_strings) + # print(f"Cluster {cluster_id}: {cluster_strings}") + return clusters, noise, distance_matrix_metrics, clustering_metrics + + +def generate_parsers_for_points( + filename: str, col_name: str, num_tries: int, list_of_dicts: List +): + """ + Generates parsers for every building point label from the CSV file column because + DBScan was unable to create more than one cluster. + + :param filename: File path to CSV file. + :type filename: str + :param col_name: Column name. + :type col_name: str + :param num_tries: Number of attempts for LLM to generate token predictions (LLM_Token_Predictions). + :type num_tries: int + :param list_of_dicts: List of dictionaries mapping abbreviations to brick classes. + :type list_of_dicts: List + + :return: List of lists of parsers. + :rtype: List[List] + :return: List of lists of each point. + :rtype: List[List] + :return: List of all flagged abbreviations. + :rtype: List + """ + + parsers = [] + clusters = [] + flagged = [] + if get_column_data(filename, col_name) is not None: + data_list = get_column_data(filename, col_name) + for data in data_list: + try: + llm_output = classify_tokens_with_llm(data, list_of_dicts, num_tries) + except Exception as e: + print(e) + print(f"num_tries exceeded {num_tries}") + continue + program_arr, flagged = make_program(data, llm_output, list_of_dicts) + random_generated_parser = ( + "parser_noise_" + + str(len(program_arr)) + + "_" + + str(random.randint(1, 1000)) + ) + parser = ( + random_generated_parser + " = sequence(" + ", ".join(program_arr) + ")" + ) + parsers.append(parser) + clusters.append([data]) + return parsers, clusters, flagged + + +def generate_parsers_for_clusters( + filename: str, col_name: str, num_tries: int, list_of_dicts: List +): + """ + Generates parsers for every cluster from the list of building point labels from CSV file column + + :param filename: File path to CSV file. + :type filename: str + :param col_name: Column name. + :type col_name: str + :param num_tries: Number of attempts for LLM to generate token predictions (LLM_Token_Predictions). + :type num_tries: int + :param list_of_dicts: List of dictionaries mapping abbreviations to brick classes. + :type list_of_dicts: List + + :return: List of lists of parsers. + :rtype: List[List] + :return: List of lists of each cluster with building point labels. + :rtype: List[List] + :return: Dictionary of distance metrics with metrics such as mean, median, mode, std, min, max, range. + :rtype: dict + :return: Dictionary of clustering metrics including number of clusters, number of noise points, silhouette score. + :rtype: dict + :return: List of all flagged abbreviations. + :rtype: List + """ + + map_parser_to_cluster = {} + clusters, noise, distance_metrics, cluster_metrics = group_by_clusters( + filename, col_name + ) + flagged = [] + + for arr_of_point_names in clusters: + point_name = arr_of_point_names[random.randint(0, len(arr_of_point_names) - 1)] + try: + llm_output = classify_tokens_with_llm(point_name, list_of_dicts, num_tries) + except Exception as e: + print(e) + print(f"num_tries exceeded {num_tries}") + continue + program_arr, flagged = make_program(point_name, llm_output, list_of_dicts) + random_generated_parser = ( + "parser_lencluster_" + + str(len(program_arr)) + + "_" + + str(random.randint(1, 1000)) + ) + parser = random_generated_parser + " = sequence(" + ", ".join(program_arr) + ")" + map_parser_to_cluster[parser] = arr_of_point_names + + for noise_point in noise[0]: + try: + llm_output = classify_tokens_with_llm(noise_point, list_of_dicts, num_tries) + except Exception as e: + print(e) + print(f"num_tries exceeded {num_tries}") + continue + program_arr, flagged = make_program(noise_point, llm_output, list_of_dicts) + random_generated_parser = ( + "parser_noise_" + str(len(program_arr)) + "_" + str(random.randint(1, 1000)) + ) + parser = random_generated_parser + " = sequence(" + ", ".join(program_arr) + ")" + map_parser_to_cluster[parser] = [noise_point] + + return ( + map_parser_to_cluster.keys(), + map_parser_to_cluster.values(), + distance_metrics, + cluster_metrics, + flagged, + ) \ No newline at end of file diff --git a/buildingmotif/label_parsing/combinators.py b/buildingmotif/label_parsing/combinators.py index b5ec9b1b2..42e98d27a 100644 --- a/buildingmotif/label_parsing/combinators.py +++ b/buildingmotif/label_parsing/combinators.py @@ -273,6 +273,7 @@ def as_identifier_parser(target): "A": BRICK.Air_Handling_Unit, } + COMMON_POINT_ABBREVIATIONS = { "ART": BRICK.Room_Temperature_Sensor, "TSP": BRICK.Air_Temperature_Setpoint, @@ -291,15 +292,189 @@ def as_identifier_parser(target): "DPS": BRICK.Differential_Pressure_Sensor, } + COMMON_ABBREVIATIONS = abbreviations( {**COMMON_EQUIP_ABBREVIATIONS_BRICK, **COMMON_POINT_ABBREVIATIONS} ) - -# common parser combinators equip_abbreviations = abbreviations(COMMON_EQUIP_ABBREVIATIONS_BRICK) point_abbreviations = abbreviations(COMMON_POINT_ABBREVIATIONS) -delimiters = regex(r"[._:/\- ]", Delimiter) +delimiters = regex(r"[._&:/\- ]", Delimiter) identifier = regex(r"[a-zA-Z0-9]+", Identifier) named_equip = sequence(equip_abbreviations, maybe(delimiters), identifier) named_point = sequence(point_abbreviations, maybe(delimiters), identifier) +building_constant = constant(Constant(BRICK.Building)) +up_to_delimiter = regex(r"[^_._:/\-]+", Identifier) + +# mapped points to brick class using vector embeddings +COMMON_GENERATED_ABBREVIATIONS = { + "DEWPTTMP": BRICK.Dewpoint_Setpoint, + "KTONHR": BRICK.Chilled_Water_Meter, + "CHWVLV": BRICK.Chilled_Water_Valve, + "ENTTMP": BRICK.Enthalpy_Sensor, + "CHVLV": BRICK.Chilled_Water_Valve, + "HWVLV": BRICK.Hot_Water_Valve, + "CHWST": BRICK.Leaving_Chilled_Water_Temperature_Sensor, + "CHWRT": BRICK.Chilled_Water_Temperature_Sensor, + "HHW-R": BRICK.Hot_Water_Radiator, + "HHW-S": BRICK.Hot_Water_System, + "SPEED": BRICK.Fan_Speed_Command, + "THERM": BRICK.Natural_Gas_Usage_Sensor, + "SCHWP": BRICK.Chilled_Water_System_Enable_Command, + "TCHWP": BRICK.Chilled_Water_Pump, + "PRESS": BRICK.Pressure_Setpoint, + "ZNTMP": BRICK.Zone_Air_Temperature_Setpoint, + "LWTMP": BRICK.Leaving_Water_Temperature_Setpoint, + "CRAC": BRICK.Computer_Room_Air_Conditioner, + "RVAV": BRICK.Variable_Air_Volume_Box_With_Reheat, + "HWST": BRICK.Leaving_Hot_Water_Temperature_Sensor, + "HWRT": BRICK.Entering_Hot_Water_Temperature_Sensor, + "CHWR": BRICK.Chilled_Water_System_Enable_Command, + "CHWS": BRICK.Chilled_Water_System_Enable_Command, + "CHWP": BRICK.Chilled_Water_Pump, + "HHWP": BRICK.Hot_Water_Pump, + "DMPR": BRICK.Damper_Command, + "FFIL": BRICK.Final_Filter, + "PFIL": BRICK.Pre_Filter_Status, + "SCHW": BRICK.Chilled_Water_System, + "ENTH": BRICK.Enthalpy_Setpoint, + "AHU": BRICK.Air_Handling_Unit, + "FCU": BRICK.Duct_Fan_Coil_Unit, + "VAV": BRICK.Variable_Air_Volume_Box, + "PMP": BRICK.Pump, + "RTU": BRICK.Rooftop_Unit, + "DMP": BRICK.Damper, + "VFD": BRICK.Variable_Frequency_Drive, + "MAU": BRICK.Makeup_Air_Unit, + "ART": BRICK.Room_Temperature_Sensor, + "TSP": BRICK.Air_Temperature_Setpoint, + "HSP": BRICK.Air_Temperature_Heating_Setpoint, + "CSP": BRICK.Air_Temperature_Cooling_Setpoint, + "CO2": BRICK.CO2_Sensor, + "STS": BRICK.Status, + "VLV": BRICK.Valve, + "DPS": BRICK.Differential_Pressure_Sensor, + "BLR": BRICK.Boiler_Command, + "CDW": BRICK.Condenser_Water_Temperature_Sensor, + "CWP": BRICK.Condenser_Water_Pump, + "DHW": BRICK.Domestic_Hot_Water_System_Enable_Command, + "FEV": BRICK.Exhaust_Air_Temperature_Sensor, + "GET": BRICK.Exhaust_Air_Temperature_Sensor, + "GEV": BRICK.Gas_Pressure_Regulator_Valve, + "LEF": BRICK.Exhaust_Air_Temperature_Sensor, + "HHW": BRICK.Hot_Water_Temperature_Setpoint, + "HPA": BRICK.Packaged_Air_Source_Heat_Pump, + "HRU": BRICK.Heat_Recovery_Condensing_Unit, + "HTX": BRICK.Radiator, + "HUM": BRICK.Humidifier_Fault_Status, + "LAB": BRICK.Enclosed_Office, + "OAU": BRICK.Dedicated_Outdoor_Air_System_Unit, + "PEM": BRICK.Electrical_Meter, + "PWP": BRICK.Water_Pump, + "SAV": BRICK.Return_Heating_Valve, + "CLG": BRICK.Cooling_Command, + "FLW": BRICK.Mixed_Air_Flow_Sensor, + "HTG": BRICK.Heating_Command, + "LSP": BRICK.Static_Pressure_Setpoint, + "MUA": BRICK.Makeup_Air_Unit, + "RHC": BRICK.Reheat_Valve, + "TON": BRICK.Chilled_Water_Meter, + "CHW": BRICK.Chilled_Water_System_Enable_Command, + "HWP": BRICK.Hot_Water_Pump, + "RAF": BRICK.Return_Fan, + "SAF": BRICK.Supply_Fan, + "FIL": BRICK.Intake_Air_Filter, + "MIX": BRICK.Mixing_Valve, + "RHT": BRICK.Reheat_Command, + "ALM": BRICK.Alarm_Sensitivity_Parameter, + "DEG": BRICK.Warm_Cool_Adjust_Sensor, + "TMP": BRICK.Temperature_Setpoint, + "PLT": BRICK.PVT_Panel, + "ACC": BRICK.Air_Cooled_Chiller, + "ACU": BRICK.Air_Cooling_Unit, + "ACW": BRICK.Wall_Air_Conditioner, + "ATS": BRICK.Automatic_Transfer_Switch, + "BAT": BRICK.Battery, + "BFP": BRICK.Backflow_Preventer_Valve, + "BSB": BRICK.Electric_Baseboard_Radiator, + "CMD": BRICK.CO2_Sensor, + "CMI": BRICK.CO2_Sensor, + "CMP": BRICK.Compressor, + "COL": BRICK.Cooling_Coil, + "CTR": BRICK.Cooling_Tower, + "DCT": BRICK.Disconnect_Switch, + "DEA": BRICK.Storage_Tank, + "DPP": BRICK.Damper_Command, + "EHC": BRICK.Fume_Hood, + "EHF": BRICK.Fume_Hood, + "EMS": BRICK.Energy_Storage_System, + "EVP": BRICK.Dry_Cooler, + "EXT": BRICK.Thermal_Expansion_Tank, + "FMT": BRICK.Flow_Sensor, + "FSD": BRICK.Fire_Safety_System, + "GDS": BRICK.Gas_Sensor, + "GTP": BRICK.Grease_Interceptor, + "HCU": BRICK.Heat_Pump_Condensing_Unit, + "HVU": BRICK.HVAC_Equipment, + "HWC": BRICK.Hot_Water_Radiator, + "ICE": BRICK.Chilled_Water_Loop, + "KTL": BRICK.Steam_Radiator, + "LCP": BRICK.Luminance_Command, + "LGD": BRICK.Dimmer, + "LOT": BRICK.Parking_Structure, + "MCC": BRICK.Motor_Control_Center, + "OZG": BRICK.Ozone_Level_Sensor, + "PLB": BRICK.Plumbing_Room, + "PTD": BRICK.Water_Pressure_Sensor, + "PVT": BRICK.PVT_Panel, + "REL": BRICK.Relay_Command, + "RFM": BRICK.Refrigerant_Metering_Device, + "RFR": BRICK.Chiller, + "RRS": BRICK.Heat_Recovery_Condensing_Unit, + "SDS": BRICK.Fire_Sensor, + "SHS": BRICK.Humidifier_Fault_Status, + "SWB": BRICK.Switch_Room, + "THS": BRICK.Outside_Air_Humidity_Sensor, + "TKW": BRICK.Hot_Water_Thermal_Energy_Storage_Tank, + "TMR": BRICK.On_Timer_Sensor, + "TMU": BRICK.Terminal_Unit, + "TST": BRICK.Thermostat_Status, + "TUS": BRICK.Steam_System, + "UHH": BRICK.Thermal_Energy_Usage_Sensor, + "UST": BRICK.Chilled_Water_Thermal_Energy_Storage_Tank, + "VCP": BRICK.Pump_VFD, + "WCC": BRICK.Condenser_Water_Temperature_Sensor, + "WIN": BRICK.Blind, + "HX": BRICK.Heat_Exchanger, + "HP": BRICK.Heat_Pump, + "CT": BRICK.Cooling_Tower, + "SP": BRICK.Setpoint, + "CO": BRICK.CO2_Alarm, + "FS": BRICK.Flow_Sensor, + "PS": BRICK.Air_Pressure_Sensor, + "AC": BRICK.Wall_Air_Conditioner, + "CH": BRICK.Centrifugal_Chiller, + "DW": BRICK.Water_System, + "EF": BRICK.Fan_VFD, + "RF": BRICK.Return_Fan, + "SF": BRICK.Supply_Fan, + "UH": BRICK.Heat_Pump_Condensing_Unit, + "CC": BRICK.Cooling_Coil, + "DP": BRICK.Differential_Pressure_Setpoint, + "EA": BRICK.Intake_Air_Filter, + "HC": BRICK.Heating_Coil, + "LT": BRICK.Low_Temperature_Alarm, + "MA": BRICK.Mixed_Air_Filter, + "VP": BRICK.Velocity_Pressure_Setpoint, + "RA": BRICK.Return_Air_Filter, + "SA": BRICK.Supply_Air_Plenum, + "RH": BRICK.Relative_Humidity_Sensor, + "AL": BRICK.Alarm_Sensitivity_Parameter, + "R": BRICK.Prayer_Room, + "A": BRICK.Alarm, + "T": BRICK.Temperature_Parameter, + "C": BRICK.Command, + "H": BRICK.High_Humidity_Alarm, + "P": BRICK.Pressure_Setpoint, + "S": BRICK.Status, +} diff --git a/buildingmotif/label_parsing/parser.py b/buildingmotif/label_parsing/parser.py index 5588166ff..500d63acc 100644 --- a/buildingmotif/label_parsing/parser.py +++ b/buildingmotif/label_parsing/parser.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from collections import defaultdict from dataclasses import dataclass, field +from inspect import Parameter, signature from typing import Dict, List, Tuple from buildingmotif.label_parsing.tokens import Constant, Identifier, Null, TokenResult @@ -42,16 +43,24 @@ def __new__(mcls, *args, **kwargs): This allows parsers to be serialized later without requiring bespoke (de)serialization code for every parser type.""" cls = super().__new__(mcls) - init_var_names = list(cls.__init__.__code__.co_varnames[1:]) - rem_var_names = init_var_names - for key in kwargs.keys(): - if key in init_var_names: - rem_var_names.remove(key) - rem_var_count = len(rem_var_names) - cls.__args__ = kwargs - if len(args) > rem_var_count: - args = [*args[: rem_var_count - 1], args[rem_var_count - 1 :]] - cls.__args__.update(dict(zip(init_var_names, args))) + sig = signature(mcls.__init__) + parameters = sig.parameters + arguments = sig.bind(cls, *args, **kwargs).arguments + + cls.__args__ = {} + for name, value in arguments.items(): + if name != "self": + kind = parameters[name].kind + if kind in [ + Parameter.POSITIONAL_ONLY, + Parameter.POSITIONAL_OR_KEYWORD, + Parameter.KEYWORD_ONLY, + ]: + cls.__args__[name] = value + elif kind == Parameter.VAR_POSITIONAL: + cls.__args__[name] = list(value) + elif kind == Parameter.VAR_KEYWORD: + cls.__args__.update(value) return cls @@ -197,3 +206,42 @@ def first_true(iterable, default=None, pred=None): # first_true([a,b,c], x) --> a or b or c or x # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x return next(filter(pred, iterable), default) + + +def parser_on_list(parser, data_list: List): + """ + Applies parser to each element in data_list. + Returns total parsed, total unparsed, successful parsed tokens, and unparsed elements from the list. + + :param parser: Parser to test. + :type parser: Parser + :param data_list: List of building points in list format. + :type data_list: List + + :return: List of emitted tokens from applying each parser on each element. + :rtype: List + :return: List of unsuccessfully parsed building point labels. + :rtype: List + :return List of successfully parsed point labels + :rtype List + :return: Amount of successfully parsed building point labels. + :rtype: int + :return: Amount of unsuccessfully parsed building point labels. + :rtype: int + """ + + parsed = [] + parsed_elements = [] + unparsed = [] + wrong = 0 + right = 0 + for data in data_list: + res = parser(data) + if res and not any(r.error for r in res): + parsed.append(res) + parsed_elements.append(data) + right += 1 + else: + unparsed.append(data) + wrong += 1 + return parsed, parsed_elements, unparsed, right, wrong diff --git a/buildingmotif/label_parsing/serialized_parser_metrics.py b/buildingmotif/label_parsing/serialized_parser_metrics.py new file mode 100644 index 000000000..3d1e207f7 --- /dev/null +++ b/buildingmotif/label_parsing/serialized_parser_metrics.py @@ -0,0 +1,210 @@ +import importlib.util +import os +import re + +from buildingmotif.label_parsing.build_parser import ( + generate_parsers_for_clusters, + generate_parsers_for_points, +) +from buildingmotif.label_parsing.combinators import ( + COMMON_EQUIP_ABBREVIATIONS_BRICK, + COMMON_POINT_ABBREVIATIONS, + COMMON_GENERATED_ABBREVIATIONS +) +from buildingmotif.label_parsing.tools import abbreviationsTool, codeLinter + + +class ParserBuilder: + + def __init__( + self, + filename: str, + col_name: str, + num_tries=3, + list_of_dicts=[COMMON_EQUIP_ABBREVIATIONS_BRICK, COMMON_POINT_ABBREVIATIONS], + ): + """ +Initializes a new ParserBuilder object. + +:param filename: File path to the CSV file. +:type filename: str +:param col_name: Name of the column where the point label data is stored. +:type col_name: str +:param num_tries: Maximum number of attempts for LLM to generate LLM_Token_Predictions object. Defaults to 3. +:type num_tries: int, optional +:param list_of_dicts: List of dictionaries mapping abbreviations to brick classes. Defaults to [equip_abbreviations, point_abbreviations]. +:type list_of_dicts: List, optional + """ + + filename = os.path.abspath(filename) + self.list_of_dicts = list_of_dicts + try: + ( + self.parsers, + self.clusters, + self.distance_metrics, + self.clustering_metrics, + self.flagged_abbreviations, + ) = generate_parsers_for_clusters( + filename, col_name, num_tries, list_of_dicts + ) + except ( + ValueError + ): # if not enough points to cluster, generate parsers for each point + self.parsers, self.clusters, self.flagged_abbreviations = ( + generate_parsers_for_points( + filename, col_name, num_tries, list_of_dicts + ) + ) + self.distance_metrics, self.clustering_metrics = {}, {} + + def combine_parsers_and_get_metrics(self): + """ +Emits a ParserMetrics object which contains serialized parsers and parser metrics. + """ + return ParserMetrics(self.parsers, self.clusters, self.list_of_dicts) + + def write_to_directory(self, directory: str): + """ + Writes each parser and cluster to a file along with necessary imports. + Saves in specified directory. + + :param directory: Directory path where each file containing a parser and its cluster will be saved. + :type directory: str + + :return: None + :rtype: None + """ + + if not os.path.exists(directory): + os.makedirs(directory) + + for parser, cluster in zip(self.parsers, self.clusters): + pattern = re.compile(r"([^\s]+)") + parser_var = pattern.match(parser)[0] + filename = parser_var + ".py" + with open(os.path.join(directory, filename), "w") as file: + file.write( + """ +from buildingmotif.label_parsing.combinators import * +from buildingmotif.label_parsing.parser import parser_on_list +from buildingmotif.label_parsing.tools import abbreviationsTool +import rdflib + """ + ) + file.write( + f""" +COMBINED_ABBREVIATIONS = abbreviationsTool.make_combined_abbreviations({self.list_of_dicts}) + """ + ) + file.write( + f""" +{parser}""" + ) + file.write( + f""" +cluster = {cluster}""" + ) + codeLinter._run(os.path.join(directory, filename)) + + +class ParserMetrics: + + def __init__(self, parsers, clusters, list_of_dicts): + """ +Initializes a new ParserMetrics object. + +:param parsers: List of parsers from ParserBuilder class. +:type parsers: List[str] +:param clusters: List of clusters from ParserBuilder class. +:type cluster: List[str] +:param list_of_dicts: provided list of abbreviation dictionaries passed to ParserBuilders +:type list_of_dicts: List[dict] + """ + self.parsed_count = 0 + self.unparsed_count = 0 + self.total_count = 0 + self.serializers_list = [] + self.combined_clusters = [] + + for parser, cluster in zip(parsers, clusters): + clustered_info = {} + try: + temp_filename = os.path.join(os.getcwd(), "temp_parser.py") + + with open( + temp_filename, mode="w" + ) as temp_file: # using tempfile library writes file in /appdata directory, dependencies difficult to manage + pattern = re.compile(r"([^\s]+)") + parser_var = pattern.match(parser)[ + 0 + ] # matches the parser variable (e.g. parser_lencluster_11_417) + temp_file.write( + """ +from buildingmotif.label_parsing.combinators import * +from buildingmotif.label_parsing.tools import abbreviationsTool +from buildingmotif.label_parsing.parser import parser_on_list +from buildingmotif.api.serializers import parser as serializerTool +import rdflib + """ + ) + temp_file.write( + f""" +COMBINED_ABBREVIATIONS = abbreviationsTool.make_combined_abbreviations({list_of_dicts}) + """ + ) + temp_file.write( + f""" +{parser}""" + ) + temp_file.write( + f""" +def get_serialization(): + return serializerTool.serialize({parser_var})""" + ) + temp_file.write( + f""" +cluster = {cluster}""" + ) + temp_file.write( + f""" +def run_parser(): + parsed, parsed_elements, unparsed, right, wrong = parser_on_list({parser_var}, cluster) + return parsed, parsed_elements, unparsed, right, wrong""" + ) + + # Load the module from the temporary file dynamically + spec = importlib.util.spec_from_file_location( + "generated", temp_filename + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + # Call the function defined in the module to get parsed results, unparsed elements, and total parsed/unparsed + parsed_arr, parsed_elements, unparsed_arr, right, wrong = ( + module.run_parser() + ) + serialized = module.get_serialization() + """ + serialization process is not a direct result of the parser generation process, + must be dynamically ran since parsers are strings + """ + self.serializers_list.append(serialized) + self.parsed_count += right + self.unparsed_count += wrong + self.total_count += right + wrong + clustered_info["serialized_parser"] = serialized + clustered_info["source_code"] = parser + clustered_info["parsed_labels"] = parsed_elements + clustered_info["unparsed_labels"] = unparsed_arr + clustered_info["tokens"] = parsed_arr + clustered_info["parser_metrics"] = { + "parsed_count": right, + "unparsed_count": wrong, + "total_count": right + wrong, + } + self.combined_clusters.append(clustered_info) + + + finally: + if os.path.exists(temp_filename): + os.remove(temp_filename) # remove file when complete \ No newline at end of file diff --git a/buildingmotif/label_parsing/token_classify.py b/buildingmotif/label_parsing/token_classify.py new file mode 100644 index 000000000..306db4e23 --- /dev/null +++ b/buildingmotif/label_parsing/token_classify.py @@ -0,0 +1,135 @@ +from typing import List + +from langchain.output_parsers import PydanticOutputParser +from langchain_community.llms import Ollama +from langchain_core.prompts import PromptTemplate +from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_text_splitters import ( + MarkdownHeaderTextSplitter, + RecursiveCharacterTextSplitter, +) + +from buildingmotif.label_parsing import usage +from buildingmotif.label_parsing.tools import tokenizer + +llm = Ollama(model="llama3") + + +class Token_Prediction(BaseModel): + """ + Class that LLM populates with tokens and corresponding classifications: constant, delimiter, abbreviations, or identifier + """ + + token: str = Field(description="a token from token string") + classification: str = Field( + description="predicted classification: constant, delimiter, abbreviations, or identifier" + ) + + +class LLM_Token_Predictions(BaseModel): + """ + Class of a List of Token_Prediction for each token. + """ + + predictions: List[Token_Prediction] = Field( + description="list of predicted classes for each token" + ) + + +parser = PydanticOutputParser(pydantic_object=LLM_Token_Predictions) + + +def classify_tokens_with_llm(user_input: str, list_of_dicts: List, num_tries: int): + """ + Uses LLM Ollama3 to classify each token as either a constant, abbreviation, identifier, or delimiter. + Returns List of Token_Prediction, which has a token and classification field as predicted by the LLM. + + :param user_input: Building point label string. + :type user_input: str + :param list_of_dicts: List of dictionaries mapping abbreviations to brick classes. + :type list_of_dicts: List + :param num_tries: Maximum number of attempts for LLM to create List of Token_Prediction. + :type num_tries: int + + :return: List of Token_Prediction. + :rtype: List + """ + + tokens_str_list = str(tokenizer.split_and_group(user_input, list_of_dicts)) + + headers_to_split_on = [ + ("## `string`", "Header 1"), + ("## `rest`", "Header 2"), + ("## `regex`", "Header 3"), + ("## `choice`", "Header 4"), + ("## `constant`", "Header 5"), + ("## `sequence`", "Header 6"), + ("## `many`", "Header 7"), + ("## `maybe`", "Header 8"), + ("## `until`", "Header 9"), + ("## `extend_if_match`", "Header 10"), + ] + + markdown_splitter = MarkdownHeaderTextSplitter( + headers_to_split_on=headers_to_split_on, strip_headers=False + ) + md_header_splits = markdown_splitter.split_text( + usage.usage_markdown + ) # file_content contains detailed description of each parser class from combinators.py + + chunk_size = 200 + chunk_overlap = 0 + text_splitter = RecursiveCharacterTextSplitter( + chunk_size=chunk_size, chunk_overlap=chunk_overlap + ) + splits = text_splitter.split_documents(md_header_splits) + + class_mapping = f""" + Try to classify each token in {tokens_str_list}, as either a + constant, identifier, delimeter, or abreviations. Tokens are from {tokens_str_list}. + + A constant token is usually a valid word, to represent some sort of Class. Constants are NEVER numbers. + A constant token is usually a valid word, to represent some sort of Class. Constants are NEVER numbers. + A constant token is usually a valid word, to represent some sort of Class. Constants are NEVER numbers. + A constant token is usually a valid word, to represent some sort of Class. Constants are NEVER numbers. + + A delimiter token is a special character. + + An identifier token is a sequence of alphanumeric characters, usually a shorter sequence, and is NOT a valid word. It can be a NUMBER. + An identifier token is a sequence of alphanumeric characters, usually a shorter sequence, and is NOT a valid word. It can be a NUMBER. + An identifier token is a sequence of alphanumeric characters, usually a shorter sequence, and is NOT a valid word. It can be a NUMBER. + + An abbreviations usually stands for another word and is usally only made up of uppercase letters. + + each token should ONLY be matched to a class, either: Constant, Identifier, Abbreviations, or Delimiter. + each token should ONLY be matched to a class, either: Constant, Identifier, Abbreviations, or Delimiter. + each token should ONLY be matched to a class, either: Constant, Identifier, Abbreviations, or Delimiter. + + No extra output. Do not provide explanations. + No extra output. Do not provide explanations. + No extra output. Do not provide explanations. + + I will give you a $100000000 dollar tip if you follow my instructions and can classify {tokens_str_list} + """ + + prompt = PromptTemplate( + template="""Answer the user query with context at {examples} + {format_instructions}\n{query}\n""", + input_variables=["query"], + partial_variables={"format_instructions": parser.get_format_instructions()}, + ) + + chain = prompt | llm | parser + + curr_tries = 0 + while curr_tries < num_tries: + try: + resp = chain.invoke({"query": class_mapping, "examples": splits}) + break + except Exception as e: + print(e) + resp = None + finally: + curr_tries += 1 + + return resp diff --git a/buildingmotif/label_parsing/tools.py b/buildingmotif/label_parsing/tools.py new file mode 100644 index 000000000..3bc1981c9 --- /dev/null +++ b/buildingmotif/label_parsing/tools.py @@ -0,0 +1,220 @@ +import subprocess +from typing import List + +import enchant + +from buildingmotif.label_parsing.combinators import abbreviations + + +class Lint_Code: + """ + Runs black in a subprocess to lint code + """ + + def _run(self, filepath: str): + """ + Lints a file with black. + """ + subprocess.run( + f"black {filepath}", + stderr=subprocess.STDOUT, + text=True, + shell=True, + timeout=3, + check=False, + ) + + +class Abbreviations_Tools: + """ + Process dictionaries or list of dictionaries by making keys uppercase, sorting by key length, and making + abbreviation parser objects. + """ + + def make_abbreviations(self, input_dict): + """ + Sorts and makes all keys uppercase in a dictionary. + + :param input_dict: Input dictionary. + :type input_dict: dict + + :return: Abbreviation parser obtained from the processed dictionary. + :rtype: abbreviation parser + """ + + sorted_points = sorted( + list(input_dict.items()), key=lambda key: len(key[0]), reverse=True + ) + processed = {ele[0].upper(): ele[1] for ele in sorted_points} + return abbreviations(processed) + + def make_combined_abbreviations(self, list_of_dicts): + """ + Combines into one dictionary. + Sorts and makes all keys uppercase for that dictionary and makes abbreviations parser. + + :param list_of_dicts: List of dictionaries. + :type list_of_dicts: List[dict] + + :return: Abbreviation parser obtained from the processed list of dictionaries. + :rtype: abbreviation parser + + """ + + combined = {} + for d in list_of_dicts: + combined.update(d) + sorted_points = sorted( + list(combined.items()), key=lambda key: len(key[0]), reverse=True + ) + processed = {ele[0].upper(): ele[1] for ele in sorted_points} + return abbreviations(processed) + + def make_combined_dict(self, list_of_dicts): + """ + Combines into one dictionary. + Sorts and makes all keys uppercase for that dictionary. + + :param list_of_dicts: List of dictionaries to process and combine. + :type list_of_dicts: List[dict] + + :return: Processed and combined dictionary. + :rtype: dict + """ + + combined = {} + for d in list_of_dicts: + combined.update(d) + sorted_points = sorted( + list(combined.items()), key=lambda key: len(key[0]), reverse=True + ) + processed = {ele[0].upper(): ele[1] for ele in sorted_points} + return processed + + +abbreviationsTool = Abbreviations_Tools() + + +class Check_Valid_Word: + """ + Checks word validity using enchant package, used for one way of detecting constants + """ + + def check_word_validity(self, input_str: str): + """ + Checks word validity using enchant package. + + :param input_str: Input string to check. + :type input_str: str + + :return: Boolean indicating whether the input string is valid and only made of letters. + :rtype: bool + """ + + d = enchant.Dict("en_US") + if d.check(input_str) and input_str.isalpha(): + return True + else: + return False + + +wordChecker = Check_Valid_Word() # instantiates word checker for use by tokenizer class + + +class Tokenizer: + """ + Tokenizes a word based on alphanumeric or special character shifts + """ + + def shift_split(self, word: str): + """ + Tokenizes a word based on alphanumeric or special character shifts. + + :param word: Input string to separate into tokens. + :type word: str + + :return: List of separated tokens. + :rtype: List[str] + """ + + word = word.replace(" ", "") + left = 0 + right = len(word) - 1 + tokened = [] + while left <= right: + curr_char = word[left] + curr_is_alpha = curr_char.isalpha() + curr_is_special = curr_char.isalnum() + + start_index = left + left += 1 + + while left <= right: + next_char = word[left] + next_is_alpha = next_char.isalpha() + next_is_special = next_char.isalnum() + if curr_is_alpha != next_is_alpha or curr_is_special != next_is_special: + break + left += 1 + + tokened.append(str(word[start_index:left])) + + return tokened + + def split_and_group(self, word: str, list_of_dicts: List): + """ + Tokenizes a word based on alphanumeric or special character shifts. Then, + apply abbreviations to find more tokens, and finally combines tokens + if they form a valid word. + + :param word: Input string to separate into tokens. + :type word: str + :param list_of_dicts: List of dictionaries mapping abbreviations to brick classes. + :type list_of_dicts: List + + :return: List of separated tokens. + :rtype: List[str] + """ + + tokens = self.shift_split(word) + arr = [] + combined_abbreviations = abbreviationsTool.make_combined_abbreviations( + list_of_dicts + ) + for group in tokens: + if not group.isalnum(): + arr.append(group) + elif combined_abbreviations(group) and not any( + r.error for r in combined_abbreviations(group) + ): + parsed_abbrev = combined_abbreviations(group)[0].value + arr.append(parsed_abbrev) + remain = group[len(parsed_abbrev) :] + if len(remain) > 0: + arr.extend(self.split_and_group(remain, list_of_dicts)) + else: + arr.append(group) + + final_groups = [] + left = 0 + right = 1 + + while right < len(arr): + if wordChecker.check_word_validity(arr[left] + arr[right]) and ( + arr[left].isalpha() and arr[right].isalpha() + ): + final_groups.append(arr[left] + arr[right]) + left += 2 + right = left + 1 + else: + final_groups.append(arr[left]) + left += 1 + right = left + 1 + if left < len(arr): + final_groups.append(arr[left]) + + return final_groups + + +codeLinter = Lint_Code() +tokenizer = Tokenizer() diff --git a/buildingmotif/label_parsing/usage.py b/buildingmotif/label_parsing/usage.py new file mode 100644 index 000000000..6ea8a1a4b --- /dev/null +++ b/buildingmotif/label_parsing/usage.py @@ -0,0 +1,172 @@ +#generated using ChatGPT 4.0 to describe function/class signatures of combinators.py contents + +usage_markdown = r""" +```markdown +# Parsing Function Signatures and Usage + +This document provides the function signatures and example usage of all subclasses of `Parser`. + +## `string` +``` +def __init__(self, s: str, type_name: TokenOrConstructor) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = string("hello", Identifier) +result = parser("hello world") +print(result) # Expected output: [TokenResult('hello', Identifier('hello'), 5)] +``` + +## `rest` +``` +def __init__(self, type_name: TokenOrConstructor) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = rest(Identifier) +result = parser("hello world") +print(result) # Expected output: [TokenResult('hello world', Identifier('hello world'), 11)] +``` + +## `substring_n` +``` +def __init__(self, length: int, type_name: TokenOrConstructor) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = substring_n(5, Identifier) +result = parser("hello world") +print(result) # Expected output: [TokenResult('hello', Identifier('hello'), 5)] +``` + +## `regex` +``` +def __init__(self, r: str, type_name: TokenOrConstructor) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = regex(r"\w+", Identifier) +result = parser("hello world") +print(result) # Expected output: [TokenResult('hello', Identifier('hello'), 5)] +``` + +## `choice` +``` +def __init__(self, *parsers: Parser) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser1 = string("hello", Identifier) +parser2 = string("hi", Identifier) +parser = choice(parser1, parser2) +result = parser("hi there") +print(result) # Expected output: [TokenResult('hi', Identifier('hi'), 2)] +``` + +## `constant` +``` +def __init__(self, type_name: Token) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = constant(Identifier("constant")) +result = parser("anything") +print(result) # Expected output: [TokenResult(None, Identifier('constant'), 0)] +``` + +## `abbreviations` +``` +def __init__(self, patterns: dict) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +patterns = {"AHU": BRICK.Air_Handling_Unit, "FCU": BRICK.Fan_Coil_Unit} +parser = abbreviations(patterns) +result = parser("AHU sensor data") +print(result) # Expected output: [TokenResult('AHU', Constant(BRICK.Air_Handling_Unit), 3)] +``` + +## `sequence` +``` +def __init__(self, *parsers: Parser) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser1 = string("hello", Identifier) +parser2 = string(" ", Delimiter) +parser3 = string("world", Identifier) +parser = sequence(parser1, parser2, parser3) +result = parser("hello world") +print(result) # Expected output: [TokenResult('hello', Identifier('hello'), 5), TokenResult(' ', Delimiter(' '), 1), TokenResult('world', Identifier('world'), 5)] +``` + +## `many` +``` +def __init__(self, seq_parser: Parser) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +item_parser = string("a", Identifier) +parser = many(item_parser) +result = parser("aaaab") +print(result) # Expected output: [TokenResult('a', Identifier('a'), 1), TokenResult('a', Identifier('a'), 1), TokenResult('a', Identifier('a'), 1), TokenResult('a', Identifier('a'), 1)] +``` + +## `maybe` +``` +def __init__(self, parser: Parser) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = maybe(string("hello", Identifier)) +result = parser("world") +print(result) # Expected output: [TokenResult(None, Null(), 0)] +``` + +## `until` +``` +def __init__(self, parser: Parser, type_name: TokenOrConstructor) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +parser = until(string("stop", Identifier), Identifier) +result = parser("hello world stop") +print(result) # Expected output: [TokenResult('hello world ', Identifier('hello world '), 12)] +``` + +## `extend_if_match` +``` +def __init__(self, parser: Parser, type_name: Token) +def __call__(self, target: str) -> List[TokenResult] +``` + +### Example Usage +```python +base_parser = string("hello", Identifier) +parser = extend_if_match(base_parser, Constant("extra_type")) +result = parser("hello world") +print(result) # Expected output: [TokenResult('hello', Identifier('hello'), 5), TokenResult(None, Constant('extra_type'), 0)] +``` +""" diff --git a/notebooks/BMS_Parser_Generation.ipynb b/notebooks/BMS_Parser_Generation.ipynb new file mode 100644 index 000000000..8779dbd1f --- /dev/null +++ b/notebooks/BMS_Parser_Generation.ipynb @@ -0,0 +1,489 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5be3a099-ee86-446a-8d5a-796e03a4555f", + "metadata": {}, + "source": [ + "# Automating Parser Generation and Easier Serialization Efforts\n", + "In this demo we cluster and parse a list of building point label data from a csv file, and package the results into a class for easier and more efficient serialization.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ba045375-26ed-433d-bb91-707ffcb95f3b", + "metadata": {}, + "outputs": [], + "source": [ + "from buildingmotif.label_parsing.serialized_parser_metrics import ParserBuilder" + ] + }, + { + "cell_type": "markdown", + "id": "cc274749-8bb6-404d-9185-22ac0f8e4d3d", + "metadata": {}, + "source": [ + "## Overview\n", + "1. **Setup SerializedParserMetrics Class**\n", + " 1. Import BuildingMOTIF and associated packages\n", + " 1. Load BuildingMOTIF Libraries\n", + " 1. Initialize ParserBuilder class with required arguements of ```csv_file_name``` and ```csv_column_name``` where point label data is located. Optionally, modify\n", + " llm_tries (llm is prompted to predict relevant classes for sections of the point label llm_tries times) and list_of_dicts\n", + "1. **View associated data of Parser Generation Process and Results**\n", + " 1. View generated parsers and their clusters\n", + " 1. View distance metrics and clustering calculations applied to each point label\n", + " 1. View packaged, serialized format of parsers, clusters, and data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "97cbaa63-53df-414f-8a15-5275554e4f49", + "metadata": {}, + "outputs": [], + "source": [ + "# instantiate ParserBuilder class, args are csv_filename and csv_column_name\n", + "built_parsers = ParserBuilder(\"point_label_examples/basic_len102.csv\", \"BuildingNames\")\n", + "\n", + "#can also accept additional args, llm_tries (defaults to 3) and list_of_dicts (list of abbreviations matched to brick classes in dictionary form, \n", + "#defaults to provided COMMON_EQUIP_ABBREVIATIONS and COMMON_POINT_ABBREVIATIONS)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "960cee28-f696-4b0d-afa5-f349a0b14c2d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'AHU': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Air_Handling_Unit'), 'FCU': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit'), 'VAV': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Variable_Air_Volume_Box'), 'CRAC': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner'), 'HX': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Heat_Exchanger'), 'PMP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Pump'), 'RVAV': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat'), 'HP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Heat_Pump'), 'RTU': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Rooftop_Unit'), 'DMP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Damper'), 'STS': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Status'), 'VLV': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Valve'), 'CHVLV': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Chilled_Water_Valve'), 'HWVLV': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Hot_Water_Valve'), 'VFD': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Variable_Frequency_Drive'), 'CT': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Cooling_Tower'), 'MAU': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Makeup_Air_Unit'), 'R': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Room'), 'A': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Air_Handling_Unit')}\n", + "{'ART': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Room_Temperature_Sensor'), 'TSP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Air_Temperature_Setpoint'), 'HSP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint'), 'CSP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint'), 'SP': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Setpoint'), 'CHWST': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor'), 'CHWRT': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor'), 'HWST': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor'), 'HWRT': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor'), 'CO': rdflib.term.URIRef('https://brickschema.org/schema/Brick#CO_Sensor'), 'CO2': rdflib.term.URIRef('https://brickschema.org/schema/Brick#CO2_Sensor'), 'T': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Temperature_Sensor'), 'FS': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Flow_Sensor'), 'PS': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Pressure_Sensor'), 'DPS': rdflib.term.URIRef('https://brickschema.org/schema/Brick#Differential_Pressure_Sensor')}\n" + ] + } + ], + "source": [ + "#print default dicts used\n", + "\n", + "for abbrev_dict in built_parsers.list_of_dicts:\n", + " print(abbrev_dict)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "edbf9803-24e2-471f-8d56-49300852016b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "all generated parsers: \n", + "parser_lencluster_7_920 = sequence(until(delimiters, Identifier), delimiters, until(COMBINED_ABBREVIATIONS, Constant), COMBINED_ABBREVIATIONS, until(delimiters, Constant), delimiters, identifier)\n", + "\n", + "\n", + "parser_lencluster_10_403 = sequence(until(delimiters, Constant), delimiters, until(COMBINED_ABBREVIATIONS, Identifier), COMBINED_ABBREVIATIONS, until(delimiters, Identifier), delimiters, regex(r\"[a-zA-Z]{1,2}\", Constant), until(delimiters, Identifier), delimiters, regex(r\"[a-zA-Z]+\", Constant))\n", + "\n", + "\n", + "parser_lencluster_12_753 = sequence(until(delimiters, Identifier), delimiters, until(COMBINED_ABBREVIATIONS, Constant), COMBINED_ABBREVIATIONS, until(delimiters, Constant), delimiters, regex(r\"[a-zA-Z0-9]{1,2}\", Identifier), until(delimiters, Constant), delimiters, until(delimiters, Constant), delimiters, regex(r\"[a-zA-Z]+\", Constant))\n", + "\n", + "\n", + "parser_noise_7_98 = sequence(until(delimiters, Constant), delimiters, until(COMBINED_ABBREVIATIONS, Identifier), COMBINED_ABBREVIATIONS, until(delimiters, Constant), delimiters, identifier)\n", + "\n", + "\n", + "parser_noise_9_929 = sequence(until(delimiters, Constant), delimiters, until(COMBINED_ABBREVIATIONS, Identifier), COMBINED_ABBREVIATIONS, until(delimiters, Identifier), delimiters, until(delimiters, Constant), delimiters, COMBINED_ABBREVIATIONS)\n", + "\n", + "\n", + "all generated clusters: \n", + "['BuildingName_02FCU503_ChwVlvPos', 'BuildingName_01FCU336_OccHtgSptFnl', 'BuildingName_02FCU510_EffOcc', 'BuildingName_02FCU507_UnoccHtgSpt', 'BuildingName_02FCU415_UnoccHtgSpt', 'BuildingName_01FCU203_OccClgSpt', 'BuildingName_01FCU365_UnoccHtgSptFnl', 'BuildingName_02FCU529_UnoccHtgSpt', 'BuildingName_01FCU243_EffOcc', 'BuildingName_01FCU362_ChwVlvPos', 'BuildingName_02FCU416_RoomTmp', 'BuildingName_01FCU391_HwVlvPos', 'BuildingName_02FCU559_UnoccHtgSpt', 'BuildingName_01FCU369_OccClgSptFnl', 'BuildingName_01FCU241_EffSysMode', 'BuildingName_01FCU343_ChwVlvPos', 'BuildingName_02FCU549_EffOcc', 'BuildingName_01FCU392_UnoccHtgSptFnl', 'BuildingName_01FCU323_OccHtgSptFnl', 'BuildingName_01FCU311_OccHtgSpt', 'BuildingName_01FCU216_EffOcc', 'BuildingName_01FCU331_SysMode', 'BuildingName_02FCU558_FanMode', 'BuildingName_01FCU285_OccClgSpt', 'BuildingName_01FCU391_FanMode', 'BuildingName_01FCU367_EffOcc', 'BuildingName_02FCU439_HwVlvPos', 'BuildingName_02FCU438_HwVlvPos', 'BuildingName_01FCU235_HwVlvPos', 'BuildingName_02FCU439_RoomTmp', 'BuildingName_01FCU239_OccHtgSpt', 'BuildingName_02FCU538_EffOcc', 'BuildingName_02FCU479_UnoccHtgSpt', 'BuildingName_01FCU292_SysMode', 'BuildingName_02FCU489_UnoccClgSpt', 'BuildingName_01FCU301_ChwVlvPos', 'BuildingName_02FCU448_ChwVlvPos', 'BuildingName_02FCU460_OccHtgSpt', 'BuildingName_01FCU319_UnoccClgSptFnl', 'BuildingName_02FCU401_OccClgSpt', 'BuildingName_01FCU311_UnoccClgSpt', 'BuildingName_01FCU261_UnoccHtgSptFnl', 'BuildingName_01FCU273_UnoccClgSpt', 'BuildingName_02FCU416_FanMode', 'BuildingName_01FCU223_OccCmd', 'BuildingName_01FCU342_UnoccHtgSpt', 'BuildingName_01FCU201_OccHtgSpt', 'BuildingName_02FCU452_EffSysMode', 'BuildingName_01FCU205_UnoccHtgSptFnl', 'BuildingName_01FCU210_UnoccHtgSptFnl', 'BuildingName_02FCU444_HwVlvPos', 'BuildingName_01FCU240_OccCmd', 'BuildingName_01FCU215_OccCmd', 'BuildingName_01FCU352_OccHtgSptFnl', 'BuildingName_01FCU307_OccHtgSptFnl', 'BuildingName_02FCU430_RoomTmp', 'BuildingName_01FCU277_OccHtgSptFnl', 'BuildingName_01FCU276_OccCmd', 'BuildingName_01FCU292_UnoccClgSpt', 'BuildingName_02FCU507_OccHtgSpt', 'BuildingName_01FCU289_UnoccClgSptFnl', 'BuildingName_01FCU285_OccClgSptFnl', 'BuildingName_01FCU255_UnoccHtgSpt', 'BuildingName_01FCU282_UnoccHtgSptFnl', 'BuildingName_02FCU503_OccClgSpt', 'BuildingName_02FCU525_UnoccHtgSpt', 'BuildingName_01FCU283_OccClgSpt', 'BuildingName_02FCU465_FanMode', 'BuildingName_02FCU530_ChwVlvPos', 'BuildingName_01FCU225_UnoccHtgSpt', 'BuildingName_01FDU123_UnoccHtgSpt']\n", + "\n", + "\n", + "['BuildingName_02FCU521_UO11_HwVlvOut', 'BuildingName_02FCU539_UO12_ChwVlvOut', 'BuildingName_02FCU428_BO4_HighSpdFanOut', 'BuildingName_01FCU262_UI22_SaTmp', 'BuildingName_02FCU448_UO11_HwVlvOut', 'BuildingName_01FCU255_UI22_SaTmp', 'BuildingName_02FCU543_UI22_SaTmp', 'BuildingName_01FCU376_UI22_SaTmp', 'BuildingName_01FCU313_BO4_HighSpdFanOut', 'BuildingName_01FCU227_BO4_HighSpdFanOut', 'BuildingName_02FCU555_UO12_ChwVlvOut', 'BuildingName_01FCU331_UO12_ChwVlvOut', 'BuildingName_02FCU531_BO4_HighSpdFanOut', 'BuildingName_02FCU485_UO11_HwVlvOut', 'BuildingName_02FCU438_UO11_HwVlvOut', 'BuildingName_01FCU373_UO11_HwVlvOut', 'BuildingName_01FCU273_UI22_SaTmp', 'BuildingName_01FCU364_UO11_HwVlvOut', 'BuildingName_02FCU505_BO4_HighSpdFanOut', 'BuildingName_02FCU563_BO4_HighSpdFanOut', 'BuildingName_02FCU444_UO12_ChwVlvOut']\n", + "\n", + "\n", + "['BuildingName_02FCU415_UI17_Fan_Status', 'BuildingName_01FCU242_UI17_Fan_Status', 'BuildingName_01FCU205_UI17_Fan_Status', 'BuildingName_01FCU213_UI17_Fan_Status', 'BuildingName_02FCU481_UI17_Fan_Status', 'BuildingName_02FCU555_UI17_Fan_Status', 'BuildingName_01FCU254_UI17_Fan_Status', 'BuildingName_02FCU486_UI17_Fan_Status']\n", + "\n", + "\n", + "['BuildingName_01FCU180B_UnoccClgSptFnl']\n", + "\n", + "\n", + "['BuildingName_02FCU539_Room_RH']\n", + "\n", + "\n" + ] + } + ], + "source": [ + "print(\"all generated parsers: \")\n", + "for parser in built_parsers.parsers:\n", + " print(parser)\n", + " print(\"\\n\")\n", + "\n", + "print(\"all generated clusters: \")\n", + "for cluster in built_parsers.clusters:\n", + " print(cluster)\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "9f502e95-2f21-4a69-b21f-ce2ac49886cf", + "metadata": {}, + "source": [ + "### Potential Abbreviations\n", + "The LLM (Ollama3) is asked to classify tokens from each point label as either: constants, identifiers, abbreviations, or delimiters. If the LLM **predicts** a token to be an abbreviation and it is **not** found in the provided list_of_dicts, then it will be added to this list." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9c5a27fc-fdb3-410e-8bfe-44e763064681", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "potential abbreviations: []\n" + ] + } + ], + "source": [ + "print(\"potential abbreviations: \", built_parsers.flagged_abbreviations)" + ] + }, + { + "cell_type": "markdown", + "id": "8daf55aa-9c74-4f28-b2f3-c41d5f0ccd3e", + "metadata": {}, + "source": [ + "### Distance Metric\n", + "Tokens were classified into **3 types** based on their composition: characters, numbers, and special characters. The developed metric compares the tokens from a pair of point labels, computing a ratio for the amount of **identical classified tokens over the amount of tokens in the longer point label**. The range is from **0 (no similarity) to 1 (identical similarity).** This approach is helpful for evaluating parser performance because tokens are parsed in sequence, so the order of tokens is important." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "be0cdd16-dc03-4704-98d6-39a7745bd4a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "distance matrix statistics: \n", + "mean 0.8501318937160921\n", + "median 1.0\n", + "std 0.16728128336649273\n", + "min 0.4166666666666667\n", + "max 1.0\n", + "range 0.5833333333333333\n" + ] + } + ], + "source": [ + "print(\"distance matrix statistics: \")\n", + "for k, v in built_parsers.distance_metrics.items():\n", + " print(k, v)" + ] + }, + { + "cell_type": "markdown", + "id": "7e12a58f-2361-4046-ad0f-187d68cd21d5", + "metadata": {}, + "source": [ + "### Clustering\n", + "Density-based spatial clustering of applications with noise (DBSCAN) was used for clustering, grouping the most **similar** point labels together to optimize parser generation and the quality of the emitted tokens from applying the parser." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "918577c0-1a2a-44cb-9bd8-83a52289275d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "clustering info statistics: \n", + "clusters 3\n", + "noise_points 2\n", + "clustering_score 0.9803685207905768\n" + ] + } + ], + "source": [ + "print(\"clustering info statistics: \")\n", + "for k, v in built_parsers.clustering_metrics.items():\n", + " print(k, v)" + ] + }, + { + "cell_type": "markdown", + "id": "761017ae-0c37-4d4c-8a43-a1fd225a269c", + "metadata": {}, + "source": [ + "### Combine Parsers and Obtain Parser Metrics\n", + "We will call ```combine_parsers_and_get_metrics()``` in ```ParserBuilder``` to emit an instance of the ```ParserMetrics``` class that serializes each parser and captures metrics for each parser ran on its cluster" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "7b562e15-95b2-4a90-9f0b-8436f5f474c5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total parsed: 101\n", + "total unparsed: 1\n", + "total point labels: 102\n" + ] + } + ], + "source": [ + "metrics = built_parsers.combine_parsers_and_get_metrics()\n", + "\n", + "print(\"total parsed: \", metrics.parsed_count)\n", + "print(\"total unparsed: \",metrics.unparsed_count)\n", + "print(\"total point labels: \",metrics.total_count)" + ] + }, + { + "cell_type": "markdown", + "id": "a1919c56-ae11-40bc-aff6-549275e0737e", + "metadata": {}, + "source": [ + "### Serialized Parsers\n", + "We can also get all serialized parsers from the ```ParserMetrics``` class, as each parser " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "53ad93ef-b6e9-47e9-a3bd-ff4bdfbccfa9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z0-9]+', 'type_name': {'token': 'Identifier'}}}]}}\n", + "\n", + "\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z]{1,2}', 'type_name': {'token': 'Constant'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z]+', 'type_name': {'token': 'Constant'}}}]}}\n", + "\n", + "\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z0-9]{1,2}', 'type_name': {'token': 'Identifier'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z]+', 'type_name': {'token': 'Constant'}}}]}}\n", + "\n", + "\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z0-9]+', 'type_name': {'token': 'Identifier'}}}]}}\n", + "\n", + "\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}]}}\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for serializedParser in metrics.serializers_list:\n", + " print(serializedParser)\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "6b10f26d-2c5f-419f-aa2b-aaddf0928c13", + "metadata": {}, + "source": [ + "## All Together\n", + "Now that we have seen the results of the parser generation/clustering process and associated metrics, we neatly package all the the data into a class attribute (a list of dictionaries that contains information about each cluster) for easier access" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "aa23ff36-6ee5-49b3-80a5-35f97dee6193", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "serialized_parser\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z0-9]+', 'type_name': {'token': 'Identifier'}}}]}}\n", + "\n", + "\n", + "source_code\n", + "parser_lencluster_7_920 = sequence(until(delimiters, Identifier), delimiters, until(COMBINED_ABBREVIATIONS, Constant), COMBINED_ABBREVIATIONS, until(delimiters, Constant), delimiters, identifier)\n", + "\n", + "\n", + "parsed_labels\n", + "['BuildingName_02FCU503_ChwVlvPos', 'BuildingName_01FCU336_OccHtgSptFnl', 'BuildingName_02FCU510_EffOcc', 'BuildingName_02FCU507_UnoccHtgSpt', 'BuildingName_02FCU415_UnoccHtgSpt', 'BuildingName_01FCU203_OccClgSpt', 'BuildingName_01FCU365_UnoccHtgSptFnl', 'BuildingName_02FCU529_UnoccHtgSpt', 'BuildingName_01FCU243_EffOcc', 'BuildingName_01FCU362_ChwVlvPos', 'BuildingName_02FCU416_RoomTmp', 'BuildingName_01FCU391_HwVlvPos', 'BuildingName_02FCU559_UnoccHtgSpt', 'BuildingName_01FCU369_OccClgSptFnl', 'BuildingName_01FCU241_EffSysMode', 'BuildingName_01FCU343_ChwVlvPos', 'BuildingName_02FCU549_EffOcc', 'BuildingName_01FCU392_UnoccHtgSptFnl', 'BuildingName_01FCU323_OccHtgSptFnl', 'BuildingName_01FCU311_OccHtgSpt', 'BuildingName_01FCU216_EffOcc', 'BuildingName_01FCU331_SysMode', 'BuildingName_02FCU558_FanMode', 'BuildingName_01FCU285_OccClgSpt', 'BuildingName_01FCU391_FanMode', 'BuildingName_01FCU367_EffOcc', 'BuildingName_02FCU439_HwVlvPos', 'BuildingName_02FCU438_HwVlvPos', 'BuildingName_01FCU235_HwVlvPos', 'BuildingName_02FCU439_RoomTmp', 'BuildingName_01FCU239_OccHtgSpt', 'BuildingName_02FCU538_EffOcc', 'BuildingName_02FCU479_UnoccHtgSpt', 'BuildingName_01FCU292_SysMode', 'BuildingName_02FCU489_UnoccClgSpt', 'BuildingName_01FCU301_ChwVlvPos', 'BuildingName_02FCU448_ChwVlvPos', 'BuildingName_02FCU460_OccHtgSpt', 'BuildingName_01FCU319_UnoccClgSptFnl', 'BuildingName_02FCU401_OccClgSpt', 'BuildingName_01FCU311_UnoccClgSpt', 'BuildingName_01FCU261_UnoccHtgSptFnl', 'BuildingName_01FCU273_UnoccClgSpt', 'BuildingName_02FCU416_FanMode', 'BuildingName_01FCU223_OccCmd', 'BuildingName_01FCU342_UnoccHtgSpt', 'BuildingName_01FCU201_OccHtgSpt', 'BuildingName_02FCU452_EffSysMode', 'BuildingName_01FCU205_UnoccHtgSptFnl', 'BuildingName_01FCU210_UnoccHtgSptFnl', 'BuildingName_02FCU444_HwVlvPos', 'BuildingName_01FCU240_OccCmd', 'BuildingName_01FCU215_OccCmd', 'BuildingName_01FCU352_OccHtgSptFnl', 'BuildingName_01FCU307_OccHtgSptFnl', 'BuildingName_02FCU430_RoomTmp', 'BuildingName_01FCU277_OccHtgSptFnl', 'BuildingName_01FCU276_OccCmd', 'BuildingName_01FCU292_UnoccClgSpt', 'BuildingName_02FCU507_OccHtgSpt', 'BuildingName_01FCU289_UnoccClgSptFnl', 'BuildingName_01FCU285_OccClgSptFnl', 'BuildingName_01FCU255_UnoccHtgSpt', 'BuildingName_01FCU282_UnoccHtgSptFnl', 'BuildingName_02FCU503_OccClgSpt', 'BuildingName_02FCU525_UnoccHtgSpt', 'BuildingName_01FCU283_OccClgSpt', 'BuildingName_02FCU465_FanMode', 'BuildingName_02FCU530_ChwVlvPos', 'BuildingName_01FCU225_UnoccHtgSpt']\n", + "\n", + "\n", + "unparsed_labels\n", + "['BuildingName_01FDU123_UnoccHtgSpt']\n", + "\n", + "\n", + "tokens\n", + "[[TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='503', token=Constant(value='503'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvPos', token=Identifier(value='ChwVlvPos'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='336', token=Constant(value='336'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSptFnl', token=Identifier(value='OccHtgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='510', token=Constant(value='510'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffOcc', token=Identifier(value='EffOcc'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='507', token=Constant(value='507'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='415', token=Constant(value='415'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='203', token=Constant(value='203'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSpt', token=Identifier(value='OccClgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='365', token=Constant(value='365'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSptFnl', token=Identifier(value='UnoccHtgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='529', token=Constant(value='529'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='243', token=Constant(value='243'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffOcc', token=Identifier(value='EffOcc'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='362', token=Constant(value='362'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvPos', token=Identifier(value='ChwVlvPos'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='416', token=Constant(value='416'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='RoomTmp', token=Identifier(value='RoomTmp'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='391', token=Constant(value='391'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvPos', token=Identifier(value='HwVlvPos'), length=8, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='559', token=Constant(value='559'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='369', token=Constant(value='369'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSptFnl', token=Identifier(value='OccClgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='241', token=Constant(value='241'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffSysMode', token=Identifier(value='EffSysMode'), length=10, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='343', token=Constant(value='343'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvPos', token=Identifier(value='ChwVlvPos'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='549', token=Constant(value='549'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffOcc', token=Identifier(value='EffOcc'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='392', token=Constant(value='392'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSptFnl', token=Identifier(value='UnoccHtgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='323', token=Constant(value='323'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSptFnl', token=Identifier(value='OccHtgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='311', token=Constant(value='311'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSpt', token=Identifier(value='OccHtgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='216', token=Constant(value='216'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffOcc', token=Identifier(value='EffOcc'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='331', token=Constant(value='331'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SysMode', token=Identifier(value='SysMode'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='558', token=Constant(value='558'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='FanMode', token=Identifier(value='FanMode'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='285', token=Constant(value='285'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSpt', token=Identifier(value='OccClgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='391', token=Constant(value='391'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='FanMode', token=Identifier(value='FanMode'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='367', token=Constant(value='367'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffOcc', token=Identifier(value='EffOcc'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='439', token=Constant(value='439'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvPos', token=Identifier(value='HwVlvPos'), length=8, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='438', token=Constant(value='438'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvPos', token=Identifier(value='HwVlvPos'), length=8, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='235', token=Constant(value='235'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvPos', token=Identifier(value='HwVlvPos'), length=8, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='439', token=Constant(value='439'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='RoomTmp', token=Identifier(value='RoomTmp'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='239', token=Constant(value='239'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSpt', token=Identifier(value='OccHtgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='538', token=Constant(value='538'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffOcc', token=Identifier(value='EffOcc'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='479', token=Constant(value='479'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='292', token=Constant(value='292'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SysMode', token=Identifier(value='SysMode'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='489', token=Constant(value='489'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSpt', token=Identifier(value='UnoccClgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='301', token=Constant(value='301'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvPos', token=Identifier(value='ChwVlvPos'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='448', token=Constant(value='448'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvPos', token=Identifier(value='ChwVlvPos'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='460', token=Constant(value='460'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSpt', token=Identifier(value='OccHtgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='319', token=Constant(value='319'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSptFnl', token=Identifier(value='UnoccClgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='401', token=Constant(value='401'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSpt', token=Identifier(value='OccClgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='311', token=Constant(value='311'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSpt', token=Identifier(value='UnoccClgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='261', token=Constant(value='261'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSptFnl', token=Identifier(value='UnoccHtgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='273', token=Constant(value='273'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSpt', token=Identifier(value='UnoccClgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='416', token=Constant(value='416'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='FanMode', token=Identifier(value='FanMode'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='223', token=Constant(value='223'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccCmd', token=Identifier(value='OccCmd'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='342', token=Constant(value='342'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='201', token=Constant(value='201'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSpt', token=Identifier(value='OccHtgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='452', token=Constant(value='452'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='EffSysMode', token=Identifier(value='EffSysMode'), length=10, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='205', token=Constant(value='205'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSptFnl', token=Identifier(value='UnoccHtgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='210', token=Constant(value='210'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSptFnl', token=Identifier(value='UnoccHtgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='444', token=Constant(value='444'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvPos', token=Identifier(value='HwVlvPos'), length=8, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='240', token=Constant(value='240'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccCmd', token=Identifier(value='OccCmd'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='215', token=Constant(value='215'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccCmd', token=Identifier(value='OccCmd'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='352', token=Constant(value='352'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSptFnl', token=Identifier(value='OccHtgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='307', token=Constant(value='307'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSptFnl', token=Identifier(value='OccHtgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='430', token=Constant(value='430'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='RoomTmp', token=Identifier(value='RoomTmp'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='277', token=Constant(value='277'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSptFnl', token=Identifier(value='OccHtgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='276', token=Constant(value='276'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccCmd', token=Identifier(value='OccCmd'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='292', token=Constant(value='292'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSpt', token=Identifier(value='UnoccClgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='507', token=Constant(value='507'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccHtgSpt', token=Identifier(value='OccHtgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='289', token=Constant(value='289'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSptFnl', token=Identifier(value='UnoccClgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='285', token=Constant(value='285'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSptFnl', token=Identifier(value='OccClgSptFnl'), length=12, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='255', token=Constant(value='255'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='282', token=Constant(value='282'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSptFnl', token=Identifier(value='UnoccHtgSptFnl'), length=14, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='503', token=Constant(value='503'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSpt', token=Identifier(value='OccClgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='525', token=Constant(value='525'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='283', token=Constant(value='283'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='OccClgSpt', token=Identifier(value='OccClgSpt'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='465', token=Constant(value='465'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='FanMode', token=Identifier(value='FanMode'), length=7, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='530', token=Constant(value='530'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvPos', token=Identifier(value='ChwVlvPos'), length=9, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='225', token=Constant(value='225'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccHtgSpt', token=Identifier(value='UnoccHtgSpt'), length=11, error=None)]]\n", + "\n", + "\n", + "parser_metrics\n", + "{'parsed_count': 70, 'unparsed_count': 1, 'total_count': 71}\n", + "\n", + "\n", + "serialized_parser\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z]{1,2}', 'type_name': {'token': 'Constant'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z]+', 'type_name': {'token': 'Constant'}}}]}}\n", + "\n", + "\n", + "source_code\n", + "parser_lencluster_10_403 = sequence(until(delimiters, Constant), delimiters, until(COMBINED_ABBREVIATIONS, Identifier), COMBINED_ABBREVIATIONS, until(delimiters, Identifier), delimiters, regex(r\"[a-zA-Z]{1,2}\", Constant), until(delimiters, Identifier), delimiters, regex(r\"[a-zA-Z]+\", Constant))\n", + "\n", + "\n", + "parsed_labels\n", + "['BuildingName_02FCU521_UO11_HwVlvOut', 'BuildingName_02FCU539_UO12_ChwVlvOut', 'BuildingName_02FCU428_BO4_HighSpdFanOut', 'BuildingName_01FCU262_UI22_SaTmp', 'BuildingName_02FCU448_UO11_HwVlvOut', 'BuildingName_01FCU255_UI22_SaTmp', 'BuildingName_02FCU543_UI22_SaTmp', 'BuildingName_01FCU376_UI22_SaTmp', 'BuildingName_01FCU313_BO4_HighSpdFanOut', 'BuildingName_01FCU227_BO4_HighSpdFanOut', 'BuildingName_02FCU555_UO12_ChwVlvOut', 'BuildingName_01FCU331_UO12_ChwVlvOut', 'BuildingName_02FCU531_BO4_HighSpdFanOut', 'BuildingName_02FCU485_UO11_HwVlvOut', 'BuildingName_02FCU438_UO11_HwVlvOut', 'BuildingName_01FCU373_UO11_HwVlvOut', 'BuildingName_01FCU273_UI22_SaTmp', 'BuildingName_01FCU364_UO11_HwVlvOut', 'BuildingName_02FCU505_BO4_HighSpdFanOut', 'BuildingName_02FCU563_BO4_HighSpdFanOut', 'BuildingName_02FCU444_UO12_ChwVlvOut']\n", + "\n", + "\n", + "unparsed_labels\n", + "[]\n", + "\n", + "\n", + "tokens\n", + "[[TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='521', token=Identifier(value='521'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='11', token=Identifier(value='11'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvOut', token=Constant(value='HwVlvOut'), length=8, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='539', token=Identifier(value='539'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='12', token=Identifier(value='12'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvOut', token=Constant(value='ChwVlvOut'), length=9, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='428', token=Identifier(value='428'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='BO', token=Constant(value='BO'), length=2, error=None), TokenResult(value='4', token=Identifier(value='4'), length=1, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HighSpdFanOut', token=Constant(value='HighSpdFanOut'), length=13, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='262', token=Identifier(value='262'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Constant(value='UI'), length=2, error=None), TokenResult(value='22', token=Identifier(value='22'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SaTmp', token=Constant(value='SaTmp'), length=5, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='448', token=Identifier(value='448'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='11', token=Identifier(value='11'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvOut', token=Constant(value='HwVlvOut'), length=8, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='255', token=Identifier(value='255'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Constant(value='UI'), length=2, error=None), TokenResult(value='22', token=Identifier(value='22'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SaTmp', token=Constant(value='SaTmp'), length=5, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='543', token=Identifier(value='543'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Constant(value='UI'), length=2, error=None), TokenResult(value='22', token=Identifier(value='22'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SaTmp', token=Constant(value='SaTmp'), length=5, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='376', token=Identifier(value='376'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Constant(value='UI'), length=2, error=None), TokenResult(value='22', token=Identifier(value='22'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SaTmp', token=Constant(value='SaTmp'), length=5, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='313', token=Identifier(value='313'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='BO', token=Constant(value='BO'), length=2, error=None), TokenResult(value='4', token=Identifier(value='4'), length=1, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HighSpdFanOut', token=Constant(value='HighSpdFanOut'), length=13, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='227', token=Identifier(value='227'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='BO', token=Constant(value='BO'), length=2, error=None), TokenResult(value='4', token=Identifier(value='4'), length=1, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HighSpdFanOut', token=Constant(value='HighSpdFanOut'), length=13, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='555', token=Identifier(value='555'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='12', token=Identifier(value='12'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvOut', token=Constant(value='ChwVlvOut'), length=9, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='331', token=Identifier(value='331'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='12', token=Identifier(value='12'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvOut', token=Constant(value='ChwVlvOut'), length=9, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='531', token=Identifier(value='531'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='BO', token=Constant(value='BO'), length=2, error=None), TokenResult(value='4', token=Identifier(value='4'), length=1, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HighSpdFanOut', token=Constant(value='HighSpdFanOut'), length=13, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='485', token=Identifier(value='485'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='11', token=Identifier(value='11'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvOut', token=Constant(value='HwVlvOut'), length=8, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='438', token=Identifier(value='438'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='11', token=Identifier(value='11'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvOut', token=Constant(value='HwVlvOut'), length=8, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='373', token=Identifier(value='373'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='11', token=Identifier(value='11'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvOut', token=Constant(value='HwVlvOut'), length=8, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='273', token=Identifier(value='273'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Constant(value='UI'), length=2, error=None), TokenResult(value='22', token=Identifier(value='22'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='SaTmp', token=Constant(value='SaTmp'), length=5, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='364', token=Identifier(value='364'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='11', token=Identifier(value='11'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HwVlvOut', token=Constant(value='HwVlvOut'), length=8, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='505', token=Identifier(value='505'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='BO', token=Constant(value='BO'), length=2, error=None), TokenResult(value='4', token=Identifier(value='4'), length=1, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HighSpdFanOut', token=Constant(value='HighSpdFanOut'), length=13, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='563', token=Identifier(value='563'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='BO', token=Constant(value='BO'), length=2, error=None), TokenResult(value='4', token=Identifier(value='4'), length=1, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='HighSpdFanOut', token=Constant(value='HighSpdFanOut'), length=13, error=None)], [TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='444', token=Identifier(value='444'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UO', token=Constant(value='UO'), length=2, error=None), TokenResult(value='12', token=Identifier(value='12'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='ChwVlvOut', token=Constant(value='ChwVlvOut'), length=9, error=None)]]\n", + "\n", + "\n", + "parser_metrics\n", + "{'parsed_count': 21, 'unparsed_count': 0, 'total_count': 21}\n", + "\n", + "\n", + "serialized_parser\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z0-9]{1,2}', 'type_name': {'token': 'Identifier'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z]+', 'type_name': {'token': 'Constant'}}}]}}\n", + "\n", + "\n", + "source_code\n", + "parser_lencluster_12_753 = sequence(until(delimiters, Identifier), delimiters, until(COMBINED_ABBREVIATIONS, Constant), COMBINED_ABBREVIATIONS, until(delimiters, Constant), delimiters, regex(r\"[a-zA-Z0-9]{1,2}\", Identifier), until(delimiters, Constant), delimiters, until(delimiters, Constant), delimiters, regex(r\"[a-zA-Z]+\", Constant))\n", + "\n", + "\n", + "parsed_labels\n", + "['BuildingName_02FCU415_UI17_Fan_Status', 'BuildingName_01FCU242_UI17_Fan_Status', 'BuildingName_01FCU205_UI17_Fan_Status', 'BuildingName_01FCU213_UI17_Fan_Status', 'BuildingName_02FCU481_UI17_Fan_Status', 'BuildingName_02FCU555_UI17_Fan_Status', 'BuildingName_01FCU254_UI17_Fan_Status', 'BuildingName_02FCU486_UI17_Fan_Status']\n", + "\n", + "\n", + "unparsed_labels\n", + "[]\n", + "\n", + "\n", + "tokens\n", + "[[TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='415', token=Constant(value='415'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='242', token=Constant(value='242'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='205', token=Constant(value='205'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='213', token=Constant(value='213'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='481', token=Constant(value='481'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='555', token=Constant(value='555'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Constant(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='254', token=Constant(value='254'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)], [TokenResult(value='BuildingName', token=Identifier(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Constant(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='486', token=Constant(value='486'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UI', token=Identifier(value='UI'), length=2, error=None), TokenResult(value='17', token=Constant(value='17'), length=2, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Fan', token=Constant(value='Fan'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Status', token=Constant(value='Status'), length=6, error=None)]]\n", + "\n", + "\n", + "parser_metrics\n", + "{'parsed_count': 8, 'unparsed_count': 0, 'total_count': 8}\n", + "\n", + "\n", + "serialized_parser\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'regex', 'args': {'r': '[a-zA-Z0-9]+', 'type_name': {'token': 'Identifier'}}}]}}\n", + "\n", + "\n", + "source_code\n", + "parser_noise_7_98 = sequence(until(delimiters, Constant), delimiters, until(COMBINED_ABBREVIATIONS, Identifier), COMBINED_ABBREVIATIONS, until(delimiters, Constant), delimiters, identifier)\n", + "\n", + "\n", + "parsed_labels\n", + "['BuildingName_01FCU180B_UnoccClgSptFnl']\n", + "\n", + "\n", + "unparsed_labels\n", + "[]\n", + "\n", + "\n", + "tokens\n", + "[[TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='01', token=Identifier(value='01'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='180B', token=Constant(value='180B'), length=4, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='UnoccClgSptFnl', token=Identifier(value='UnoccClgSptFnl'), length=14, error=None)]]\n", + "\n", + "\n", + "parser_metrics\n", + "{'parsed_count': 1, 'unparsed_count': 0, 'total_count': 1}\n", + "\n", + "\n", + "serialized_parser\n", + "{'parser': 'sequence', 'args': {'parsers': [{'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Identifier'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'until', 'args': {'parser': {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, 'type_name': {'token': 'Constant'}}}, {'parser': 'regex', 'args': {'r': '[._&:/\\\\- ]', 'type_name': {'token': 'Delimiter'}}}, {'parser': 'abbreviations', 'args': {'patterns': {'CHVLV': 'https://brickschema.org/schema/Brick#Chilled_Water_Valve', 'HWVLV': 'https://brickschema.org/schema/Brick#Hot_Water_Valve', 'CHWST': 'https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor', 'CHWRT': 'https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor', 'CRAC': 'https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioner', 'RVAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat', 'HWST': 'https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor', 'HWRT': 'https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor', 'AHU': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'FCU': 'https://brickschema.org/schema/Brick#Fan_Coil_Unit', 'VAV': 'https://brickschema.org/schema/Brick#Variable_Air_Volume_Box', 'PMP': 'https://brickschema.org/schema/Brick#Pump', 'RTU': 'https://brickschema.org/schema/Brick#Rooftop_Unit', 'DMP': 'https://brickschema.org/schema/Brick#Damper', 'STS': 'https://brickschema.org/schema/Brick#Status', 'VLV': 'https://brickschema.org/schema/Brick#Valve', 'VFD': 'https://brickschema.org/schema/Brick#Variable_Frequency_Drive', 'MAU': 'https://brickschema.org/schema/Brick#Makeup_Air_Unit', 'ART': 'https://brickschema.org/schema/Brick#Room_Temperature_Sensor', 'TSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Setpoint', 'HSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Heating_Setpoint', 'CSP': 'https://brickschema.org/schema/Brick#Air_Temperature_Cooling_Setpoint', 'CO2': 'https://brickschema.org/schema/Brick#CO2_Sensor', 'DPS': 'https://brickschema.org/schema/Brick#Differential_Pressure_Sensor', 'HX': 'https://brickschema.org/schema/Brick#Heat_Exchanger', 'HP': 'https://brickschema.org/schema/Brick#Heat_Pump', 'CT': 'https://brickschema.org/schema/Brick#Cooling_Tower', 'SP': 'https://brickschema.org/schema/Brick#Setpoint', 'CO': 'https://brickschema.org/schema/Brick#CO_Sensor', 'FS': 'https://brickschema.org/schema/Brick#Flow_Sensor', 'PS': 'https://brickschema.org/schema/Brick#Pressure_Sensor', 'R': 'https://brickschema.org/schema/Brick#Room', 'A': 'https://brickschema.org/schema/Brick#Air_Handling_Unit', 'T': 'https://brickschema.org/schema/Brick#Temperature_Sensor'}}}]}}\n", + "\n", + "\n", + "source_code\n", + "parser_noise_9_929 = sequence(until(delimiters, Constant), delimiters, until(COMBINED_ABBREVIATIONS, Identifier), COMBINED_ABBREVIATIONS, until(delimiters, Identifier), delimiters, until(delimiters, Constant), delimiters, COMBINED_ABBREVIATIONS)\n", + "\n", + "\n", + "parsed_labels\n", + "['BuildingName_02FCU539_Room_RH']\n", + "\n", + "\n", + "unparsed_labels\n", + "[]\n", + "\n", + "\n", + "tokens\n", + "[[TokenResult(value='BuildingName', token=Constant(value='BuildingName'), length=12, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='02', token=Identifier(value='02'), length=2, error=None), TokenResult(value='FCU', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Fan_Coil_Unit')), length=3, error=None), TokenResult(value='539', token=Identifier(value='539'), length=3, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='Room', token=Constant(value='Room'), length=4, error=None), TokenResult(value='_', token=Delimiter(value='_'), length=1, error=None), TokenResult(value='R', token=Constant(value=rdflib.term.URIRef('https://brickschema.org/schema/Brick#Room')), length=1, error=None)]]\n", + "\n", + "\n", + "parser_metrics\n", + "{'parsed_count': 1, 'unparsed_count': 0, 'total_count': 1}\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for cluster_dict in metrics.combined_clusters:\n", + " for k, v in cluster_dict.items():\n", + " print(k)\n", + " print(v)\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "832bd4c5-4eaa-4bb2-856a-351201323c67", + "metadata": {}, + "source": [ + "**Each `cluster_dict` contains:**\n", + "\n", + "1. **Serialized** parser\n", + "2. **Source code** for parser\n", + "3. **Parsed** point labels list\n", + "4. **Emitted tokens** from running parser on its cluster\n", + "5. **Unparsed** point labels list\n", + "6. **Parser Metrics** (how many parsed/unparsed/total in that cluster)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/point_label_examples/basic.csv b/notebooks/point_label_examples/basic.csv new file mode 100644 index 000000000..57a45e70a --- /dev/null +++ b/notebooks/point_label_examples/basic.csv @@ -0,0 +1,3 @@ +BuildingNames +:BuildingName_02:FCU503_ChwVlvPos +:BuildingName_01:FCU336_OccHtgSptFnl \ No newline at end of file diff --git a/notebooks/point_label_examples/basic_len102.csv b/notebooks/point_label_examples/basic_len102.csv new file mode 100644 index 000000000..ebed75352 --- /dev/null +++ b/notebooks/point_label_examples/basic_len102.csv @@ -0,0 +1,103 @@ +ID,BuildingNames +1,BuildingName_02FCU503_ChwVlvPos +2,BuildingName_01FCU336_OccHtgSptFnl +3,BuildingName_02FCU510_EffOcc +4,BuildingName_02FCU507_UnoccHtgSpt +5,BuildingName_02FCU415_UnoccHtgSpt +6,BuildingName_01FCU203_OccClgSpt +7,BuildingName_02FCU521_UO11_HwVlvOut +8,BuildingName_01FCU365_UnoccHtgSptFnl +9,BuildingName_02FCU529_UnoccHtgSpt +10,BuildingName_01FCU243_EffOcc +11,BuildingName_01FCU362_ChwVlvPos +12,BuildingName_01FCU180B_UnoccClgSptFnl +13,BuildingName_02FCU539_UO12_ChwVlvOut +14,BuildingName_02FCU428_BO4_HighSpdFanOut +15,BuildingName_02FCU416_RoomTmp +16,BuildingName_02FCU415_UI17_Fan_Status +17,BuildingName_01FCU391_HwVlvPos +18,BuildingName_02FCU559_UnoccHtgSpt +19,BuildingName_01FCU262_UI22_SaTmp +20,BuildingName_02FCU448_UO11_HwVlvOut +21,BuildingName_01FCU369_OccClgSptFnl +22,BuildingName_01FCU255_UI22_SaTmp +23,BuildingName_02FCU543_UI22_SaTmp +24,BuildingName_01FCU376_UI22_SaTmp +25,BuildingName_01FCU241_EffSysMode +26,BuildingName_01FCU343_ChwVlvPos +27,BuildingName_01FCU313_BO4_HighSpdFanOut +28,BuildingName_02FCU549_EffOcc +29,BuildingName_01FCU242_UI17_Fan_Status +30,BuildingName_01FCU392_UnoccHtgSptFnl +31,BuildingName_01FCU323_OccHtgSptFnl +32,BuildingName_01FCU311_OccHtgSpt +33,BuildingName_01FCU216_EffOcc +34,BuildingName_01FCU331_SysMode +35,BuildingName_02FCU558_FanMode +36,BuildingName_01FCU227_BO4_HighSpdFanOut +37,BuildingName_01FCU285_OccClgSpt +38,BuildingName_01FCU391_FanMode +39,BuildingName_01FCU367_EffOcc +40,BuildingName_02FCU439_HwVlvPos +41,BuildingName_02FCU438_HwVlvPos +42,BuildingName_01FCU235_HwVlvPos +43,BuildingName_02FCU439_RoomTmp +44,BuildingName_01FCU205_UI17_Fan_Status +45,BuildingName_01FCU239_OccHtgSpt +46,BuildingName_02FCU538_EffOcc +47,BuildingName_02FCU479_UnoccHtgSpt +48,BuildingName_01FCU292_SysMode +49,BuildingName_02FCU555_UO12_ChwVlvOut +50,BuildingName_02FCU489_UnoccClgSpt +51,BuildingName_01FCU331_UO12_ChwVlvOut +52,BuildingName_01FCU301_ChwVlvPos +53,BuildingName_02FCU448_ChwVlvPos +54,BuildingName_02FCU460_OccHtgSpt +55,BuildingName_01FCU319_UnoccClgSptFnl +56,BuildingName_02FCU401_OccClgSpt +57,BuildingName_01FCU311_UnoccClgSpt +58,BuildingName_01FCU261_UnoccHtgSptFnl +59,BuildingName_01FCU273_UnoccClgSpt +60,BuildingName_02FCU531_BO4_HighSpdFanOut +61,BuildingName_02FCU416_FanMode +62,BuildingName_01FCU223_OccCmd +63,BuildingName_01FCU342_UnoccHtgSpt +64,BuildingName_02FCU485_UO11_HwVlvOut +65,BuildingName_01FCU201_OccHtgSpt +66,BuildingName_02FCU438_UO11_HwVlvOut +67,BuildingName_02FCU539_Room_RH +68,BuildingName_02FCU452_EffSysMode +69,BuildingName_01FCU205_UnoccHtgSptFnl +70,BuildingName_01FCU210_UnoccHtgSptFnl +71,BuildingName_02FCU444_HwVlvPos +72,BuildingName_01FCU240_OccCmd +73,BuildingName_01FCU215_OccCmd +74,BuildingName_01FCU373_UO11_HwVlvOut +75,BuildingName_01FCU273_UI22_SaTmp +76,BuildingName_01FCU352_OccHtgSptFnl +77,BuildingName_01FCU307_OccHtgSptFnl +78,BuildingName_02FCU430_RoomTmp +79,BuildingName_01FCU277_OccHtgSptFnl +80,BuildingName_01FCU364_UO11_HwVlvOut +81,BuildingName_01FCU213_UI17_Fan_Status +82,BuildingName_01FCU276_OccCmd +83,BuildingName_02FCU505_BO4_HighSpdFanOut +84,BuildingName_01FCU292_UnoccClgSpt +85,BuildingName_02FCU507_OccHtgSpt +86,BuildingName_02FCU563_BO4_HighSpdFanOut +87,BuildingName_02FCU481_UI17_Fan_Status +88,BuildingName_02FCU444_UO12_ChwVlvOut +89,BuildingName_02FCU555_UI17_Fan_Status +90,BuildingName_01FCU289_UnoccClgSptFnl +91,BuildingName_01FCU285_OccClgSptFnl +92,BuildingName_01FCU254_UI17_Fan_Status +93,BuildingName_01FCU255_UnoccHtgSpt +94,BuildingName_01FCU282_UnoccHtgSptFnl +95,BuildingName_02FCU503_OccClgSpt +96,BuildingName_02FCU525_UnoccHtgSpt +97,BuildingName_01FCU283_OccClgSpt +98,BuildingName_02FCU465_FanMode +99,BuildingName_02FCU530_ChwVlvPos +100,BuildingName_02FCU486_UI17_Fan_Status +101,BuildingName_01FCU225_UnoccHtgSpt +102,BuildingName_01FDU123_UnoccHtgSpt \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 5f9e6b00d..320e4be84 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,43 +2,45 @@ [[package]] name = "accessible-pygments" -version = "0.0.4" +version = "0.0.5" description = "A collection of accessible pygments styles" optional = false -python-versions = "*" +python-versions = ">=3.9" files = [ - {file = "accessible-pygments-0.0.4.tar.gz", hash = "sha256:e7b57a9b15958e9601c7e9eb07a440c813283545a20973f2574a5f453d0e953e"}, - {file = "accessible_pygments-0.0.4-py2.py3-none-any.whl", hash = "sha256:416c6d8c1ea1c5ad8701903a20fcedf953c6e720d64f33dc47bfb2d3f2fa4e8d"}, + {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"}, + {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"}, ] [package.dependencies] pygments = ">=1.5" +[package.extras] +dev = ["pillow", "pkginfo (>=1.10)", "playwright", "pre-commit", "setuptools", "twine (>=5.0)"] +tests = ["hypothesis", "pytest"] + [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "alembic" -version = "1.13.1" +version = "1.13.2" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" files = [ - {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, - {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, + {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, + {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, ] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} Mako = "*" SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" @@ -48,13 +50,13 @@ tz = ["backports.zoneinfo"] [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] @@ -217,9 +219,6 @@ files = [ {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] @@ -238,17 +237,6 @@ files = [ bacpypes = "*" colorama = "*" -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - [[package]] name = "bacpypes" version = "0.18.7" @@ -361,13 +349,13 @@ rdflib = ">=7.0,<8.0" [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -588,63 +576,63 @@ test = ["pytest"] [[package]] name = "coverage" -version = "7.5.1" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, - {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, - {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, - {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, - {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, - {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, - {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, - {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, - {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, - {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, - {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, - {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, - {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, - {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] @@ -655,33 +643,33 @@ toml = ["tomli"] [[package]] name = "debugpy" -version = "1.8.1" +version = "1.8.2" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, - {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, - {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, - {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, - {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, - {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, - {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, - {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, - {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, - {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, - {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, - {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, - {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, - {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, - {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, + {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, + {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, + {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, + {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, + {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, + {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, + {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, + {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, + {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, + {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, + {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, + {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, + {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, + {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, + {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, + {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, + {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, + {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, + {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, + {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, + {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, + {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, ] [[package]] @@ -769,13 +757,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.19.1" +version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [package.extras] @@ -783,18 +771,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -1011,13 +999,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "identify" -version = "2.5.36" +version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [package.extras] @@ -1047,40 +1035,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "importlib-resources" -version = "6.4.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -1095,13 +1065,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -1128,60 +1098,58 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.12.3" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, - {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "ipywidgets" -version = "8.1.2" +version = "8.1.3" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, - {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, + {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, + {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.10,<3.1.0" +jupyterlab-widgets = ">=3.0.11,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.10,<4.1.0" +widgetsnbextension = ">=4.0.11,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1288,45 +1256,43 @@ files = [ [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] attrs = ">=22.2.0" fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} jsonschema-specifications = ">=2023.03.6" -pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} referencing = ">=0.28.4" rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} rpds-py = ">=0.7.1" uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" @@ -1340,7 +1306,6 @@ files = [ ] [package.dependencies] -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} referencing = ">=0.31.0" [[package]] @@ -1429,13 +1394,13 @@ testing = ["coverage", "ipykernel", "jupytext", "matplotlib", "nbdime", "nbforma [[package]] name = "jupyter-client" -version = "8.6.1" +version = "8.6.2" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [package.dependencies] @@ -1448,7 +1413,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" @@ -1536,13 +1501,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.14.0" +version = "2.14.1" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.14.0-py3-none-any.whl", hash = "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210"}, - {file = "jupyter_server-2.14.0.tar.gz", hash = "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677"}, + {file = "jupyter_server-2.14.1-py3-none-any.whl", hash = "sha256:16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5"}, + {file = "jupyter_server-2.14.1.tar.gz", hash = "sha256:12558d158ec7a0653bf96cc272bc7ad79e0127d503b982ed144399346694f726"}, ] [package.dependencies] @@ -1567,7 +1532,7 @@ traitlets = ">=5.6.0" websocket-client = ">=1.7" [package.extras] -docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] [[package]] @@ -1591,20 +1556,19 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.1.8" +version = "4.2.3" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.1.8-py3-none-any.whl", hash = "sha256:c3baf3a2f91f89d110ed5786cd18672b9a357129d4e389d2a0dead15e11a4d2c"}, - {file = "jupyterlab-4.1.8.tar.gz", hash = "sha256:3384aded8680e7ce504fd63b8bb89a39df21c9c7694d9e7dc4a68742cdb30f9b"}, + {file = "jupyterlab-4.2.3-py3-none-any.whl", hash = "sha256:0b59d11808e84bb84105c73364edfa867dd475492429ab34ea388a52f2e2e596"}, + {file = "jupyterlab-4.2.3.tar.gz", hash = "sha256:df6e46969ea51d66815167f23d92f105423b7f1f06fa604d4f44aeb018c82c7b"}, ] [package.dependencies] async-lru = ">=1.0.0" httpx = ">=0.25.0" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} ipykernel = ">=6.5.0" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -1613,16 +1577,17 @@ jupyter-server = ">=2.4.0,<3" jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" +setuptools = ">=40.1.0" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=8.0,<9.0)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] +upgrade-extension = ["copier (>=8,<10)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] [[package]] name = "jupyterlab-pygments" @@ -1637,13 +1602,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.27.1" +version = "2.27.2" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab_server-2.27.1-py3-none-any.whl", hash = "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75"}, - {file = "jupyterlab_server-2.27.1.tar.gz", hash = "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d"}, + {file = "jupyterlab_server-2.27.2-py3-none-any.whl", hash = "sha256:54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43"}, + {file = "jupyterlab_server-2.27.2.tar.gz", hash = "sha256:15cbb349dc45e954e09bacf81b9f9bcb10815ff660fb2034ecd7417db3a7ea27"}, ] [package.dependencies] @@ -1663,24 +1628,24 @@ test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-v [[package]] name = "jupyterlab-widgets" -version = "3.0.10" +version = "3.0.11" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, - {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, + {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, + {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, ] [[package]] name = "jupytext" -version = "1.16.2" +version = "1.16.3" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.2-py3-none-any.whl", hash = "sha256:197a43fef31dca612b68b311e01b8abd54441c7e637810b16b6cb8f2ab66065e"}, - {file = "jupytext-1.16.2.tar.gz", hash = "sha256:8627dd9becbbebd79cc4a4ed4727d89d78e606b4b464eab72357b3b029023a14"}, + {file = "jupytext-1.16.3-py3-none-any.whl", hash = "sha256:870e0d7a716dcb1303df6ad1cec65e3315a20daedd808a55cb3dae2d56e4ed20"}, + {file = "jupytext-1.16.3.tar.gz", hash = "sha256:1ebac990461dd9f477ff7feec9e3003fa1acc89f3c16ba01b73f79fd76f01a98"}, ] [package.dependencies] @@ -1692,11 +1657,11 @@ pyyaml = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] -test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] @@ -1734,13 +1699,13 @@ test = ["coverage", "pytest", "pytest-cov"] [[package]] name = "mako" -version = "1.3.3" +version = "1.3.5" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.3-py3-none-any.whl", hash = "sha256:5324b88089a8978bf76d1629774fcc2f1c07b82acdf00f4c5dd8ceadfffc4b40"}, - {file = "Mako-1.3.3.tar.gz", hash = "sha256:e16c01d9ab9c11f7290eef1cfefc093fb5a45ee4a3da09e2fec2e4d1bae54e73"}, + {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, + {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, ] [package.dependencies] @@ -2104,13 +2069,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nbmake" -version = "1.5.3" +version = "1.5.4" description = "Pytest plugin for testing notebooks" optional = false -python-versions = ">=3.8.0,<4.0.0" +python-versions = "<4.0.0,>=3.8.0" files = [ - {file = "nbmake-1.5.3-py3-none-any.whl", hash = "sha256:6cfa2b926d335e9c6dce7e8543d01b2398b0a56c03131c5c0bce2b1722116212"}, - {file = "nbmake-1.5.3.tar.gz", hash = "sha256:0b76b829e8b128eb1895539bacf515a1ee85e5b7b492cdfe76e3a12f804e069e"}, + {file = "nbmake-1.5.4-py3-none-any.whl", hash = "sha256:8e440a61a7d4ab303064aa86b8d2c088177c89960e2b4a0f91a768dc9f68382b"}, + {file = "nbmake-1.5.4.tar.gz", hash = "sha256:56417fe80d50069671122955532df6e26369a23f68b9c6e2191ae9cfef19abb2"}, ] [package.dependencies] @@ -2131,45 +2096,6 @@ files = [ {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] -[[package]] -name = "netifaces" -version = "0.11.0" -description = "Portable network interface information." -optional = false -python-versions = "*" -files = [ - {file = "netifaces-0.11.0-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eb4813b77d5df99903af4757ce980a98c4d702bbcb81f32a0b305a1537bdf0b1"}, - {file = "netifaces-0.11.0-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5f9ca13babe4d845e400921973f6165a4c2f9f3379c7abfc7478160e25d196a4"}, - {file = "netifaces-0.11.0-cp27-cp27m-win32.whl", hash = "sha256:7dbb71ea26d304e78ccccf6faccef71bb27ea35e259fb883cfd7fd7b4f17ecb1"}, - {file = "netifaces-0.11.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0f6133ac02521270d9f7c490f0c8c60638ff4aec8338efeff10a1b51506abe85"}, - {file = "netifaces-0.11.0-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08e3f102a59f9eaef70948340aeb6c89bd09734e0dca0f3b82720305729f63ea"}, - {file = "netifaces-0.11.0-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c03fb2d4ef4e393f2e6ffc6376410a22a3544f164b336b3a355226653e5efd89"}, - {file = "netifaces-0.11.0-cp34-cp34m-win32.whl", hash = "sha256:73ff21559675150d31deea8f1f8d7e9a9a7e4688732a94d71327082f517fc6b4"}, - {file = "netifaces-0.11.0-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:815eafdf8b8f2e61370afc6add6194bd5a7252ae44c667e96c4c1ecf418811e4"}, - {file = "netifaces-0.11.0-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:50721858c935a76b83dd0dd1ab472cad0a3ef540a1408057624604002fcfb45b"}, - {file = "netifaces-0.11.0-cp35-cp35m-win32.whl", hash = "sha256:c9a3a47cd3aaeb71e93e681d9816c56406ed755b9442e981b07e3618fb71d2ac"}, - {file = "netifaces-0.11.0-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:aab1dbfdc55086c789f0eb37affccf47b895b98d490738b81f3b2360100426be"}, - {file = "netifaces-0.11.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c37a1ca83825bc6f54dddf5277e9c65dec2f1b4d0ba44b8fd42bc30c91aa6ea1"}, - {file = "netifaces-0.11.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28f4bf3a1361ab3ed93c5ef360c8b7d4a4ae060176a3529e72e5e4ffc4afd8b0"}, - {file = "netifaces-0.11.0-cp36-cp36m-win32.whl", hash = "sha256:2650beee182fed66617e18474b943e72e52f10a24dc8cac1db36c41ee9c041b7"}, - {file = "netifaces-0.11.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cb925e1ca024d6f9b4f9b01d83215fd00fe69d095d0255ff3f64bffda74025c8"}, - {file = "netifaces-0.11.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:84e4d2e6973eccc52778735befc01638498781ce0e39aa2044ccfd2385c03246"}, - {file = "netifaces-0.11.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18917fbbdcb2d4f897153c5ddbb56b31fa6dd7c3fa9608b7e3c3a663df8206b5"}, - {file = "netifaces-0.11.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:48324183af7f1bc44f5f197f3dad54a809ad1ef0c78baee2c88f16a5de02c4c9"}, - {file = "netifaces-0.11.0-cp37-cp37m-win32.whl", hash = "sha256:8f7da24eab0d4184715d96208b38d373fd15c37b0dafb74756c638bd619ba150"}, - {file = "netifaces-0.11.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2479bb4bb50968089a7c045f24d120f37026d7e802ec134c4490eae994c729b5"}, - {file = "netifaces-0.11.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:3ecb3f37c31d5d51d2a4d935cfa81c9bc956687c6f5237021b36d6fdc2815b2c"}, - {file = "netifaces-0.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96c0fe9696398253f93482c84814f0e7290eee0bfec11563bd07d80d701280c3"}, - {file = "netifaces-0.11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c92ff9ac7c2282009fe0dcb67ee3cd17978cffbe0c8f4b471c00fe4325c9b4d4"}, - {file = "netifaces-0.11.0-cp38-cp38-win32.whl", hash = "sha256:d07b01c51b0b6ceb0f09fc48ec58debd99d2c8430b09e56651addeaf5de48048"}, - {file = "netifaces-0.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:469fc61034f3daf095e02f9f1bbac07927b826c76b745207287bc594884cfd05"}, - {file = "netifaces-0.11.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5be83986100ed1fdfa78f11ccff9e4757297735ac17391b95e17e74335c2047d"}, - {file = "netifaces-0.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:54ff6624eb95b8a07e79aa8817288659af174e954cca24cdb0daeeddfc03c4ff"}, - {file = "netifaces-0.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:841aa21110a20dc1621e3dd9f922c64ca64dd1eb213c47267a2c324d823f6c8f"}, - {file = "netifaces-0.11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e76c7f351e0444721e85f975ae92718e21c1f361bda946d60a214061de1f00a1"}, - {file = "netifaces-0.11.0.tar.gz", hash = "sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32"}, -] - [[package]] name = "networkx" version = "2.8.8" @@ -2190,40 +2116,37 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "notebook" -version = "7.1.3" +version = "7.2.1" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.1.3-py3-none-any.whl", hash = "sha256:919b911e59f41f6e3857ce93c9d93535ba66bb090059712770e5968c07e1004d"}, - {file = "notebook-7.1.3.tar.gz", hash = "sha256:41fcebff44cf7bb9377180808bcbae066629b55d8c7722f1ebbe75ca44f9cfc1"}, + {file = "notebook-7.2.1-py3-none-any.whl", hash = "sha256:f45489a3995746f2195a137e0773e2130960b51c9ac3ce257dbc2705aab3a6ca"}, + {file = "notebook-7.2.1.tar.gz", hash = "sha256:4287b6da59740b32173d01d641f763d292f49c30e7a51b89c46ba8473126341e"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.1.1,<4.2" -jupyterlab-server = ">=2.22.1,<3" +jupyterlab = ">=4.2.0,<4.3" +jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -2244,13 +2167,13 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "openpyxl" -version = "3.1.2" +version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, - {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, ] [package.dependencies] @@ -2283,13 +2206,13 @@ rdflib = ">=6.0.2" [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -2343,37 +2266,15 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[[package]] -name = "pkgutil-resolve-name" -version = "1.3.10" -description = "Resolve a name to an object." -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, - {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, -] - [[package]] name = "platformdirs" -version = "4.2.1" +version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] @@ -2416,13 +2317,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prettytable" -version = "3.10.0" +version = "3.10.2" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = false python-versions = ">=3.8" files = [ - {file = "prettytable-3.10.0-py3-none-any.whl", hash = "sha256:6536efaf0757fdaa7d22e78b3aac3b69ea1b7200538c2c6995d649365bddab92"}, - {file = "prettytable-3.10.0.tar.gz", hash = "sha256:9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568"}, + {file = "prettytable-3.10.2-py3-none-any.whl", hash = "sha256:1cbfdeb4bcc73976a778a0fb33cb6d752e75396f16574dcb3e2d6332fd93c76a"}, + {file = "prettytable-3.10.2.tar.gz", hash = "sha256:29ec6c34260191d42cd4928c28d56adec360ac2b1208a26c7e4f14b90cc8bc84"}, ] [package.dependencies] @@ -2447,13 +2348,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [package.dependencies] @@ -2461,27 +2362,28 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.8" +version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [package.extras] @@ -2687,13 +2589,13 @@ files = [ [[package]] name = "pydata-sphinx-theme" -version = "0.14.4" +version = "0.15.4" description = "Bootstrap-based Sphinx theme from the PyData community" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pydata_sphinx_theme-0.14.4-py3-none-any.whl", hash = "sha256:ac15201f4c2e2e7042b0cad8b30251433c1f92be762ddcefdb4ae68811d918d9"}, - {file = "pydata_sphinx_theme-0.14.4.tar.gz", hash = "sha256:f5d7a2cb7a98e35b9b49d3b02cec373ad28958c2ed5c9b1ffe6aff6c56e9de5b"}, + {file = "pydata_sphinx_theme-0.15.4-py3-none-any.whl", hash = "sha256:2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6"}, + {file = "pydata_sphinx_theme-0.15.4.tar.gz", hash = "sha256:7762ec0ac59df3acecf49fd2f889e1b4565dbce8b88b2e29ee06fdd90645a06d"}, ] [package.dependencies] @@ -2703,14 +2605,15 @@ beautifulsoup4 = "*" docutils = "!=0.17.0" packaging = "*" pygments = ">=2.7" -sphinx = ">=5.0" +sphinx = ">=5" typing-extensions = "*" [package.extras] a11y = ["pytest-playwright"] -dev = ["nox", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml"] -doc = ["ablog (>=0.11.0rc2)", "colorama", "ipykernel", "ipyleaflet", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (<1.4)", "sphinxext-rediraffe", "xarray"] -test = ["pytest", "pytest-cov", "pytest-regressions"] +dev = ["pandoc", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml", "sphinx-theme-builder[cli]", "tox"] +doc = ["ablog (>=0.11.8)", "colorama", "graphviz", "ipykernel", "ipyleaflet", "ipywidgets", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (>=1.4.1)", "sphinxext-rediraffe", "xarray"] +i18n = ["Babel", "jinja2"] +test = ["pytest", "pytest-cov", "pytest-regressions", "sphinx[test]"] [[package]] name = "pyflakes" @@ -2822,13 +2725,13 @@ js = ["pyduktape2 (>=0.4.6,<0.5.0)"] [[package]] name = "pytest" -version = "8.2.0" +version = "8.2.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [package.dependencies] @@ -3191,13 +3094,13 @@ rpds-py = ">=0.7.0" [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -3262,110 +3165,110 @@ notebook = ">=6.0" [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.19.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.19.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:fb37bd599f031f1a6fb9e58ec62864ccf3ad549cf14bac527dbfa97123edcca4"}, + {file = "rpds_py-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3384d278df99ec2c6acf701d067147320b864ef6727405d6470838476e44d9e8"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54548e0be3ac117595408fd4ca0ac9278fde89829b0b518be92863b17ff67a2"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8eb488ef928cdbc05a27245e52de73c0d7c72a34240ef4d9893fdf65a8c1a955"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5da93debdfe27b2bfc69eefb592e1831d957b9535e0943a0ee8b97996de21b5"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79e205c70afddd41f6ee79a8656aec738492a550247a7af697d5bd1aee14f766"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:959179efb3e4a27610e8d54d667c02a9feaa86bbabaf63efa7faa4dfa780d4f1"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a6e605bb9edcf010f54f8b6a590dd23a4b40a8cb141255eec2a03db249bc915b"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9133d75dc119a61d1a0ded38fb9ba40a00ef41697cc07adb6ae098c875195a3f"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd36b712d35e757e28bf2f40a71e8f8a2d43c8b026d881aa0c617b450d6865c9"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354f3a91718489912f2e0fc331c24eaaf6a4565c080e00fbedb6015857c00582"}, + {file = "rpds_py-0.19.0-cp310-none-win32.whl", hash = "sha256:ebcbf356bf5c51afc3290e491d3722b26aaf5b6af3c1c7f6a1b757828a46e336"}, + {file = "rpds_py-0.19.0-cp310-none-win_amd64.whl", hash = "sha256:75a6076289b2df6c8ecb9d13ff79ae0cad1d5fb40af377a5021016d58cd691ec"}, + {file = "rpds_py-0.19.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6d45080095e585f8c5097897313def60caa2046da202cdb17a01f147fb263b81"}, + {file = "rpds_py-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5c9581019c96f865483d031691a5ff1cc455feb4d84fc6920a5ffc48a794d8a"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1540d807364c84516417115c38f0119dfec5ea5c0dd9a25332dea60b1d26fc4d"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e65489222b410f79711dc3d2d5003d2757e30874096b2008d50329ea4d0f88c"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da6f400eeb8c36f72ef6646ea530d6d175a4f77ff2ed8dfd6352842274c1d8b"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37f46bb11858717e0efa7893c0f7055c43b44c103e40e69442db5061cb26ed34"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:071d4adc734de562bd11d43bd134330fb6249769b2f66b9310dab7460f4bf714"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9625367c8955e4319049113ea4f8fee0c6c1145192d57946c6ffcd8fe8bf48dd"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e19509145275d46bc4d1e16af0b57a12d227c8253655a46bbd5ec317e941279d"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d438e4c020d8c39961deaf58f6913b1bf8832d9b6f62ec35bd93e97807e9cbc"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90bf55d9d139e5d127193170f38c584ed3c79e16638890d2e36f23aa1630b952"}, + {file = "rpds_py-0.19.0-cp311-none-win32.whl", hash = "sha256:8d6ad132b1bc13d05ffe5b85e7a01a3998bf3a6302ba594b28d61b8c2cf13aaf"}, + {file = "rpds_py-0.19.0-cp311-none-win_amd64.whl", hash = "sha256:7ec72df7354e6b7f6eb2a17fa6901350018c3a9ad78e48d7b2b54d0412539a67"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248"}, + {file = "rpds_py-0.19.0-cp312-none-win32.whl", hash = "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600"}, + {file = "rpds_py-0.19.0-cp312-none-win_amd64.whl", hash = "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4"}, + {file = "rpds_py-0.19.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:52e466bea6f8f3a44b1234570244b1cff45150f59a4acae3fcc5fd700c2993ca"}, + {file = "rpds_py-0.19.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e21cc693045fda7f745c790cb687958161ce172ffe3c5719ca1764e752237d16"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b31f059878eb1f5da8b2fd82480cc18bed8dcd7fb8fe68370e2e6285fa86da6"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dd46f309e953927dd018567d6a9e2fb84783963650171f6c5fe7e5c41fd5666"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a01a4490e170376cd79258b7f755fa13b1a6c3667e872c8e35051ae857a92b"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcf426a8c38eb57f7bf28932e68425ba86def6e756a5b8cb4731d8e62e4e0223"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68eea5df6347d3f1378ce992d86b2af16ad7ff4dcb4a19ccdc23dea901b87fb"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dab8d921b55a28287733263c0e4c7db11b3ee22aee158a4de09f13c93283c62d"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6fe87efd7f47266dfc42fe76dae89060038f1d9cb911f89ae7e5084148d1cc08"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:535d4b52524a961d220875688159277f0e9eeeda0ac45e766092bfb54437543f"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8b1a94b8afc154fbe36978a511a1f155f9bd97664e4f1f7a374d72e180ceb0ae"}, + {file = "rpds_py-0.19.0-cp38-none-win32.whl", hash = "sha256:7c98298a15d6b90c8f6e3caa6457f4f022423caa5fa1a1ca7a5e9e512bdb77a4"}, + {file = "rpds_py-0.19.0-cp38-none-win_amd64.whl", hash = "sha256:b0da31853ab6e58a11db3205729133ce0df26e6804e93079dee095be3d681dc1"}, + {file = "rpds_py-0.19.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5039e3cef7b3e7a060de468a4a60a60a1f31786da94c6cb054e7a3c75906111c"}, + {file = "rpds_py-0.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab1932ca6cb8c7499a4d87cb21ccc0d3326f172cfb6a64021a889b591bb3045c"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2afd2164a1e85226fcb6a1da77a5c8896c18bfe08e82e8ceced5181c42d2179"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1c30841f5040de47a0046c243fc1b44ddc87d1b12435a43b8edff7e7cb1e0d0"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f757f359f30ec7dcebca662a6bd46d1098f8b9fb1fcd661a9e13f2e8ce343ba1"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15e65395a59d2e0e96caf8ee5389ffb4604e980479c32742936ddd7ade914b22"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb0f6eb3a320f24b94d177e62f4074ff438f2ad9d27e75a46221904ef21a7b05"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b228e693a2559888790936e20f5f88b6e9f8162c681830eda303bad7517b4d5a"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2575efaa5d949c9f4e2cdbe7d805d02122c16065bfb8d95c129372d65a291a0b"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5c872814b77a4e84afa293a1bee08c14daed1068b2bb1cc312edbf020bbbca2b"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850720e1b383df199b8433a20e02b25b72f0fded28bc03c5bd79e2ce7ef050be"}, + {file = "rpds_py-0.19.0-cp39-none-win32.whl", hash = "sha256:ce84a7efa5af9f54c0aa7692c45861c1667080814286cacb9958c07fc50294fb"}, + {file = "rpds_py-0.19.0-cp39-none-win_amd64.whl", hash = "sha256:1c26da90b8d06227d7769f34915913911222d24ce08c0ab2d60b354e2d9c7aff"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521"}, + {file = "rpds_py-0.19.0.tar.gz", hash = "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9"}, ] [[package]] @@ -3592,7 +3495,6 @@ files = [ ] [package.dependencies] -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} sphinx = ">=4,<5.1" [package.extras] @@ -3660,17 +3562,18 @@ sphinx = ["matplotlib", "myst-nb", "numpy", "sphinx-book-theme", "sphinx-design" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -3693,32 +3596,34 @@ Sphinx = ">=2.1" [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.6" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -3737,32 +3642,34 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.7" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.10" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -3945,22 +3852,22 @@ files = [ [[package]] name = "tornado" -version = "6.4" +version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] @@ -3980,13 +3887,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "types-jsonschema" -version = "4.22.0.20240501" +version = "4.23.0.20240712" description = "Typing stubs for jsonschema" optional = false python-versions = ">=3.8" files = [ - {file = "types-jsonschema-4.22.0.20240501.tar.gz", hash = "sha256:51c4ec05640909206551c8f57e630be570c4e0d86abda75d9d947521dffef6db"}, - {file = "types_jsonschema-4.22.0.20240501-py3-none-any.whl", hash = "sha256:5cacc80cffef3cbbdd928954feb0f3d218d062b47333ca50841c27039efae29d"}, + {file = "types-jsonschema-4.23.0.20240712.tar.gz", hash = "sha256:b20db728dcf7ea3e80e9bdeb55e8b8420c6c040cda14e8cf284465adee71d217"}, + {file = "types_jsonschema-4.23.0.20240712-py3-none-any.whl", hash = "sha256:8c33177ce95336241c1d61ccb56a9964d4361b99d5f1cd81a1ab4909b0dd7cf4"}, ] [package.dependencies] @@ -4016,13 +3923,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -4055,13 +3962,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -4072,13 +3979,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.2" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] @@ -4103,18 +4010,18 @@ files = [ [[package]] name = "webcolors" -version = "1.13" +version = "24.6.0" description = "A library for working with the color formats defined by HTML and CSS." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, + {file = "webcolors-24.6.0-py3-none-any.whl", hash = "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1"}, + {file = "webcolors-24.6.0.tar.gz", hash = "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b"}, ] [package.extras] docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["pytest", "pytest-cov"] +tests = ["coverage[toml]"] [[package]] name = "webencodings" @@ -4176,39 +4083,40 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "widgetsnbextension" -version = "4.0.10" +version = "4.0.11" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, - {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, + {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, + {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, ] [[package]] name = "zipp" -version = "3.18.1" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] all = ["psycopg2"] all-ingresses = [] bacnet-ingress = [] +label-parsing = [] postgres = ["psycopg2"] topquadrant = ["brick-tq-shacl"] xlsx-ingress = [] [metadata] lock-version = "2.0" -python-versions = ">=3.8.1, <3.12" -content-hash = "e9bd5f48cee921f5e9a11268cb0d9aca4cc673eea5db0275b83a53645395bc46" +python-versions = ">=3.9, <3.12" +content-hash = "b48f9c4a97bfc614f9366126eb3509aec250f514ac86ed13430bb71cf8d094f9" diff --git a/pyproject.toml b/pyproject.toml index 565dcda98..875cb845d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ documentation = "https://nrel.github.io/BuildingMOTIF" buildingmotif = 'buildingmotif.bin.cli:app' [tool.poetry.dependencies] -python = ">=3.8.1, <3.12" +python = ">=3.9, <3.12" rdflib = ">=7.0" SQLAlchemy = {extras = ["mypy"], version = "^1.4.44"} pyaml = "^21.10.1" @@ -55,7 +55,7 @@ rise = "^5.7.1" jupyter-book = "^0.15.1" flake8 = "^5.0.0" BAC0 = "^22.9.21" -netifaces = "^0.11.0" +#netifaces = "^0.11.0" pytz = "^2022.7.1" openpyxl = "^3.0.10" pytest = "^8.0.2" @@ -68,6 +68,7 @@ topquadrant = ["brick-tq-shacl"] bacnet-ingress = ["BAC0", "netifaces", "pytz"] xlsx-ingress = ["openpyxl"] all-ingresses = ["BAC0", "openpyxl", "netifaces", "pytz"] +label-parsing = ["langchain", "langchain-community", "pyenchant", "scikit-learn"] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 1d02638c2..171324012 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -104,3 +104,4 @@ def pytest_generate_tests(metafunc): if "shacl_engine" in metafunc.fixturenames: shacl_engine = {"pyshacl", "topquadrant"} metafunc.parametrize("shacl_engine", shacl_engine) + diff --git a/tests/unit/fixtures/point_parsing/basic.csv b/tests/unit/fixtures/point_parsing/basic.csv new file mode 100644 index 000000000..57a45e70a --- /dev/null +++ b/tests/unit/fixtures/point_parsing/basic.csv @@ -0,0 +1,3 @@ +BuildingNames +:BuildingName_02:FCU503_ChwVlvPos +:BuildingName_01:FCU336_OccHtgSptFnl \ No newline at end of file diff --git a/tests/unit/fixtures/point_parsing/basic_len102.csv b/tests/unit/fixtures/point_parsing/basic_len102.csv new file mode 100644 index 000000000..ebed75352 --- /dev/null +++ b/tests/unit/fixtures/point_parsing/basic_len102.csv @@ -0,0 +1,103 @@ +ID,BuildingNames +1,BuildingName_02FCU503_ChwVlvPos +2,BuildingName_01FCU336_OccHtgSptFnl +3,BuildingName_02FCU510_EffOcc +4,BuildingName_02FCU507_UnoccHtgSpt +5,BuildingName_02FCU415_UnoccHtgSpt +6,BuildingName_01FCU203_OccClgSpt +7,BuildingName_02FCU521_UO11_HwVlvOut +8,BuildingName_01FCU365_UnoccHtgSptFnl +9,BuildingName_02FCU529_UnoccHtgSpt +10,BuildingName_01FCU243_EffOcc +11,BuildingName_01FCU362_ChwVlvPos +12,BuildingName_01FCU180B_UnoccClgSptFnl +13,BuildingName_02FCU539_UO12_ChwVlvOut +14,BuildingName_02FCU428_BO4_HighSpdFanOut +15,BuildingName_02FCU416_RoomTmp +16,BuildingName_02FCU415_UI17_Fan_Status +17,BuildingName_01FCU391_HwVlvPos +18,BuildingName_02FCU559_UnoccHtgSpt +19,BuildingName_01FCU262_UI22_SaTmp +20,BuildingName_02FCU448_UO11_HwVlvOut +21,BuildingName_01FCU369_OccClgSptFnl +22,BuildingName_01FCU255_UI22_SaTmp +23,BuildingName_02FCU543_UI22_SaTmp +24,BuildingName_01FCU376_UI22_SaTmp +25,BuildingName_01FCU241_EffSysMode +26,BuildingName_01FCU343_ChwVlvPos +27,BuildingName_01FCU313_BO4_HighSpdFanOut +28,BuildingName_02FCU549_EffOcc +29,BuildingName_01FCU242_UI17_Fan_Status +30,BuildingName_01FCU392_UnoccHtgSptFnl +31,BuildingName_01FCU323_OccHtgSptFnl +32,BuildingName_01FCU311_OccHtgSpt +33,BuildingName_01FCU216_EffOcc +34,BuildingName_01FCU331_SysMode +35,BuildingName_02FCU558_FanMode +36,BuildingName_01FCU227_BO4_HighSpdFanOut +37,BuildingName_01FCU285_OccClgSpt +38,BuildingName_01FCU391_FanMode +39,BuildingName_01FCU367_EffOcc +40,BuildingName_02FCU439_HwVlvPos +41,BuildingName_02FCU438_HwVlvPos +42,BuildingName_01FCU235_HwVlvPos +43,BuildingName_02FCU439_RoomTmp +44,BuildingName_01FCU205_UI17_Fan_Status +45,BuildingName_01FCU239_OccHtgSpt +46,BuildingName_02FCU538_EffOcc +47,BuildingName_02FCU479_UnoccHtgSpt +48,BuildingName_01FCU292_SysMode +49,BuildingName_02FCU555_UO12_ChwVlvOut +50,BuildingName_02FCU489_UnoccClgSpt +51,BuildingName_01FCU331_UO12_ChwVlvOut +52,BuildingName_01FCU301_ChwVlvPos +53,BuildingName_02FCU448_ChwVlvPos +54,BuildingName_02FCU460_OccHtgSpt +55,BuildingName_01FCU319_UnoccClgSptFnl +56,BuildingName_02FCU401_OccClgSpt +57,BuildingName_01FCU311_UnoccClgSpt +58,BuildingName_01FCU261_UnoccHtgSptFnl +59,BuildingName_01FCU273_UnoccClgSpt +60,BuildingName_02FCU531_BO4_HighSpdFanOut +61,BuildingName_02FCU416_FanMode +62,BuildingName_01FCU223_OccCmd +63,BuildingName_01FCU342_UnoccHtgSpt +64,BuildingName_02FCU485_UO11_HwVlvOut +65,BuildingName_01FCU201_OccHtgSpt +66,BuildingName_02FCU438_UO11_HwVlvOut +67,BuildingName_02FCU539_Room_RH +68,BuildingName_02FCU452_EffSysMode +69,BuildingName_01FCU205_UnoccHtgSptFnl +70,BuildingName_01FCU210_UnoccHtgSptFnl +71,BuildingName_02FCU444_HwVlvPos +72,BuildingName_01FCU240_OccCmd +73,BuildingName_01FCU215_OccCmd +74,BuildingName_01FCU373_UO11_HwVlvOut +75,BuildingName_01FCU273_UI22_SaTmp +76,BuildingName_01FCU352_OccHtgSptFnl +77,BuildingName_01FCU307_OccHtgSptFnl +78,BuildingName_02FCU430_RoomTmp +79,BuildingName_01FCU277_OccHtgSptFnl +80,BuildingName_01FCU364_UO11_HwVlvOut +81,BuildingName_01FCU213_UI17_Fan_Status +82,BuildingName_01FCU276_OccCmd +83,BuildingName_02FCU505_BO4_HighSpdFanOut +84,BuildingName_01FCU292_UnoccClgSpt +85,BuildingName_02FCU507_OccHtgSpt +86,BuildingName_02FCU563_BO4_HighSpdFanOut +87,BuildingName_02FCU481_UI17_Fan_Status +88,BuildingName_02FCU444_UO12_ChwVlvOut +89,BuildingName_02FCU555_UI17_Fan_Status +90,BuildingName_01FCU289_UnoccClgSptFnl +91,BuildingName_01FCU285_OccClgSptFnl +92,BuildingName_01FCU254_UI17_Fan_Status +93,BuildingName_01FCU255_UnoccHtgSpt +94,BuildingName_01FCU282_UnoccHtgSptFnl +95,BuildingName_02FCU503_OccClgSpt +96,BuildingName_02FCU525_UnoccHtgSpt +97,BuildingName_01FCU283_OccClgSpt +98,BuildingName_02FCU465_FanMode +99,BuildingName_02FCU530_ChwVlvPos +100,BuildingName_02FCU486_UI17_Fan_Status +101,BuildingName_01FCU225_UnoccHtgSpt +102,BuildingName_01FDU123_UnoccHtgSpt \ No newline at end of file diff --git a/tests/unit/test_combinator_serialization.py b/tests/unit/test_combinator_serialization.py index 1b5073b29..4164b0003 100644 --- a/tests/unit/test_combinator_serialization.py +++ b/tests/unit/test_combinator_serialization.py @@ -149,7 +149,7 @@ def test_abbreviations(): def test_sequence(): parser = deserialize( - serialize(sequence([string("abc", Identifier), string("def", Identifier)])) + serialize(sequence(string("abc", Identifier), string("def", Identifier))) ) # test that it parses the whole sequence assert parser("abcdef") == [ @@ -161,11 +161,9 @@ def test_sequence(): parser = deserialize( serialize( sequence( - [ - abbreviations(COMMON_EQUIP_ABBREVIATIONS_BRICK), - regex(r"[/\-:_]+", Delimiter), - regex(r"[0-9]+", Identifier), - ] + abbreviations(COMMON_EQUIP_ABBREVIATIONS_BRICK), + regex(r"[/\-:_]+", Delimiter), + regex(r"[0-9]+", Identifier), ) ) ) @@ -187,11 +185,9 @@ def test_many(): type_ident_delim = deserialize( serialize( sequence( - [ - COMMON_ABBREVIATIONS, - regex(r"\d+", Identifier), - delim, - ] + COMMON_ABBREVIATIONS, + regex(r"\d+", Identifier), + delim, ) ) ) @@ -225,14 +221,7 @@ def test_many(): def test_maybe(): parser = deserialize( - serialize( - sequence( - [ - maybe(string("abc", Identifier)), - string("def", Identifier), - ] - ) - ) + serialize(sequence(maybe(string("abc", Identifier)), string("def", Identifier))) ) # test that it parses the whole sequence assert parser("abcdef") == [ @@ -248,17 +237,13 @@ def test_maybe(): parser = deserialize( serialize( sequence( - [ - maybe( - sequence( - [ - string("abc", Identifier), - string("def", Identifier), - ] - ) - ), - string("ghi", Identifier), - ] + maybe( + sequence( + string("abc", Identifier), + string("def", Identifier), + ) + ), + string("ghi", Identifier), ) ) ) @@ -277,18 +262,14 @@ def test_maybe(): parser = deserialize( serialize( sequence( - [ - string("abc", Identifier), - maybe( - sequence( - [ - string("def", Identifier), - string("ghi", Identifier), - ] - ) - ), - string("jkl", Identifier), - ] + string("abc", Identifier), + maybe( + sequence( + string("def", Identifier), + string("ghi", Identifier), + ) + ), + string("jkl", Identifier), ) ) ) diff --git a/tests/unit/test_parser_generation.py b/tests/unit/test_parser_generation.py new file mode 100644 index 000000000..5b7dd2f92 --- /dev/null +++ b/tests/unit/test_parser_generation.py @@ -0,0 +1,70 @@ +import pytest + +from buildingmotif.label_parsing.serialized_parser_metrics import ( + ParserBuilder, + abbreviationsTool, +) + +#csv filename mapped to column name +point_parsing_columns = {"tests/unit/fixtures/point_parsing/basic_len102.csv": "BuildingNames", "tests/unit/fixtures/point_parsing/basic.csv": "BuildingNames"} + +@pytest.mark.parametrize("point_label_file,point_column_name", point_parsing_columns.items()) +def test_serializedParserMetrics(point_label_file, point_column_name): + parser_builder = ParserBuilder(point_label_file, point_column_name) + combined_and_metrics = parser_builder.combine_parsers_and_get_metrics() #emit ParserMetrics class + if not parser_builder.distance_metrics and not parser_builder.clustering_metrics: #not enough points for multiple clusters + assert len(parser_builder.parsers) == len( + parser_builder.clusters + ), "number of parsers does not match number of clusters" + + assert ( + combined_and_metrics.parsed_count + combined_and_metrics.unparsed_count + == combined_and_metrics.total_count + ), "number of parsed plus unparsed points do not match the total number of points" + assert len(combined_and_metrics.combined_clusters) == len(parser_builder.parsers) + assert(len(combined_and_metrics.serializers_list) == len( + parser_builder.parsers + )), "number of serialized parsers does not match number of parsers" + for cluster_dict in combined_and_metrics.combined_clusters: + assert ( + len(cluster_dict["tokens"]) == len(cluster_dict["parsed_labels"]) + ), "amount of parsed points do not match number of emitted tokens" + assert ( + len(cluster_dict["unparsed_labels"]) == cluster_dict["parser_metrics"]["unparsed_count"] + ), "amount of unparsed points do not match" + assert ( + len(cluster_dict["parsed_labels"]) + len(cluster_dict["unparsed_labels"]) + == cluster_dict["parser_metrics"]["total_count"] + ), "amount of total points in the cluster does not match sum of parsed and unparsed points" + else: + assert len(parser_builder.parsers) == len( + parser_builder.clusters + ), "number of parsers does not match number of clusters" + assert parser_builder.clustering_metrics[ + "clusters" + ] + parser_builder.clustering_metrics["noise_points"] == len( + parser_builder.parsers + ), "number of parsers do not match number of clusters plus noise points" + assert ( + parser_builder.distance_metrics["min"] >= 0 + and parser_builder.distance_metrics["max"] <= 1 + ), "distance metric min or max have gone out of range of 0-1" + assert ( + combined_and_metrics.parsed_count + combined_and_metrics.unparsed_count + == combined_and_metrics.total_count + ), "number of parsed plus unparsed points do not match the total number of points" + assert len(combined_and_metrics.combined_clusters) == len(parser_builder.parsers) + assert(len(combined_and_metrics.serializers_list) == len( + parser_builder.parsers + )), "number of serialized parsers does not match number of parsers" + for cluster_dict in combined_and_metrics.combined_clusters: + assert ( + len(cluster_dict["tokens"]) == len(cluster_dict["parsed_labels"]) + ), "amount of parsed points do not match number of emitted tokens" + assert ( + len(cluster_dict["unparsed_labels"]) == cluster_dict["parser_metrics"]["unparsed_count"] + ), "amount of unparsed points do not match" + assert ( + len(cluster_dict["parsed_labels"]) + len(cluster_dict["unparsed_labels"]) + == cluster_dict["parser_metrics"]["total_count"] + ), "amount of total points in the cluster does not match sum of parsed and unparsed points" \ No newline at end of file