diff --git a/.changelog/50.removed b/.changelog/50.removed new file mode 100644 index 00000000000..1cbcf0fb994 --- /dev/null +++ b/.changelog/50.removed @@ -0,0 +1 @@ +`opentelemetry-configuration`: Removed the `jsonschema` runtime dependency. Configuration files are now checked against a validator compiled from `schema.json` at development time, which also drops `attrs`, `referencing`, `jsonschema-specifications` and `rpds-py` from the installed tree. diff --git a/.pylintrc b/.pylintrc index bda4148beb5..9ad5739563e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -11,7 +11,7 @@ ignore=CVS,gen,proto,proto_json # Add files or directories matching the regex patterns to be excluded. The # regex matches against base names, not paths. -ignore-patterns=^models\.py$ +ignore-patterns=^models\.py$,^_generated_validator\.py$ # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). diff --git a/opentelemetry-configuration/codegen/_generate_validator.py b/opentelemetry-configuration/codegen/_generate_validator.py new file mode 100644 index 00000000000..07f5404b30b --- /dev/null +++ b/opentelemetry-configuration/codegen/_generate_validator.py @@ -0,0 +1,154 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +"""Generate a dependency-free JSON Schema validator from ``schema.json``. + +Validating a configuration file with ``jsonschema`` costs four extra runtime +dependencies: ``attrs``, ``referencing``, ``jsonschema-specifications`` and +``rpds-py``. The last of those is a compiled extension, so a distribution that +needs its installed tree to stay pure Python cannot use it, and ``jsonschema``'s +own floors (``attrs >= 22.2.0`` among them) can force an upgrade of a package +the application being instrumented has already pinned. + +``fastjsonschema`` turns a schema into plain Python source instead. Running it +here, at development time rather than at import time, keeps ``fastjsonschema`` +out of the runtime dependency set as well: the generated module imports +``decimal`` and the exception classes vendored next to it, and nothing else. + +``detailed_exceptions=False`` keeps the generated module at roughly a fifth of +the size the detailed variant would be, which halves its cold import time. The +one thing it costs is the message for a missing required property, which +degrades to a bare ``data must contain`` naming no property at all. Since a +missing required key is the mistake a configuration file is most likely to +contain, this script restores those messages afterwards: every such check is +generated as an ``if __missing_keys:`` guard whose variable already holds +the missing names, so the raise is rewritten to name them. + +Run it after changing ``schema.json``:: + + tox -e generate-config-validator + +Forgetting to is caught rather than silent: ``tests/test_generated_validator.py`` +recompiles the schema through ``compile_validator`` and fails when the result +differs from the committed ``_generated_validator.py``. + +Known gap: ``fastjsonschema`` silently ignores keywords it does not implement +(``prefixItems``, ``unevaluatedProperties``, ``dependentRequired``, +``maxContains``). A schema that starts using one of them would be +under-enforced rather than rejected, so ``tests/test_generated_validator.py`` +checks the schema against the set of keywords the generator understands. +""" + +from importlib.metadata import files, version +from json import loads +from pathlib import Path +from re import subn +from sys import exit as sys_exit +from typing import NamedTuple + +from fastjsonschema import compile_to_code +from fastjsonschema import exceptions as fastjsonschema_exceptions + +PACKAGE_ROOT: Path = Path(__file__).resolve().parent.parent / "src" / "opentelemetry" / "configuration" +SCHEMA: Path = PACKAGE_ROOT / "schema.json" +VALIDATOR: Path = PACKAGE_ROOT / "_generated_validator.py" +EXCEPTIONS: Path = PACKAGE_ROOT / "_validation_exceptions.py" + +LICENSE_HEADER: str = "# Copyright The OpenTelemetry Authors\n# SPDX-License-Identifier: Apache-2.0\n\n" +GENERATED_MARKER: str = "# Generated by opentelemetry-configuration/codegen/_generate_validator.py" +TRUNCATED_REQUIRED_MESSAGE: str = ' must contain ")' +MISSING_KEYS_RAISE: str = ( + r"(?P[ ]*if (?P\w+__missing_keys):\n" + r'[ ]*raise JsonSchemaValueException\(.*?) must contain "\)' +) +NAMED_KEYS_RAISE: str = r'\g must contain " + str(sorted(\g)) + " properties")' +VENDORED_IMPORT: str = ( + "from opentelemetry.configuration._validation_exceptions import (\n" + " JsonSchemaValueException,\n" + " JsonSchemaValuesException,\n" + ")" +) + + +class UnexpectedGeneratorOutput(Exception): + """Raised when fastjsonschema emits code this script no longer recognises.""" + + +class CompiledValidator(NamedTuple): + """The text of the validator module, and how many messages were repaired.""" + + source: str + repaired_messages: int + + +def compile_validator() -> CompiledValidator: + """Compile ``schema.json`` into the text of ``_generated_validator.py``. + + Writes nothing. ``main`` writes the result to disk; the test suite compares + it against the committed file so that a schema change without a + regeneration fails instead of silently under-enforcing. + """ + code: str = compile_to_code(loads(SCHEMA.read_text(encoding="utf-8")), detailed_exceptions=False) + + upstream_imports: list[str] = [line for line in code.splitlines() if line.startswith("from fastjsonschema import")] + if len(upstream_imports) != 1: + raise UnexpectedGeneratorOutput( + f"expected exactly one 'from fastjsonschema import' line in the " + f"generated code, found {len(upstream_imports)}: {upstream_imports}" + ) + + truncated: int = code.count(TRUNCATED_REQUIRED_MESSAGE) + code, rewritten = subn(MISSING_KEYS_RAISE, NAMED_KEYS_RAISE, code) + if rewritten != truncated: + raise UnexpectedGeneratorOutput( + f"expected every one of the {truncated} truncated 'must contain' " + f"messages to sit under an '__missing_keys' guard, but only " + f"{rewritten} did; fastjsonschema's code generation has changed" + ) + + body: str = code.replace(upstream_imports[0], VENDORED_IMPORT).rstrip("\n") + + return CompiledValidator(f"{LICENSE_HEADER}{body}\n", rewritten) + + +def vendored_exceptions_source() -> str: + """Return the text of ``_validation_exceptions.py``, copied from fastjsonschema. + + The copy keeps the BSD-3-Clause notice of the distribution it came from, + whose terms require a redistribution in source form to retain it. It + therefore cannot claim the Apache header every other module carries, so it + opens with the marker ``scripts/check_license_header.py`` recognises. + """ + licenses: list = [each for each in files("fastjsonschema") or [] if each.name == "LICENSE"] + if len(licenses) != 1: + raise UnexpectedGeneratorOutput( + f"expected exactly one LICENSE file in the installed fastjsonschema " + f"distribution, found {len(licenses)}: {licenses}" + ) + + notice: str = "\n".join(f"# {line}".rstrip() for line in licenses[0].read_text(encoding="utf-8").splitlines()) + upstream: str = Path(fastjsonschema_exceptions.__file__).read_text(encoding="utf-8") + + return f"{GENERATED_MARKER}\n#\n# Vendored verbatim from fastjsonschema {version('fastjsonschema')}.\n#\n{notice}\n\n{upstream}" + + +def main() -> int: + try: + compiled: CompiledValidator = compile_validator() + except UnexpectedGeneratorOutput as error: + print(error) + return 1 + + VALIDATOR.write_text(compiled.source, encoding="utf-8") + EXCEPTIONS.write_text(vendored_exceptions_source(), encoding="utf-8") + + rewritten: int = compiled.repaired_messages + size: int = VALIDATOR.stat().st_size + print(f"wrote {VALIDATOR.name} ({size} bytes)") + print(f"wrote {EXCEPTIONS.name}") + print(f"named the missing properties in {rewritten} required-key messages") + return 0 + + +if __name__ == "__main__": + sys_exit(main()) diff --git a/opentelemetry-configuration/pyproject.toml b/opentelemetry-configuration/pyproject.toml index 27ffad922dc..106f1449088 100644 --- a/opentelemetry-configuration/pyproject.toml +++ b/opentelemetry-configuration/pyproject.toml @@ -29,7 +29,6 @@ dependencies = [ "opentelemetry-api == 1.46.0.dev", "opentelemetry-sdk == 1.46.0.dev", "pyyaml >= 5.4", - "jsonschema >= 4.0", ] [project.urls] diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_generated_validator.py b/opentelemetry-configuration/src/opentelemetry/configuration/_generated_validator.py new file mode 100644 index 00000000000..c327212ff09 --- /dev/null +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_generated_validator.py @@ -0,0 +1,2936 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +VERSION = "2.22.2" +from decimal import Decimal +from opentelemetry.configuration._validation_exceptions import ( + JsonSchemaValueException, + JsonSchemaValuesException, +) + + +NoneType = type(None) + +def validate(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['file_format']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "file_format" in data_keys: + data_keys.remove("file_format") + data__fileformat = data["file_format"] + if not isinstance(data__fileformat, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".file_format must be string") + if "disabled" in data_keys: + data_keys.remove("disabled") + data__disabled = data["disabled"] + if not isinstance(data__disabled, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".disabled must be boolean or null") + if "log_level" in data_keys: + data_keys.remove("log_level") + data__loglevel = data["log_level"] + validate____defs_severitynumber(data__loglevel, custom_formats, (name_prefix or "data") + ".log_level") + if "attribute_limits" in data_keys: + data_keys.remove("attribute_limits") + data__attributelimits = data["attribute_limits"] + validate____defs_attributelimits(data__attributelimits, custom_formats, (name_prefix or "data") + ".attribute_limits") + if "logger_provider" in data_keys: + data_keys.remove("logger_provider") + data__loggerprovider = data["logger_provider"] + validate____defs_loggerprovider(data__loggerprovider, custom_formats, (name_prefix or "data") + ".logger_provider") + if "meter_provider" in data_keys: + data_keys.remove("meter_provider") + data__meterprovider = data["meter_provider"] + validate____defs_meterprovider(data__meterprovider, custom_formats, (name_prefix or "data") + ".meter_provider") + if "propagator" in data_keys: + data_keys.remove("propagator") + data__propagator = data["propagator"] + validate____defs_propagator(data__propagator, custom_formats, (name_prefix or "data") + ".propagator") + if "tracer_provider" in data_keys: + data_keys.remove("tracer_provider") + data__tracerprovider = data["tracer_provider"] + validate____defs_tracerprovider(data__tracerprovider, custom_formats, (name_prefix or "data") + ".tracer_provider") + if "resource" in data_keys: + data_keys.remove("resource") + data__resource = data["resource"] + validate____defs_resource(data__resource, custom_formats, (name_prefix or "data") + ".resource") + if "instrumentation/development" in data_keys: + data_keys.remove("instrumentation/development") + data__instrumentationdevelopment = data["instrumentation/development"] + validate____defs_experimentalinstrumentation(data__instrumentationdevelopment, custom_formats, (name_prefix or "data") + ".instrumentation/development") + if "distribution" in data_keys: + data_keys.remove("distribution") + data__distribution = data["distribution"] + validate____defs_distribution(data__distribution, custom_formats, (name_prefix or "data") + ".distribution") + return data + +def validate____defs_distribution(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + data_keys = set(data.keys()) + for data_key in data_keys: + if data_key not in []: + data_value = data.get(data_key) + if not isinstance(data_value, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object") + return data + +def validate____defs_experimentalinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "general" in data_keys: + data_keys.remove("general") + data__general = data["general"] + validate____defs_experimentalgeneralinstrumentation(data__general, custom_formats, (name_prefix or "data") + ".general") + if "cpp" in data_keys: + data_keys.remove("cpp") + data__cpp = data["cpp"] + validate____defs_experimentallanguagespecificinstrumentation(data__cpp, custom_formats, (name_prefix or "data") + ".cpp") + if "dotnet" in data_keys: + data_keys.remove("dotnet") + data__dotnet = data["dotnet"] + validate____defs_experimentallanguagespecificinstrumentation(data__dotnet, custom_formats, (name_prefix or "data") + ".dotnet") + if "erlang" in data_keys: + data_keys.remove("erlang") + data__erlang = data["erlang"] + validate____defs_experimentallanguagespecificinstrumentation(data__erlang, custom_formats, (name_prefix or "data") + ".erlang") + if "go" in data_keys: + data_keys.remove("go") + data__go = data["go"] + validate____defs_experimentallanguagespecificinstrumentation(data__go, custom_formats, (name_prefix or "data") + ".go") + if "java" in data_keys: + data_keys.remove("java") + data__java = data["java"] + validate____defs_experimentallanguagespecificinstrumentation(data__java, custom_formats, (name_prefix or "data") + ".java") + if "js" in data_keys: + data_keys.remove("js") + data__js = data["js"] + validate____defs_experimentallanguagespecificinstrumentation(data__js, custom_formats, (name_prefix or "data") + ".js") + if "php" in data_keys: + data_keys.remove("php") + data__php = data["php"] + validate____defs_experimentallanguagespecificinstrumentation(data__php, custom_formats, (name_prefix or "data") + ".php") + if "python" in data_keys: + data_keys.remove("python") + data__python = data["python"] + validate____defs_experimentallanguagespecificinstrumentation(data__python, custom_formats, (name_prefix or "data") + ".python") + if "ruby" in data_keys: + data_keys.remove("ruby") + data__ruby = data["ruby"] + validate____defs_experimentallanguagespecificinstrumentation(data__ruby, custom_formats, (name_prefix or "data") + ".ruby") + if "rust" in data_keys: + data_keys.remove("rust") + data__rust = data["rust"] + validate____defs_experimentallanguagespecificinstrumentation(data__rust, custom_formats, (name_prefix or "data") + ".rust") + if "swift" in data_keys: + data_keys.remove("swift") + data__swift = data["swift"] + validate____defs_experimentallanguagespecificinstrumentation(data__swift, custom_formats, (name_prefix or "data") + ".swift") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentallanguagespecificinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + for data_key in data_keys: + if data_key not in []: + data_value = data.get(data_key) + if not isinstance(data_value, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object") + return data + +def validate____defs_experimentalgeneralinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "http" in data_keys: + data_keys.remove("http") + data__http = data["http"] + validate____defs_experimentalhttpinstrumentation(data__http, custom_formats, (name_prefix or "data") + ".http") + if "code" in data_keys: + data_keys.remove("code") + data__code = data["code"] + validate____defs_experimentalcodeinstrumentation(data__code, custom_formats, (name_prefix or "data") + ".code") + if "db" in data_keys: + data_keys.remove("db") + data__db = data["db"] + validate____defs_experimentaldbinstrumentation(data__db, custom_formats, (name_prefix or "data") + ".db") + if "gen_ai" in data_keys: + data_keys.remove("gen_ai") + data__genai = data["gen_ai"] + validate____defs_experimentalgenaiinstrumentation(data__genai, custom_formats, (name_prefix or "data") + ".gen_ai") + if "messaging" in data_keys: + data_keys.remove("messaging") + data__messaging = data["messaging"] + validate____defs_experimentalmessaginginstrumentation(data__messaging, custom_formats, (name_prefix or "data") + ".messaging") + if "rpc" in data_keys: + data_keys.remove("rpc") + data__rpc = data["rpc"] + validate____defs_experimentalrpcinstrumentation(data__rpc, custom_formats, (name_prefix or "data") + ".rpc") + if "sanitization" in data_keys: + data_keys.remove("sanitization") + data__sanitization = data["sanitization"] + validate____defs_experimentalsanitization(data__sanitization, custom_formats, (name_prefix or "data") + ".sanitization") + if "stability_opt_in_list" in data_keys: + data_keys.remove("stability_opt_in_list") + data__stabilityoptinlist = data["stability_opt_in_list"] + if not isinstance(data__stabilityoptinlist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".stability_opt_in_list must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalsanitization(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "url" in data_keys: + data_keys.remove("url") + data__url = data["url"] + validate____defs_experimentalurlsanitization(data__url, custom_formats, (name_prefix or "data") + ".url") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalurlsanitization(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "sensitive_query_parameters" in data_keys: + data_keys.remove("sensitive_query_parameters") + data__sensitivequeryparameters = data["sensitive_query_parameters"] + if not isinstance(data__sensitivequeryparameters, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".sensitive_query_parameters must be array") + data__sensitivequeryparameters_is_list = isinstance(data__sensitivequeryparameters, (list, tuple)) + if data__sensitivequeryparameters_is_list: + data__sensitivequeryparameters_len = len(data__sensitivequeryparameters) + if data__sensitivequeryparameters_len < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".sensitive_query_parameters must contain at least 0 items") + for data__sensitivequeryparameters_x, data__sensitivequeryparameters_item in enumerate(data__sensitivequeryparameters): + if not isinstance(data__sensitivequeryparameters_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".sensitive_query_parameters[{data__sensitivequeryparameters_x}]".format(**locals()) + " must be string") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalrpcinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "semconv" in data_keys: + data_keys.remove("semconv") + data__semconv = data["semconv"] + validate____defs_experimentalsemconvconfig(data__semconv, custom_formats, (name_prefix or "data") + ".semconv") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalsemconvconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "version" in data_keys: + data_keys.remove("version") + data__version = data["version"] + if not isinstance(data__version, (int, NoneType)) and not (isinstance(data__version, float) and data__version.is_integer()) or isinstance(data__version, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".version must be integer or null") + if isinstance(data__version, (int, float, Decimal)): + if data__version < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".version must be bigger than or equal to 0") + if "experimental" in data_keys: + data_keys.remove("experimental") + data__experimental = data["experimental"] + if not isinstance(data__experimental, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".experimental must be boolean or null") + if "dual_emit" in data_keys: + data_keys.remove("dual_emit") + data__dualemit = data["dual_emit"] + if not isinstance(data__dualemit, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".dual_emit must be boolean or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalmessaginginstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "semconv" in data_keys: + data_keys.remove("semconv") + data__semconv = data["semconv"] + validate____defs_experimentalsemconvconfig(data__semconv, custom_formats, (name_prefix or "data") + ".semconv") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalgenaiinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "semconv" in data_keys: + data_keys.remove("semconv") + data__semconv = data["semconv"] + validate____defs_experimentalsemconvconfig(data__semconv, custom_formats, (name_prefix or "data") + ".semconv") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentaldbinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "semconv" in data_keys: + data_keys.remove("semconv") + data__semconv = data["semconv"] + validate____defs_experimentalsemconvconfig(data__semconv, custom_formats, (name_prefix or "data") + ".semconv") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcodeinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "semconv" in data_keys: + data_keys.remove("semconv") + data__semconv = data["semconv"] + validate____defs_experimentalsemconvconfig(data__semconv, custom_formats, (name_prefix or "data") + ".semconv") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalhttpinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "semconv" in data_keys: + data_keys.remove("semconv") + data__semconv = data["semconv"] + validate____defs_experimentalsemconvconfig(data__semconv, custom_formats, (name_prefix or "data") + ".semconv") + if "client" in data_keys: + data_keys.remove("client") + data__client = data["client"] + validate____defs_experimentalhttpclientinstrumentation(data__client, custom_formats, (name_prefix or "data") + ".client") + if "server" in data_keys: + data_keys.remove("server") + data__server = data["server"] + validate____defs_experimentalhttpserverinstrumentation(data__server, custom_formats, (name_prefix or "data") + ".server") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalhttpserverinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "request_captured_headers" in data_keys: + data_keys.remove("request_captured_headers") + data__requestcapturedheaders = data["request_captured_headers"] + if not isinstance(data__requestcapturedheaders, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".request_captured_headers must be array") + data__requestcapturedheaders_is_list = isinstance(data__requestcapturedheaders, (list, tuple)) + if data__requestcapturedheaders_is_list: + data__requestcapturedheaders_len = len(data__requestcapturedheaders) + if data__requestcapturedheaders_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".request_captured_headers must contain at least 1 items") + for data__requestcapturedheaders_x, data__requestcapturedheaders_item in enumerate(data__requestcapturedheaders): + if not isinstance(data__requestcapturedheaders_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".request_captured_headers[{data__requestcapturedheaders_x}]".format(**locals()) + " must be string") + if "response_captured_headers" in data_keys: + data_keys.remove("response_captured_headers") + data__responsecapturedheaders = data["response_captured_headers"] + if not isinstance(data__responsecapturedheaders, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".response_captured_headers must be array") + data__responsecapturedheaders_is_list = isinstance(data__responsecapturedheaders, (list, tuple)) + if data__responsecapturedheaders_is_list: + data__responsecapturedheaders_len = len(data__responsecapturedheaders) + if data__responsecapturedheaders_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".response_captured_headers must contain at least 1 items") + for data__responsecapturedheaders_x, data__responsecapturedheaders_item in enumerate(data__responsecapturedheaders): + if not isinstance(data__responsecapturedheaders_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".response_captured_headers[{data__responsecapturedheaders_x}]".format(**locals()) + " must be string") + if "known_methods" in data_keys: + data_keys.remove("known_methods") + data__knownmethods = data["known_methods"] + if not isinstance(data__knownmethods, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".known_methods must be array") + data__knownmethods_is_list = isinstance(data__knownmethods, (list, tuple)) + if data__knownmethods_is_list: + data__knownmethods_len = len(data__knownmethods) + if data__knownmethods_len < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".known_methods must contain at least 0 items") + for data__knownmethods_x, data__knownmethods_item in enumerate(data__knownmethods): + if not isinstance(data__knownmethods_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".known_methods[{data__knownmethods_x}]".format(**locals()) + " must be string") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalhttpclientinstrumentation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "request_captured_headers" in data_keys: + data_keys.remove("request_captured_headers") + data__requestcapturedheaders = data["request_captured_headers"] + if not isinstance(data__requestcapturedheaders, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".request_captured_headers must be array") + data__requestcapturedheaders_is_list = isinstance(data__requestcapturedheaders, (list, tuple)) + if data__requestcapturedheaders_is_list: + data__requestcapturedheaders_len = len(data__requestcapturedheaders) + if data__requestcapturedheaders_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".request_captured_headers must contain at least 1 items") + for data__requestcapturedheaders_x, data__requestcapturedheaders_item in enumerate(data__requestcapturedheaders): + if not isinstance(data__requestcapturedheaders_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".request_captured_headers[{data__requestcapturedheaders_x}]".format(**locals()) + " must be string") + if "response_captured_headers" in data_keys: + data_keys.remove("response_captured_headers") + data__responsecapturedheaders = data["response_captured_headers"] + if not isinstance(data__responsecapturedheaders, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".response_captured_headers must be array") + data__responsecapturedheaders_is_list = isinstance(data__responsecapturedheaders, (list, tuple)) + if data__responsecapturedheaders_is_list: + data__responsecapturedheaders_len = len(data__responsecapturedheaders) + if data__responsecapturedheaders_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".response_captured_headers must contain at least 1 items") + for data__responsecapturedheaders_x, data__responsecapturedheaders_item in enumerate(data__responsecapturedheaders): + if not isinstance(data__responsecapturedheaders_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".response_captured_headers[{data__responsecapturedheaders_x}]".format(**locals()) + " must be string") + if "known_methods" in data_keys: + data_keys.remove("known_methods") + data__knownmethods = data["known_methods"] + if not isinstance(data__knownmethods, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".known_methods must be array") + data__knownmethods_is_list = isinstance(data__knownmethods, (list, tuple)) + if data__knownmethods_is_list: + data__knownmethods_len = len(data__knownmethods) + if data__knownmethods_len < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".known_methods must contain at least 0 items") + for data__knownmethods_x, data__knownmethods_item in enumerate(data__knownmethods): + if not isinstance(data__knownmethods_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".known_methods[{data__knownmethods_x}]".format(**locals()) + " must be string") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_resource(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "attributes" in data_keys: + data_keys.remove("attributes") + data__attributes = data["attributes"] + if not isinstance(data__attributes, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attributes must be array") + data__attributes_is_list = isinstance(data__attributes, (list, tuple)) + if data__attributes_is_list: + data__attributes_len = len(data__attributes) + if data__attributes_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attributes must contain at least 1 items") + for data__attributes_x, data__attributes_item in enumerate(data__attributes): + validate____defs_attributenamevalue(data__attributes_item, custom_formats, (name_prefix or "data") + ".attributes[{data__attributes_x}]".format(**locals())) + if "detection/development" in data_keys: + data_keys.remove("detection/development") + data__detectiondevelopment = data["detection/development"] + validate____defs_experimentalresourcedetection(data__detectiondevelopment, custom_formats, (name_prefix or "data") + ".detection/development") + if "schema_url" in data_keys: + data_keys.remove("schema_url") + data__schemaurl = data["schema_url"] + if not isinstance(data__schemaurl, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".schema_url must be string or null") + if "attributes_list" in data_keys: + data_keys.remove("attributes_list") + data__attributeslist = data["attributes_list"] + if not isinstance(data__attributeslist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attributes_list must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalresourcedetection(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "attributes" in data_keys: + data_keys.remove("attributes") + data__attributes = data["attributes"] + validate____defs_includeexclude(data__attributes, custom_formats, (name_prefix or "data") + ".attributes") + if "detectors" in data_keys: + data_keys.remove("detectors") + data__detectors = data["detectors"] + if not isinstance(data__detectors, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".detectors must be array") + data__detectors_is_list = isinstance(data__detectors, (list, tuple)) + if data__detectors_is_list: + data__detectors_len = len(data__detectors) + if data__detectors_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".detectors must contain at least 1 items") + for data__detectors_x, data__detectors_item in enumerate(data__detectors): + validate____defs_experimentalresourcedetector(data__detectors_item, custom_formats, (name_prefix or "data") + ".detectors[{data__detectors_x}]".format(**locals())) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalresourcedetector(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "container" in data_keys: + data_keys.remove("container") + data__container = data["container"] + validate____defs_experimentalcontainerresourcedetector(data__container, custom_formats, (name_prefix or "data") + ".container") + if "host" in data_keys: + data_keys.remove("host") + data__host = data["host"] + validate____defs_experimentalhostresourcedetector(data__host, custom_formats, (name_prefix or "data") + ".host") + if "process" in data_keys: + data_keys.remove("process") + data__process = data["process"] + validate____defs_experimentalprocessresourcedetector(data__process, custom_formats, (name_prefix or "data") + ".process") + if "service" in data_keys: + data_keys.remove("service") + data__service = data["service"] + validate____defs_experimentalserviceresourcedetector(data__service, custom_formats, (name_prefix or "data") + ".service") + for data_key in data_keys: + if data_key not in ['container', 'host', 'process', 'service']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_experimentalserviceresourcedetector(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalprocessresourcedetector(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalhostresourcedetector(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcontainerresourcedetector(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_includeexclude(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "included" in data_keys: + data_keys.remove("included") + data__included = data["included"] + if not isinstance(data__included, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".included must be array") + data__included_is_list = isinstance(data__included, (list, tuple)) + if data__included_is_list: + data__included_len = len(data__included) + if data__included_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".included must contain at least 1 items") + for data__included_x, data__included_item in enumerate(data__included): + if not isinstance(data__included_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".included[{data__included_x}]".format(**locals()) + " must be string") + if "excluded" in data_keys: + data_keys.remove("excluded") + data__excluded = data["excluded"] + if not isinstance(data__excluded, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".excluded must be array") + data__excluded_is_list = isinstance(data__excluded, (list, tuple)) + if data__excluded_is_list: + data__excluded_len = len(data__excluded) + if data__excluded_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".excluded must contain at least 1 items") + for data__excluded_x, data__excluded_item in enumerate(data__excluded): + if not isinstance(data__excluded_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".excluded[{data__excluded_x}]".format(**locals()) + " must be string") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_attributenamevalue(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['name', 'value']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "name" in data_keys: + data_keys.remove("name") + data__name = data["name"] + if not isinstance(data__name, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string") + if "value" in data_keys: + data_keys.remove("value") + data__value = data["value"] + data__value_one_of_count1 = 0 + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be string") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (int, float, Decimal)) or isinstance(data__value, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be number") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (bool)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be boolean") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be null") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be array") + data__value_is_list = isinstance(data__value, (list, tuple)) + if data__value_is_list: + data__value_len = len(data__value) + if data__value_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must contain at least 1 items") + for data__value_x, data__value_item in enumerate(data__value): + if not isinstance(data__value_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value[{data__value_x}]".format(**locals()) + " must be string") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be array") + data__value_is_list = isinstance(data__value, (list, tuple)) + if data__value_is_list: + data__value_len = len(data__value) + if data__value_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must contain at least 1 items") + for data__value_x, data__value_item in enumerate(data__value): + if not isinstance(data__value_item, (bool)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value[{data__value_x}]".format(**locals()) + " must be boolean") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 < 2: + try: + if not isinstance(data__value, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be array") + data__value_is_list = isinstance(data__value, (list, tuple)) + if data__value_is_list: + data__value_len = len(data__value) + if data__value_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must contain at least 1 items") + for data__value_x, data__value_item in enumerate(data__value): + if not isinstance(data__value_item, (int, float, Decimal)) or isinstance(data__value_item, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value[{data__value_x}]".format(**locals()) + " must be number") + data__value_one_of_count1 += 1 + except (JsonSchemaValueException, JsonSchemaValuesException): pass + if data__value_one_of_count1 != 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be valid exactly by one definition") + if "type" in data_keys: + data_keys.remove("type") + data__type = data["type"] + validate____defs_attributetype(data__type, custom_formats, (name_prefix or "data") + ".type") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_attributetype(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'string' or isinstance(data, str) and data == 'bool' or isinstance(data, str) and data == 'int' or isinstance(data, str) and data == 'double' or isinstance(data, str) and data == 'string_array' or isinstance(data, str) and data == 'bool_array' or isinstance(data, str) and data == 'int_array' or isinstance(data, str) and data == 'double_array'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['string', 'bool', 'int', 'double', 'string_array', 'bool_array', 'int_array', 'double_array']") + return data + +def validate____defs_tracerprovider(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['processors']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "processors" in data_keys: + data_keys.remove("processors") + data__processors = data["processors"] + if not isinstance(data__processors, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".processors must be array") + data__processors_is_list = isinstance(data__processors, (list, tuple)) + if data__processors_is_list: + data__processors_len = len(data__processors) + if data__processors_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".processors must contain at least 1 items") + for data__processors_x, data__processors_item in enumerate(data__processors): + validate____defs_spanprocessor(data__processors_item, custom_formats, (name_prefix or "data") + ".processors[{data__processors_x}]".format(**locals())) + if "limits" in data_keys: + data_keys.remove("limits") + data__limits = data["limits"] + validate____defs_spanlimits(data__limits, custom_formats, (name_prefix or "data") + ".limits") + if "sampler" in data_keys: + data_keys.remove("sampler") + data__sampler = data["sampler"] + validate____defs_sampler(data__sampler, custom_formats, (name_prefix or "data") + ".sampler") + if "id_generator" in data_keys: + data_keys.remove("id_generator") + data__idgenerator = data["id_generator"] + validate____defs_idgenerator(data__idgenerator, custom_formats, (name_prefix or "data") + ".id_generator") + if "tracer_configurator/development" in data_keys: + data_keys.remove("tracer_configurator/development") + data__tracerconfiguratordevelopment = data["tracer_configurator/development"] + validate____defs_experimentaltracerconfigurator(data__tracerconfiguratordevelopment, custom_formats, (name_prefix or "data") + ".tracer_configurator/development") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentaltracerconfigurator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "default_config" in data_keys: + data_keys.remove("default_config") + data__defaultconfig = data["default_config"] + validate____defs_experimentaltracerconfig(data__defaultconfig, custom_formats, (name_prefix or "data") + ".default_config") + if "tracers" in data_keys: + data_keys.remove("tracers") + data__tracers = data["tracers"] + if not isinstance(data__tracers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".tracers must be array") + data__tracers_is_list = isinstance(data__tracers, (list, tuple)) + if data__tracers_is_list: + data__tracers_len = len(data__tracers) + if data__tracers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".tracers must contain at least 1 items") + for data__tracers_x, data__tracers_item in enumerate(data__tracers): + validate____defs_experimentaltracermatcherandconfig(data__tracers_item, custom_formats, (name_prefix or "data") + ".tracers[{data__tracers_x}]".format(**locals())) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentaltracermatcherandconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['name', 'config']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "name" in data_keys: + data_keys.remove("name") + data__name = data["name"] + if not isinstance(data__name, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string") + if "config" in data_keys: + data_keys.remove("config") + data__config = data["config"] + validate____defs_experimentaltracerconfig(data__config, custom_formats, (name_prefix or "data") + ".config") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentaltracerconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "enabled" in data_keys: + data_keys.remove("enabled") + data__enabled = data["enabled"] + if not isinstance(data__enabled, (bool)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".enabled must be boolean") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_idgenerator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "random" in data_keys: + data_keys.remove("random") + data__random = data["random"] + validate____defs_randomidgenerator(data__random, custom_formats, (name_prefix or "data") + ".random") + for data_key in data_keys: + if data_key not in ['random']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_randomidgenerator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_sampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "always_off" in data_keys: + data_keys.remove("always_off") + data__alwaysoff = data["always_off"] + validate____defs_alwaysoffsampler(data__alwaysoff, custom_formats, (name_prefix or "data") + ".always_off") + if "always_on" in data_keys: + data_keys.remove("always_on") + data__alwayson = data["always_on"] + validate____defs_alwaysonsampler(data__alwayson, custom_formats, (name_prefix or "data") + ".always_on") + if "composite/development" in data_keys: + data_keys.remove("composite/development") + data__compositedevelopment = data["composite/development"] + validate____defs_experimentalcomposablesampler(data__compositedevelopment, custom_formats, (name_prefix or "data") + ".composite/development") + if "jaeger_remote/development" in data_keys: + data_keys.remove("jaeger_remote/development") + data__jaegerremotedevelopment = data["jaeger_remote/development"] + validate____defs_experimentaljaegerremotesampler(data__jaegerremotedevelopment, custom_formats, (name_prefix or "data") + ".jaeger_remote/development") + if "parent_based" in data_keys: + data_keys.remove("parent_based") + data__parentbased = data["parent_based"] + validate____defs_parentbasedsampler(data__parentbased, custom_formats, (name_prefix or "data") + ".parent_based") + if "probability/development" in data_keys: + data_keys.remove("probability/development") + data__probabilitydevelopment = data["probability/development"] + validate____defs_experimentalprobabilitysampler(data__probabilitydevelopment, custom_formats, (name_prefix or "data") + ".probability/development") + if "trace_id_ratio_based" in data_keys: + data_keys.remove("trace_id_ratio_based") + data__traceidratiobased = data["trace_id_ratio_based"] + validate____defs_traceidratiobasedsampler(data__traceidratiobased, custom_formats, (name_prefix or "data") + ".trace_id_ratio_based") + for data_key in data_keys: + if data_key not in ['always_off', 'always_on', 'composite/development', 'jaeger_remote/development', 'parent_based', 'probability/development', 'trace_id_ratio_based']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_traceidratiobasedsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "ratio" in data_keys: + data_keys.remove("ratio") + data__ratio = data["ratio"] + if not isinstance(data__ratio, (int, float, Decimal, NoneType)) or isinstance(data__ratio, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be number or null") + if isinstance(data__ratio, (int, float, Decimal)): + if data__ratio < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be bigger than or equal to 0") + if data__ratio > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be smaller than or equal to 1") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalprobabilitysampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "ratio" in data_keys: + data_keys.remove("ratio") + data__ratio = data["ratio"] + if not isinstance(data__ratio, (int, float, Decimal, NoneType)) or isinstance(data__ratio, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be number or null") + if isinstance(data__ratio, (int, float, Decimal)): + if data__ratio < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be bigger than or equal to 0") + if data__ratio > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be smaller than or equal to 1") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_parentbasedsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "root" in data_keys: + data_keys.remove("root") + data__root = data["root"] + validate____defs_sampler(data__root, custom_formats, (name_prefix or "data") + ".root") + if "remote_parent_sampled" in data_keys: + data_keys.remove("remote_parent_sampled") + data__remoteparentsampled = data["remote_parent_sampled"] + validate____defs_sampler(data__remoteparentsampled, custom_formats, (name_prefix or "data") + ".remote_parent_sampled") + if "remote_parent_not_sampled" in data_keys: + data_keys.remove("remote_parent_not_sampled") + data__remoteparentnotsampled = data["remote_parent_not_sampled"] + validate____defs_sampler(data__remoteparentnotsampled, custom_formats, (name_prefix or "data") + ".remote_parent_not_sampled") + if "local_parent_sampled" in data_keys: + data_keys.remove("local_parent_sampled") + data__localparentsampled = data["local_parent_sampled"] + validate____defs_sampler(data__localparentsampled, custom_formats, (name_prefix or "data") + ".local_parent_sampled") + if "local_parent_not_sampled" in data_keys: + data_keys.remove("local_parent_not_sampled") + data__localparentnotsampled = data["local_parent_not_sampled"] + validate____defs_sampler(data__localparentnotsampled, custom_formats, (name_prefix or "data") + ".local_parent_not_sampled") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentaljaegerremotesampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['endpoint', 'initial_sampler']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "endpoint" in data_keys: + data_keys.remove("endpoint") + data__endpoint = data["endpoint"] + if not isinstance(data__endpoint, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".endpoint must be string") + if "interval" in data_keys: + data_keys.remove("interval") + data__interval = data["interval"] + if not isinstance(data__interval, (int, NoneType)) and not (isinstance(data__interval, float) and data__interval.is_integer()) or isinstance(data__interval, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".interval must be integer or null") + if isinstance(data__interval, (int, float, Decimal)): + if data__interval < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".interval must be bigger than or equal to 0") + if "initial_sampler" in data_keys: + data_keys.remove("initial_sampler") + data__initialsampler = data["initial_sampler"] + validate____defs_sampler(data__initialsampler, custom_formats, (name_prefix or "data") + ".initial_sampler") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposablesampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "always_off" in data_keys: + data_keys.remove("always_off") + data__alwaysoff = data["always_off"] + validate____defs_experimentalcomposablealwaysoffsampler(data__alwaysoff, custom_formats, (name_prefix or "data") + ".always_off") + if "always_on" in data_keys: + data_keys.remove("always_on") + data__alwayson = data["always_on"] + validate____defs_experimentalcomposablealwaysonsampler(data__alwayson, custom_formats, (name_prefix or "data") + ".always_on") + if "parent_threshold" in data_keys: + data_keys.remove("parent_threshold") + data__parentthreshold = data["parent_threshold"] + validate____defs_experimentalcomposableparentthresholdsampler(data__parentthreshold, custom_formats, (name_prefix or "data") + ".parent_threshold") + if "probability" in data_keys: + data_keys.remove("probability") + data__probability = data["probability"] + validate____defs_experimentalcomposableprobabilitysampler(data__probability, custom_formats, (name_prefix or "data") + ".probability") + if "rule_based" in data_keys: + data_keys.remove("rule_based") + data__rulebased = data["rule_based"] + validate____defs_experimentalcomposablerulebasedsampler(data__rulebased, custom_formats, (name_prefix or "data") + ".rule_based") + for data_key in data_keys: + if data_key not in ['always_off', 'always_on', 'parent_threshold', 'probability', 'rule_based']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_experimentalcomposablerulebasedsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "rules" in data_keys: + data_keys.remove("rules") + data__rules = data["rules"] + if not isinstance(data__rules, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".rules must be array") + data__rules_is_list = isinstance(data__rules, (list, tuple)) + if data__rules_is_list: + data__rules_len = len(data__rules) + if data__rules_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".rules must contain at least 1 items") + for data__rules_x, data__rules_item in enumerate(data__rules): + validate____defs_experimentalcomposablerulebasedsamplerrule(data__rules_item, custom_formats, (name_prefix or "data") + ".rules[{data__rules_x}]".format(**locals())) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposablerulebasedsamplerrule(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['sampler']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "attribute_values" in data_keys: + data_keys.remove("attribute_values") + data__attributevalues = data["attribute_values"] + validate____defs_experimentalcomposablerulebasedsamplerruleattributevalues(data__attributevalues, custom_formats, (name_prefix or "data") + ".attribute_values") + if "attribute_patterns" in data_keys: + data_keys.remove("attribute_patterns") + data__attributepatterns = data["attribute_patterns"] + validate____defs_experimentalcomposablerulebasedsamplerruleattributepatterns(data__attributepatterns, custom_formats, (name_prefix or "data") + ".attribute_patterns") + if "span_kinds" in data_keys: + data_keys.remove("span_kinds") + data__spankinds = data["span_kinds"] + if not isinstance(data__spankinds, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".span_kinds must be array") + data__spankinds_is_list = isinstance(data__spankinds, (list, tuple)) + if data__spankinds_is_list: + data__spankinds_len = len(data__spankinds) + if data__spankinds_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".span_kinds must contain at least 1 items") + for data__spankinds_x, data__spankinds_item in enumerate(data__spankinds): + validate____defs_spankind(data__spankinds_item, custom_formats, (name_prefix or "data") + ".span_kinds[{data__spankinds_x}]".format(**locals())) + if "parent" in data_keys: + data_keys.remove("parent") + data__parent = data["parent"] + if not isinstance(data__parent, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".parent must be array") + data__parent_is_list = isinstance(data__parent, (list, tuple)) + if data__parent_is_list: + data__parent_len = len(data__parent) + if data__parent_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".parent must contain at least 1 items") + for data__parent_x, data__parent_item in enumerate(data__parent): + validate____defs_experimentalspanparent(data__parent_item, custom_formats, (name_prefix or "data") + ".parent[{data__parent_x}]".format(**locals())) + if "sampler" in data_keys: + data_keys.remove("sampler") + data__sampler = data["sampler"] + validate____defs_experimentalcomposablesampler(data__sampler, custom_formats, (name_prefix or "data") + ".sampler") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalspanparent(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'none' or isinstance(data, str) and data == 'remote' or isinstance(data, str) and data == 'local'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['none', 'remote', 'local']") + return data + +def validate____defs_spankind(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'internal' or isinstance(data, str) and data == 'server' or isinstance(data, str) and data == 'client' or isinstance(data, str) and data == 'producer' or isinstance(data, str) and data == 'consumer'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['internal', 'server', 'client', 'producer', 'consumer']") + return data + +def validate____defs_experimentalcomposablerulebasedsamplerruleattributepatterns(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['key']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "key" in data_keys: + data_keys.remove("key") + data__key = data["key"] + if not isinstance(data__key, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".key must be string") + if "included" in data_keys: + data_keys.remove("included") + data__included = data["included"] + if not isinstance(data__included, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".included must be array") + data__included_is_list = isinstance(data__included, (list, tuple)) + if data__included_is_list: + data__included_len = len(data__included) + if data__included_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".included must contain at least 1 items") + for data__included_x, data__included_item in enumerate(data__included): + if not isinstance(data__included_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".included[{data__included_x}]".format(**locals()) + " must be string") + if "excluded" in data_keys: + data_keys.remove("excluded") + data__excluded = data["excluded"] + if not isinstance(data__excluded, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".excluded must be array") + data__excluded_is_list = isinstance(data__excluded, (list, tuple)) + if data__excluded_is_list: + data__excluded_len = len(data__excluded) + if data__excluded_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".excluded must contain at least 1 items") + for data__excluded_x, data__excluded_item in enumerate(data__excluded): + if not isinstance(data__excluded_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".excluded[{data__excluded_x}]".format(**locals()) + " must be string") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposablerulebasedsamplerruleattributevalues(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['key', 'values']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "key" in data_keys: + data_keys.remove("key") + data__key = data["key"] + if not isinstance(data__key, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".key must be string") + if "values" in data_keys: + data_keys.remove("values") + data__values = data["values"] + if not isinstance(data__values, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".values must be array") + data__values_is_list = isinstance(data__values, (list, tuple)) + if data__values_is_list: + data__values_len = len(data__values) + if data__values_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".values must contain at least 1 items") + for data__values_x, data__values_item in enumerate(data__values): + if not isinstance(data__values_item, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".values[{data__values_x}]".format(**locals()) + " must be string") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposableprobabilitysampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "ratio" in data_keys: + data_keys.remove("ratio") + data__ratio = data["ratio"] + if not isinstance(data__ratio, (int, float, Decimal, NoneType)) or isinstance(data__ratio, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be number or null") + if isinstance(data__ratio, (int, float, Decimal)): + if data__ratio < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be bigger than or equal to 0") + if data__ratio > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ratio must be smaller than or equal to 1") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposableparentthresholdsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['root']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "root" in data_keys: + data_keys.remove("root") + data__root = data["root"] + validate____defs_experimentalcomposablesampler(data__root, custom_formats, (name_prefix or "data") + ".root") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposablealwaysonsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalcomposablealwaysoffsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_alwaysonsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_alwaysoffsampler(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_spanlimits(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "attribute_value_length_limit" in data_keys: + data_keys.remove("attribute_value_length_limit") + data__attributevaluelengthlimit = data["attribute_value_length_limit"] + if not isinstance(data__attributevaluelengthlimit, (int, NoneType)) and not (isinstance(data__attributevaluelengthlimit, float) and data__attributevaluelengthlimit.is_integer()) or isinstance(data__attributevaluelengthlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_value_length_limit must be integer or null") + if isinstance(data__attributevaluelengthlimit, (int, float, Decimal)): + if data__attributevaluelengthlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_value_length_limit must be bigger than or equal to 0") + if "attribute_count_limit" in data_keys: + data_keys.remove("attribute_count_limit") + data__attributecountlimit = data["attribute_count_limit"] + if not isinstance(data__attributecountlimit, (int, NoneType)) and not (isinstance(data__attributecountlimit, float) and data__attributecountlimit.is_integer()) or isinstance(data__attributecountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_count_limit must be integer or null") + if isinstance(data__attributecountlimit, (int, float, Decimal)): + if data__attributecountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_count_limit must be bigger than or equal to 0") + if "event_count_limit" in data_keys: + data_keys.remove("event_count_limit") + data__eventcountlimit = data["event_count_limit"] + if not isinstance(data__eventcountlimit, (int, NoneType)) and not (isinstance(data__eventcountlimit, float) and data__eventcountlimit.is_integer()) or isinstance(data__eventcountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".event_count_limit must be integer or null") + if isinstance(data__eventcountlimit, (int, float, Decimal)): + if data__eventcountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".event_count_limit must be bigger than or equal to 0") + if "link_count_limit" in data_keys: + data_keys.remove("link_count_limit") + data__linkcountlimit = data["link_count_limit"] + if not isinstance(data__linkcountlimit, (int, NoneType)) and not (isinstance(data__linkcountlimit, float) and data__linkcountlimit.is_integer()) or isinstance(data__linkcountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".link_count_limit must be integer or null") + if isinstance(data__linkcountlimit, (int, float, Decimal)): + if data__linkcountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".link_count_limit must be bigger than or equal to 0") + if "event_attribute_count_limit" in data_keys: + data_keys.remove("event_attribute_count_limit") + data__eventattributecountlimit = data["event_attribute_count_limit"] + if not isinstance(data__eventattributecountlimit, (int, NoneType)) and not (isinstance(data__eventattributecountlimit, float) and data__eventattributecountlimit.is_integer()) or isinstance(data__eventattributecountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".event_attribute_count_limit must be integer or null") + if isinstance(data__eventattributecountlimit, (int, float, Decimal)): + if data__eventattributecountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".event_attribute_count_limit must be bigger than or equal to 0") + if "link_attribute_count_limit" in data_keys: + data_keys.remove("link_attribute_count_limit") + data__linkattributecountlimit = data["link_attribute_count_limit"] + if not isinstance(data__linkattributecountlimit, (int, NoneType)) and not (isinstance(data__linkattributecountlimit, float) and data__linkattributecountlimit.is_integer()) or isinstance(data__linkattributecountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".link_attribute_count_limit must be integer or null") + if isinstance(data__linkattributecountlimit, (int, float, Decimal)): + if data__linkattributecountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".link_attribute_count_limit must be bigger than or equal to 0") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_spanprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "batch" in data_keys: + data_keys.remove("batch") + data__batch = data["batch"] + validate____defs_batchspanprocessor(data__batch, custom_formats, (name_prefix or "data") + ".batch") + if "simple" in data_keys: + data_keys.remove("simple") + data__simple = data["simple"] + validate____defs_simplespanprocessor(data__simple, custom_formats, (name_prefix or "data") + ".simple") + for data_key in data_keys: + if data_key not in ['batch', 'simple']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_simplespanprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['exporter']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "exporter" in data_keys: + data_keys.remove("exporter") + data__exporter = data["exporter"] + validate____defs_spanexporter(data__exporter, custom_formats, (name_prefix or "data") + ".exporter") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_spanexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "otlp_http" in data_keys: + data_keys.remove("otlp_http") + data__otlphttp = data["otlp_http"] + validate____defs_otlphttpexporter(data__otlphttp, custom_formats, (name_prefix or "data") + ".otlp_http") + if "otlp_grpc" in data_keys: + data_keys.remove("otlp_grpc") + data__otlpgrpc = data["otlp_grpc"] + validate____defs_otlpgrpcexporter(data__otlpgrpc, custom_formats, (name_prefix or "data") + ".otlp_grpc") + if "otlp_file/development" in data_keys: + data_keys.remove("otlp_file/development") + data__otlpfiledevelopment = data["otlp_file/development"] + validate____defs_experimentalotlpfileexporter(data__otlpfiledevelopment, custom_formats, (name_prefix or "data") + ".otlp_file/development") + if "console" in data_keys: + data_keys.remove("console") + data__console = data["console"] + validate____defs_consoleexporter(data__console, custom_formats, (name_prefix or "data") + ".console") + for data_key in data_keys: + if data_key not in ['otlp_http', 'otlp_grpc', 'otlp_file/development', 'console']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_consoleexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalotlpfileexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "output_stream" in data_keys: + data_keys.remove("output_stream") + data__outputstream = data["output_stream"] + if not isinstance(data__outputstream, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".output_stream must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_otlpgrpcexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "endpoint" in data_keys: + data_keys.remove("endpoint") + data__endpoint = data["endpoint"] + if not isinstance(data__endpoint, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".endpoint must be string or null") + if "tls" in data_keys: + data_keys.remove("tls") + data__tls = data["tls"] + validate____defs_grpctls(data__tls, custom_formats, (name_prefix or "data") + ".tls") + if "headers" in data_keys: + data_keys.remove("headers") + data__headers = data["headers"] + if not isinstance(data__headers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must be array") + data__headers_is_list = isinstance(data__headers, (list, tuple)) + if data__headers_is_list: + data__headers_len = len(data__headers) + if data__headers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must contain at least 1 items") + for data__headers_x, data__headers_item in enumerate(data__headers): + validate____defs_namestringvaluepair(data__headers_item, custom_formats, (name_prefix or "data") + ".headers[{data__headers_x}]".format(**locals())) + if "headers_list" in data_keys: + data_keys.remove("headers_list") + data__headerslist = data["headers_list"] + if not isinstance(data__headerslist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers_list must be string or null") + if "compression" in data_keys: + data_keys.remove("compression") + data__compression = data["compression"] + if not isinstance(data__compression, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".compression must be string or null") + if "timeout" in data_keys: + data_keys.remove("timeout") + data__timeout = data["timeout"] + if not isinstance(data__timeout, (int, NoneType)) and not (isinstance(data__timeout, float) and data__timeout.is_integer()) or isinstance(data__timeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be integer or null") + if isinstance(data__timeout, (int, float, Decimal)): + if data__timeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be bigger than or equal to 0") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_namestringvaluepair(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['name', 'value']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "name" in data_keys: + data_keys.remove("name") + data__name = data["name"] + if not isinstance(data__name, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string") + if "value" in data_keys: + data_keys.remove("value") + data__value = data["value"] + if not isinstance(data__value, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".value must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_grpctls(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "ca_file" in data_keys: + data_keys.remove("ca_file") + data__cafile = data["ca_file"] + if not isinstance(data__cafile, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ca_file must be string or null") + if "key_file" in data_keys: + data_keys.remove("key_file") + data__keyfile = data["key_file"] + if not isinstance(data__keyfile, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".key_file must be string or null") + if "cert_file" in data_keys: + data_keys.remove("cert_file") + data__certfile = data["cert_file"] + if not isinstance(data__certfile, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".cert_file must be string or null") + if "insecure" in data_keys: + data_keys.remove("insecure") + data__insecure = data["insecure"] + if not isinstance(data__insecure, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".insecure must be boolean or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_otlphttpexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "endpoint" in data_keys: + data_keys.remove("endpoint") + data__endpoint = data["endpoint"] + if not isinstance(data__endpoint, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".endpoint must be string or null") + if "tls" in data_keys: + data_keys.remove("tls") + data__tls = data["tls"] + validate____defs_httptls(data__tls, custom_formats, (name_prefix or "data") + ".tls") + if "headers" in data_keys: + data_keys.remove("headers") + data__headers = data["headers"] + if not isinstance(data__headers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must be array") + data__headers_is_list = isinstance(data__headers, (list, tuple)) + if data__headers_is_list: + data__headers_len = len(data__headers) + if data__headers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must contain at least 1 items") + for data__headers_x, data__headers_item in enumerate(data__headers): + validate____defs_namestringvaluepair(data__headers_item, custom_formats, (name_prefix or "data") + ".headers[{data__headers_x}]".format(**locals())) + if "headers_list" in data_keys: + data_keys.remove("headers_list") + data__headerslist = data["headers_list"] + if not isinstance(data__headerslist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers_list must be string or null") + if "compression" in data_keys: + data_keys.remove("compression") + data__compression = data["compression"] + if not isinstance(data__compression, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".compression must be string or null") + if "timeout" in data_keys: + data_keys.remove("timeout") + data__timeout = data["timeout"] + if not isinstance(data__timeout, (int, NoneType)) and not (isinstance(data__timeout, float) and data__timeout.is_integer()) or isinstance(data__timeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be integer or null") + if isinstance(data__timeout, (int, float, Decimal)): + if data__timeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be bigger than or equal to 0") + if "encoding" in data_keys: + data_keys.remove("encoding") + data__encoding = data["encoding"] + validate____defs_otlphttpencoding(data__encoding, custom_formats, (name_prefix or "data") + ".encoding") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_otlphttpencoding(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'protobuf' or isinstance(data, str) and data == 'json'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['protobuf', 'json']") + return data + +def validate____defs_httptls(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "ca_file" in data_keys: + data_keys.remove("ca_file") + data__cafile = data["ca_file"] + if not isinstance(data__cafile, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".ca_file must be string or null") + if "key_file" in data_keys: + data_keys.remove("key_file") + data__keyfile = data["key_file"] + if not isinstance(data__keyfile, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".key_file must be string or null") + if "cert_file" in data_keys: + data_keys.remove("cert_file") + data__certfile = data["cert_file"] + if not isinstance(data__certfile, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".cert_file must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_batchspanprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['exporter']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "schedule_delay" in data_keys: + data_keys.remove("schedule_delay") + data__scheduledelay = data["schedule_delay"] + if not isinstance(data__scheduledelay, (int, NoneType)) and not (isinstance(data__scheduledelay, float) and data__scheduledelay.is_integer()) or isinstance(data__scheduledelay, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".schedule_delay must be integer or null") + if isinstance(data__scheduledelay, (int, float, Decimal)): + if data__scheduledelay < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".schedule_delay must be bigger than or equal to 0") + if "export_timeout" in data_keys: + data_keys.remove("export_timeout") + data__exporttimeout = data["export_timeout"] + if not isinstance(data__exporttimeout, (int, NoneType)) and not (isinstance(data__exporttimeout, float) and data__exporttimeout.is_integer()) or isinstance(data__exporttimeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".export_timeout must be integer or null") + if isinstance(data__exporttimeout, (int, float, Decimal)): + if data__exporttimeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".export_timeout must be bigger than or equal to 0") + if "max_queue_size" in data_keys: + data_keys.remove("max_queue_size") + data__maxqueuesize = data["max_queue_size"] + if not isinstance(data__maxqueuesize, (int, NoneType)) and not (isinstance(data__maxqueuesize, float) and data__maxqueuesize.is_integer()) or isinstance(data__maxqueuesize, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_queue_size must be integer or null") + if isinstance(data__maxqueuesize, (int, float, Decimal)): + if data__maxqueuesize <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_queue_size must be bigger than 0") + if "max_export_batch_size" in data_keys: + data_keys.remove("max_export_batch_size") + data__maxexportbatchsize = data["max_export_batch_size"] + if not isinstance(data__maxexportbatchsize, (int, NoneType)) and not (isinstance(data__maxexportbatchsize, float) and data__maxexportbatchsize.is_integer()) or isinstance(data__maxexportbatchsize, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_export_batch_size must be integer or null") + if isinstance(data__maxexportbatchsize, (int, float, Decimal)): + if data__maxexportbatchsize <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_export_batch_size must be bigger than 0") + if "exporter" in data_keys: + data_keys.remove("exporter") + data__exporter = data["exporter"] + validate____defs_spanexporter(data__exporter, custom_formats, (name_prefix or "data") + ".exporter") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_propagator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "composite" in data_keys: + data_keys.remove("composite") + data__composite = data["composite"] + if not isinstance(data__composite, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".composite must be array") + data__composite_is_list = isinstance(data__composite, (list, tuple)) + if data__composite_is_list: + data__composite_len = len(data__composite) + if data__composite_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".composite must contain at least 1 items") + for data__composite_x, data__composite_item in enumerate(data__composite): + validate____defs_textmappropagator(data__composite_item, custom_formats, (name_prefix or "data") + ".composite[{data__composite_x}]".format(**locals())) + if "composite_list" in data_keys: + data_keys.remove("composite_list") + data__compositelist = data["composite_list"] + if not isinstance(data__compositelist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".composite_list must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_textmappropagator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "tracecontext" in data_keys: + data_keys.remove("tracecontext") + data__tracecontext = data["tracecontext"] + validate____defs_tracecontextpropagator(data__tracecontext, custom_formats, (name_prefix or "data") + ".tracecontext") + if "baggage" in data_keys: + data_keys.remove("baggage") + data__baggage = data["baggage"] + validate____defs_baggagepropagator(data__baggage, custom_formats, (name_prefix or "data") + ".baggage") + if "b3" in data_keys: + data_keys.remove("b3") + data__b3 = data["b3"] + validate____defs_b3propagator(data__b3, custom_formats, (name_prefix or "data") + ".b3") + if "b3multi" in data_keys: + data_keys.remove("b3multi") + data__b3multi = data["b3multi"] + validate____defs_b3multipropagator(data__b3multi, custom_formats, (name_prefix or "data") + ".b3multi") + for data_key in data_keys: + if data_key not in ['tracecontext', 'baggage', 'b3', 'b3multi']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_b3multipropagator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_b3propagator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_baggagepropagator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_tracecontextpropagator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_meterprovider(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['readers']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "readers" in data_keys: + data_keys.remove("readers") + data__readers = data["readers"] + if not isinstance(data__readers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".readers must be array") + data__readers_is_list = isinstance(data__readers, (list, tuple)) + if data__readers_is_list: + data__readers_len = len(data__readers) + if data__readers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".readers must contain at least 1 items") + for data__readers_x, data__readers_item in enumerate(data__readers): + validate____defs_metricreader(data__readers_item, custom_formats, (name_prefix or "data") + ".readers[{data__readers_x}]".format(**locals())) + if "views" in data_keys: + data_keys.remove("views") + data__views = data["views"] + if not isinstance(data__views, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".views must be array") + data__views_is_list = isinstance(data__views, (list, tuple)) + if data__views_is_list: + data__views_len = len(data__views) + if data__views_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".views must contain at least 1 items") + for data__views_x, data__views_item in enumerate(data__views): + validate____defs_view(data__views_item, custom_formats, (name_prefix or "data") + ".views[{data__views_x}]".format(**locals())) + if "exemplar_filter" in data_keys: + data_keys.remove("exemplar_filter") + data__exemplarfilter = data["exemplar_filter"] + validate____defs_exemplarfilter(data__exemplarfilter, custom_formats, (name_prefix or "data") + ".exemplar_filter") + if "meter_configurator/development" in data_keys: + data_keys.remove("meter_configurator/development") + data__meterconfiguratordevelopment = data["meter_configurator/development"] + validate____defs_experimentalmeterconfigurator(data__meterconfiguratordevelopment, custom_formats, (name_prefix or "data") + ".meter_configurator/development") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalmeterconfigurator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "default_config" in data_keys: + data_keys.remove("default_config") + data__defaultconfig = data["default_config"] + validate____defs_experimentalmeterconfig(data__defaultconfig, custom_formats, (name_prefix or "data") + ".default_config") + if "meters" in data_keys: + data_keys.remove("meters") + data__meters = data["meters"] + if not isinstance(data__meters, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".meters must be array") + data__meters_is_list = isinstance(data__meters, (list, tuple)) + if data__meters_is_list: + data__meters_len = len(data__meters) + if data__meters_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".meters must contain at least 1 items") + for data__meters_x, data__meters_item in enumerate(data__meters): + validate____defs_experimentalmetermatcherandconfig(data__meters_item, custom_formats, (name_prefix or "data") + ".meters[{data__meters_x}]".format(**locals())) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalmetermatcherandconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['name', 'config']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "name" in data_keys: + data_keys.remove("name") + data__name = data["name"] + if not isinstance(data__name, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string") + if "config" in data_keys: + data_keys.remove("config") + data__config = data["config"] + validate____defs_experimentalmeterconfig(data__config, custom_formats, (name_prefix or "data") + ".config") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalmeterconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "enabled" in data_keys: + data_keys.remove("enabled") + data__enabled = data["enabled"] + if not isinstance(data__enabled, (bool)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".enabled must be boolean") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_exemplarfilter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'always_on' or isinstance(data, str) and data == 'always_off' or isinstance(data, str) and data == 'trace_based'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['always_on', 'always_off', 'trace_based']") + return data + +def validate____defs_view(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['selector', 'stream']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "selector" in data_keys: + data_keys.remove("selector") + data__selector = data["selector"] + validate____defs_viewselector(data__selector, custom_formats, (name_prefix or "data") + ".selector") + if "stream" in data_keys: + data_keys.remove("stream") + data__stream = data["stream"] + validate____defs_viewstream(data__stream, custom_formats, (name_prefix or "data") + ".stream") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_viewstream(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "name" in data_keys: + data_keys.remove("name") + data__name = data["name"] + if not isinstance(data__name, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string or null") + if "description" in data_keys: + data_keys.remove("description") + data__description = data["description"] + if not isinstance(data__description, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".description must be string or null") + if "aggregation" in data_keys: + data_keys.remove("aggregation") + data__aggregation = data["aggregation"] + validate____defs_aggregation(data__aggregation, custom_formats, (name_prefix or "data") + ".aggregation") + if "aggregation_cardinality_limit" in data_keys: + data_keys.remove("aggregation_cardinality_limit") + data__aggregationcardinalitylimit = data["aggregation_cardinality_limit"] + if not isinstance(data__aggregationcardinalitylimit, (int, NoneType)) and not (isinstance(data__aggregationcardinalitylimit, float) and data__aggregationcardinalitylimit.is_integer()) or isinstance(data__aggregationcardinalitylimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".aggregation_cardinality_limit must be integer or null") + if isinstance(data__aggregationcardinalitylimit, (int, float, Decimal)): + if data__aggregationcardinalitylimit <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".aggregation_cardinality_limit must be bigger than 0") + if "attribute_keys" in data_keys: + data_keys.remove("attribute_keys") + data__attributekeys = data["attribute_keys"] + validate____defs_includeexclude(data__attributekeys, custom_formats, (name_prefix or "data") + ".attribute_keys") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_aggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "default" in data_keys: + data_keys.remove("default") + data__default = data["default"] + validate____defs_defaultaggregation(data__default, custom_formats, (name_prefix or "data") + ".default") + if "drop" in data_keys: + data_keys.remove("drop") + data__drop = data["drop"] + validate____defs_dropaggregation(data__drop, custom_formats, (name_prefix or "data") + ".drop") + if "explicit_bucket_histogram" in data_keys: + data_keys.remove("explicit_bucket_histogram") + data__explicitbuckethistogram = data["explicit_bucket_histogram"] + validate____defs_explicitbuckethistogramaggregation(data__explicitbuckethistogram, custom_formats, (name_prefix or "data") + ".explicit_bucket_histogram") + if "base2_exponential_bucket_histogram" in data_keys: + data_keys.remove("base2_exponential_bucket_histogram") + data__base2exponentialbuckethistogram = data["base2_exponential_bucket_histogram"] + validate____defs_base2exponentialbuckethistogramaggregation(data__base2exponentialbuckethistogram, custom_formats, (name_prefix or "data") + ".base2_exponential_bucket_histogram") + if "last_value" in data_keys: + data_keys.remove("last_value") + data__lastvalue = data["last_value"] + validate____defs_lastvalueaggregation(data__lastvalue, custom_formats, (name_prefix or "data") + ".last_value") + if "sum" in data_keys: + data_keys.remove("sum") + data__sum = data["sum"] + validate____defs_sumaggregation(data__sum, custom_formats, (name_prefix or "data") + ".sum") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_sumaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_lastvalueaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_base2exponentialbuckethistogramaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "max_scale" in data_keys: + data_keys.remove("max_scale") + data__maxscale = data["max_scale"] + if not isinstance(data__maxscale, (int, NoneType)) and not (isinstance(data__maxscale, float) and data__maxscale.is_integer()) or isinstance(data__maxscale, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_scale must be integer or null") + if isinstance(data__maxscale, (int, float, Decimal)): + if data__maxscale < -10: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_scale must be bigger than or equal to -10") + if data__maxscale > 20: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_scale must be smaller than or equal to 20") + if "max_size" in data_keys: + data_keys.remove("max_size") + data__maxsize = data["max_size"] + if not isinstance(data__maxsize, (int, NoneType)) and not (isinstance(data__maxsize, float) and data__maxsize.is_integer()) or isinstance(data__maxsize, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_size must be integer or null") + if isinstance(data__maxsize, (int, float, Decimal)): + if data__maxsize < 2: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_size must be bigger than or equal to 2") + if "record_min_max" in data_keys: + data_keys.remove("record_min_max") + data__recordminmax = data["record_min_max"] + if not isinstance(data__recordminmax, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".record_min_max must be boolean or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_explicitbuckethistogramaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "boundaries" in data_keys: + data_keys.remove("boundaries") + data__boundaries = data["boundaries"] + if not isinstance(data__boundaries, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".boundaries must be array") + data__boundaries_is_list = isinstance(data__boundaries, (list, tuple)) + if data__boundaries_is_list: + data__boundaries_len = len(data__boundaries) + if data__boundaries_len < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".boundaries must contain at least 0 items") + for data__boundaries_x, data__boundaries_item in enumerate(data__boundaries): + if not isinstance(data__boundaries_item, (int, float, Decimal)) or isinstance(data__boundaries_item, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".boundaries[{data__boundaries_x}]".format(**locals()) + " must be number") + if "record_min_max" in data_keys: + data_keys.remove("record_min_max") + data__recordminmax = data["record_min_max"] + if not isinstance(data__recordminmax, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".record_min_max must be boolean or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_dropaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_defaultaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_viewselector(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "instrument_name" in data_keys: + data_keys.remove("instrument_name") + data__instrumentname = data["instrument_name"] + if not isinstance(data__instrumentname, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".instrument_name must be string or null") + if "instrument_type" in data_keys: + data_keys.remove("instrument_type") + data__instrumenttype = data["instrument_type"] + validate____defs_instrumenttype(data__instrumenttype, custom_formats, (name_prefix or "data") + ".instrument_type") + if "unit" in data_keys: + data_keys.remove("unit") + data__unit = data["unit"] + if not isinstance(data__unit, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".unit must be string or null") + if "meter_name" in data_keys: + data_keys.remove("meter_name") + data__metername = data["meter_name"] + if not isinstance(data__metername, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".meter_name must be string or null") + if "meter_version" in data_keys: + data_keys.remove("meter_version") + data__meterversion = data["meter_version"] + if not isinstance(data__meterversion, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".meter_version must be string or null") + if "meter_schema_url" in data_keys: + data_keys.remove("meter_schema_url") + data__meterschemaurl = data["meter_schema_url"] + if not isinstance(data__meterschemaurl, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".meter_schema_url must be string or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_instrumenttype(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'counter' or isinstance(data, str) and data == 'gauge' or isinstance(data, str) and data == 'histogram' or isinstance(data, str) and data == 'observable_counter' or isinstance(data, str) and data == 'observable_gauge' or isinstance(data, str) and data == 'observable_up_down_counter' or isinstance(data, str) and data == 'up_down_counter'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['counter', 'gauge', 'histogram', 'observable_counter', 'observable_gauge', 'observable_up_down_counter', 'up_down_counter']") + return data + +def validate____defs_metricreader(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "periodic" in data_keys: + data_keys.remove("periodic") + data__periodic = data["periodic"] + validate____defs_periodicmetricreader(data__periodic, custom_formats, (name_prefix or "data") + ".periodic") + if "pull" in data_keys: + data_keys.remove("pull") + data__pull = data["pull"] + validate____defs_pullmetricreader(data__pull, custom_formats, (name_prefix or "data") + ".pull") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_pullmetricreader(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['exporter']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "exporter" in data_keys: + data_keys.remove("exporter") + data__exporter = data["exporter"] + validate____defs_pullmetricexporter(data__exporter, custom_formats, (name_prefix or "data") + ".exporter") + if "producers" in data_keys: + data_keys.remove("producers") + data__producers = data["producers"] + if not isinstance(data__producers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".producers must be array") + data__producers_is_list = isinstance(data__producers, (list, tuple)) + if data__producers_is_list: + data__producers_len = len(data__producers) + if data__producers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".producers must contain at least 1 items") + for data__producers_x, data__producers_item in enumerate(data__producers): + validate____defs_metricproducer(data__producers_item, custom_formats, (name_prefix or "data") + ".producers[{data__producers_x}]".format(**locals())) + if "cardinality_limits" in data_keys: + data_keys.remove("cardinality_limits") + data__cardinalitylimits = data["cardinality_limits"] + validate____defs_cardinalitylimits(data__cardinalitylimits, custom_formats, (name_prefix or "data") + ".cardinality_limits") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_cardinalitylimits(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "default" in data_keys: + data_keys.remove("default") + data__default = data["default"] + if not isinstance(data__default, (int, NoneType)) and not (isinstance(data__default, float) and data__default.is_integer()) or isinstance(data__default, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".default must be integer or null") + if isinstance(data__default, (int, float, Decimal)): + if data__default <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".default must be bigger than 0") + if "counter" in data_keys: + data_keys.remove("counter") + data__counter = data["counter"] + if not isinstance(data__counter, (int, NoneType)) and not (isinstance(data__counter, float) and data__counter.is_integer()) or isinstance(data__counter, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".counter must be integer or null") + if isinstance(data__counter, (int, float, Decimal)): + if data__counter <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".counter must be bigger than 0") + if "gauge" in data_keys: + data_keys.remove("gauge") + data__gauge = data["gauge"] + if not isinstance(data__gauge, (int, NoneType)) and not (isinstance(data__gauge, float) and data__gauge.is_integer()) or isinstance(data__gauge, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".gauge must be integer or null") + if isinstance(data__gauge, (int, float, Decimal)): + if data__gauge <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".gauge must be bigger than 0") + if "histogram" in data_keys: + data_keys.remove("histogram") + data__histogram = data["histogram"] + if not isinstance(data__histogram, (int, NoneType)) and not (isinstance(data__histogram, float) and data__histogram.is_integer()) or isinstance(data__histogram, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".histogram must be integer or null") + if isinstance(data__histogram, (int, float, Decimal)): + if data__histogram <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".histogram must be bigger than 0") + if "observable_counter" in data_keys: + data_keys.remove("observable_counter") + data__observablecounter = data["observable_counter"] + if not isinstance(data__observablecounter, (int, NoneType)) and not (isinstance(data__observablecounter, float) and data__observablecounter.is_integer()) or isinstance(data__observablecounter, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".observable_counter must be integer or null") + if isinstance(data__observablecounter, (int, float, Decimal)): + if data__observablecounter <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".observable_counter must be bigger than 0") + if "observable_gauge" in data_keys: + data_keys.remove("observable_gauge") + data__observablegauge = data["observable_gauge"] + if not isinstance(data__observablegauge, (int, NoneType)) and not (isinstance(data__observablegauge, float) and data__observablegauge.is_integer()) or isinstance(data__observablegauge, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".observable_gauge must be integer or null") + if isinstance(data__observablegauge, (int, float, Decimal)): + if data__observablegauge <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".observable_gauge must be bigger than 0") + if "observable_up_down_counter" in data_keys: + data_keys.remove("observable_up_down_counter") + data__observableupdowncounter = data["observable_up_down_counter"] + if not isinstance(data__observableupdowncounter, (int, NoneType)) and not (isinstance(data__observableupdowncounter, float) and data__observableupdowncounter.is_integer()) or isinstance(data__observableupdowncounter, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".observable_up_down_counter must be integer or null") + if isinstance(data__observableupdowncounter, (int, float, Decimal)): + if data__observableupdowncounter <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".observable_up_down_counter must be bigger than 0") + if "up_down_counter" in data_keys: + data_keys.remove("up_down_counter") + data__updowncounter = data["up_down_counter"] + if not isinstance(data__updowncounter, (int, NoneType)) and not (isinstance(data__updowncounter, float) and data__updowncounter.is_integer()) or isinstance(data__updowncounter, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".up_down_counter must be integer or null") + if isinstance(data__updowncounter, (int, float, Decimal)): + if data__updowncounter <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".up_down_counter must be bigger than 0") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_metricproducer(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "opencensus" in data_keys: + data_keys.remove("opencensus") + data__opencensus = data["opencensus"] + validate____defs_opencensusmetricproducer(data__opencensus, custom_formats, (name_prefix or "data") + ".opencensus") + for data_key in data_keys: + if data_key not in ['opencensus']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_opencensusmetricproducer(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_pullmetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "prometheus/development" in data_keys: + data_keys.remove("prometheus/development") + data__prometheusdevelopment = data["prometheus/development"] + validate____defs_experimentalprometheusmetricexporter(data__prometheusdevelopment, custom_formats, (name_prefix or "data") + ".prometheus/development") + for data_key in data_keys: + if data_key not in ['prometheus/development']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_experimentalprometheusmetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "host" in data_keys: + data_keys.remove("host") + data__host = data["host"] + if not isinstance(data__host, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".host must be string or null") + if "port" in data_keys: + data_keys.remove("port") + data__port = data["port"] + if not isinstance(data__port, (int, NoneType)) and not (isinstance(data__port, float) and data__port.is_integer()) or isinstance(data__port, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".port must be integer or null") + if "scope_info_enabled" in data_keys: + data_keys.remove("scope_info_enabled") + data__scopeinfoenabled = data["scope_info_enabled"] + if not isinstance(data__scopeinfoenabled, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".scope_info_enabled must be boolean or null") + if "target_info_enabled/development" in data_keys: + data_keys.remove("target_info_enabled/development") + data__targetinfoenableddevelopment = data["target_info_enabled/development"] + if not isinstance(data__targetinfoenableddevelopment, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".target_info_enabled/development must be boolean or null") + if "resource_constant_labels" in data_keys: + data_keys.remove("resource_constant_labels") + data__resourceconstantlabels = data["resource_constant_labels"] + validate____defs_includeexclude(data__resourceconstantlabels, custom_formats, (name_prefix or "data") + ".resource_constant_labels") + if "translation_strategy" in data_keys: + data_keys.remove("translation_strategy") + data__translationstrategy = data["translation_strategy"] + validate____defs_experimentalprometheustranslationstrategy(data__translationstrategy, custom_formats, (name_prefix or "data") + ".translation_strategy") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalprometheustranslationstrategy(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'underscore_escaping_with_suffixes' or isinstance(data, str) and data == 'underscore_escaping_without_suffixes/development' or isinstance(data, str) and data == 'no_utf8_escaping_with_suffixes/development' or isinstance(data, str) and data == 'no_translation/development'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['underscore_escaping_with_suffixes', 'underscore_escaping_without_suffixes/development', 'no_utf8_escaping_with_suffixes/development', 'no_translation/development']") + return data + +def validate____defs_periodicmetricreader(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['exporter']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "interval" in data_keys: + data_keys.remove("interval") + data__interval = data["interval"] + if not isinstance(data__interval, (int, NoneType)) and not (isinstance(data__interval, float) and data__interval.is_integer()) or isinstance(data__interval, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".interval must be integer or null") + if isinstance(data__interval, (int, float, Decimal)): + if data__interval < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".interval must be bigger than or equal to 0") + if "timeout" in data_keys: + data_keys.remove("timeout") + data__timeout = data["timeout"] + if not isinstance(data__timeout, (int, NoneType)) and not (isinstance(data__timeout, float) and data__timeout.is_integer()) or isinstance(data__timeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be integer or null") + if isinstance(data__timeout, (int, float, Decimal)): + if data__timeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be bigger than or equal to 0") + if "max_export_batch_size/development" in data_keys: + data_keys.remove("max_export_batch_size/development") + data__maxexportbatchsizedevelopment = data["max_export_batch_size/development"] + if not isinstance(data__maxexportbatchsizedevelopment, (int, NoneType)) and not (isinstance(data__maxexportbatchsizedevelopment, float) and data__maxexportbatchsizedevelopment.is_integer()) or isinstance(data__maxexportbatchsizedevelopment, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_export_batch_size/development must be integer or null") + if isinstance(data__maxexportbatchsizedevelopment, (int, float, Decimal)): + if data__maxexportbatchsizedevelopment < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_export_batch_size/development must be bigger than or equal to 1") + if "exporter" in data_keys: + data_keys.remove("exporter") + data__exporter = data["exporter"] + validate____defs_pushmetricexporter(data__exporter, custom_formats, (name_prefix or "data") + ".exporter") + if "producers" in data_keys: + data_keys.remove("producers") + data__producers = data["producers"] + if not isinstance(data__producers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".producers must be array") + data__producers_is_list = isinstance(data__producers, (list, tuple)) + if data__producers_is_list: + data__producers_len = len(data__producers) + if data__producers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".producers must contain at least 1 items") + for data__producers_x, data__producers_item in enumerate(data__producers): + validate____defs_metricproducer(data__producers_item, custom_formats, (name_prefix or "data") + ".producers[{data__producers_x}]".format(**locals())) + if "cardinality_limits" in data_keys: + data_keys.remove("cardinality_limits") + data__cardinalitylimits = data["cardinality_limits"] + validate____defs_cardinalitylimits(data__cardinalitylimits, custom_formats, (name_prefix or "data") + ".cardinality_limits") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_pushmetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "otlp_http" in data_keys: + data_keys.remove("otlp_http") + data__otlphttp = data["otlp_http"] + validate____defs_otlphttpmetricexporter(data__otlphttp, custom_formats, (name_prefix or "data") + ".otlp_http") + if "otlp_grpc" in data_keys: + data_keys.remove("otlp_grpc") + data__otlpgrpc = data["otlp_grpc"] + validate____defs_otlpgrpcmetricexporter(data__otlpgrpc, custom_formats, (name_prefix or "data") + ".otlp_grpc") + if "otlp_file/development" in data_keys: + data_keys.remove("otlp_file/development") + data__otlpfiledevelopment = data["otlp_file/development"] + validate____defs_experimentalotlpfilemetricexporter(data__otlpfiledevelopment, custom_formats, (name_prefix or "data") + ".otlp_file/development") + if "console" in data_keys: + data_keys.remove("console") + data__console = data["console"] + validate____defs_consolemetricexporter(data__console, custom_formats, (name_prefix or "data") + ".console") + for data_key in data_keys: + if data_key not in ['otlp_http', 'otlp_grpc', 'otlp_file/development', 'console']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_consolemetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "temporality_preference" in data_keys: + data_keys.remove("temporality_preference") + data__temporalitypreference = data["temporality_preference"] + validate____defs_exportertemporalitypreference(data__temporalitypreference, custom_formats, (name_prefix or "data") + ".temporality_preference") + if "default_histogram_aggregation" in data_keys: + data_keys.remove("default_histogram_aggregation") + data__defaulthistogramaggregation = data["default_histogram_aggregation"] + validate____defs_exporterdefaulthistogramaggregation(data__defaulthistogramaggregation, custom_formats, (name_prefix or "data") + ".default_histogram_aggregation") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_exporterdefaulthistogramaggregation(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'explicit_bucket_histogram' or isinstance(data, str) and data == 'base2_exponential_bucket_histogram'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['explicit_bucket_histogram', 'base2_exponential_bucket_histogram']") + return data + +def validate____defs_exportertemporalitypreference(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'cumulative' or isinstance(data, str) and data == 'delta' or isinstance(data, str) and data == 'low_memory'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['cumulative', 'delta', 'low_memory']") + return data + +def validate____defs_experimentalotlpfilemetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "output_stream" in data_keys: + data_keys.remove("output_stream") + data__outputstream = data["output_stream"] + if not isinstance(data__outputstream, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".output_stream must be string or null") + if "temporality_preference" in data_keys: + data_keys.remove("temporality_preference") + data__temporalitypreference = data["temporality_preference"] + validate____defs_exportertemporalitypreference(data__temporalitypreference, custom_formats, (name_prefix or "data") + ".temporality_preference") + if "default_histogram_aggregation" in data_keys: + data_keys.remove("default_histogram_aggregation") + data__defaulthistogramaggregation = data["default_histogram_aggregation"] + validate____defs_exporterdefaulthistogramaggregation(data__defaulthistogramaggregation, custom_formats, (name_prefix or "data") + ".default_histogram_aggregation") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_otlpgrpcmetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "endpoint" in data_keys: + data_keys.remove("endpoint") + data__endpoint = data["endpoint"] + if not isinstance(data__endpoint, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".endpoint must be string or null") + if "tls" in data_keys: + data_keys.remove("tls") + data__tls = data["tls"] + validate____defs_grpctls(data__tls, custom_formats, (name_prefix or "data") + ".tls") + if "headers" in data_keys: + data_keys.remove("headers") + data__headers = data["headers"] + if not isinstance(data__headers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must be array") + data__headers_is_list = isinstance(data__headers, (list, tuple)) + if data__headers_is_list: + data__headers_len = len(data__headers) + if data__headers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must contain at least 1 items") + for data__headers_x, data__headers_item in enumerate(data__headers): + validate____defs_namestringvaluepair(data__headers_item, custom_formats, (name_prefix or "data") + ".headers[{data__headers_x}]".format(**locals())) + if "headers_list" in data_keys: + data_keys.remove("headers_list") + data__headerslist = data["headers_list"] + if not isinstance(data__headerslist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers_list must be string or null") + if "compression" in data_keys: + data_keys.remove("compression") + data__compression = data["compression"] + if not isinstance(data__compression, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".compression must be string or null") + if "timeout" in data_keys: + data_keys.remove("timeout") + data__timeout = data["timeout"] + if not isinstance(data__timeout, (int, NoneType)) and not (isinstance(data__timeout, float) and data__timeout.is_integer()) or isinstance(data__timeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be integer or null") + if isinstance(data__timeout, (int, float, Decimal)): + if data__timeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be bigger than or equal to 0") + if "temporality_preference" in data_keys: + data_keys.remove("temporality_preference") + data__temporalitypreference = data["temporality_preference"] + validate____defs_exportertemporalitypreference(data__temporalitypreference, custom_formats, (name_prefix or "data") + ".temporality_preference") + if "default_histogram_aggregation" in data_keys: + data_keys.remove("default_histogram_aggregation") + data__defaulthistogramaggregation = data["default_histogram_aggregation"] + validate____defs_exporterdefaulthistogramaggregation(data__defaulthistogramaggregation, custom_formats, (name_prefix or "data") + ".default_histogram_aggregation") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_otlphttpmetricexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "endpoint" in data_keys: + data_keys.remove("endpoint") + data__endpoint = data["endpoint"] + if not isinstance(data__endpoint, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".endpoint must be string or null") + if "tls" in data_keys: + data_keys.remove("tls") + data__tls = data["tls"] + validate____defs_httptls(data__tls, custom_formats, (name_prefix or "data") + ".tls") + if "headers" in data_keys: + data_keys.remove("headers") + data__headers = data["headers"] + if not isinstance(data__headers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must be array") + data__headers_is_list = isinstance(data__headers, (list, tuple)) + if data__headers_is_list: + data__headers_len = len(data__headers) + if data__headers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers must contain at least 1 items") + for data__headers_x, data__headers_item in enumerate(data__headers): + validate____defs_namestringvaluepair(data__headers_item, custom_formats, (name_prefix or "data") + ".headers[{data__headers_x}]".format(**locals())) + if "headers_list" in data_keys: + data_keys.remove("headers_list") + data__headerslist = data["headers_list"] + if not isinstance(data__headerslist, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".headers_list must be string or null") + if "compression" in data_keys: + data_keys.remove("compression") + data__compression = data["compression"] + if not isinstance(data__compression, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".compression must be string or null") + if "timeout" in data_keys: + data_keys.remove("timeout") + data__timeout = data["timeout"] + if not isinstance(data__timeout, (int, NoneType)) and not (isinstance(data__timeout, float) and data__timeout.is_integer()) or isinstance(data__timeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be integer or null") + if isinstance(data__timeout, (int, float, Decimal)): + if data__timeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".timeout must be bigger than or equal to 0") + if "encoding" in data_keys: + data_keys.remove("encoding") + data__encoding = data["encoding"] + validate____defs_otlphttpencoding(data__encoding, custom_formats, (name_prefix or "data") + ".encoding") + if "temporality_preference" in data_keys: + data_keys.remove("temporality_preference") + data__temporalitypreference = data["temporality_preference"] + validate____defs_exportertemporalitypreference(data__temporalitypreference, custom_formats, (name_prefix or "data") + ".temporality_preference") + if "default_histogram_aggregation" in data_keys: + data_keys.remove("default_histogram_aggregation") + data__defaulthistogramaggregation = data["default_histogram_aggregation"] + validate____defs_exporterdefaulthistogramaggregation(data__defaulthistogramaggregation, custom_formats, (name_prefix or "data") + ".default_histogram_aggregation") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_loggerprovider(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['processors']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "processors" in data_keys: + data_keys.remove("processors") + data__processors = data["processors"] + if not isinstance(data__processors, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".processors must be array") + data__processors_is_list = isinstance(data__processors, (list, tuple)) + if data__processors_is_list: + data__processors_len = len(data__processors) + if data__processors_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".processors must contain at least 1 items") + for data__processors_x, data__processors_item in enumerate(data__processors): + validate____defs_logrecordprocessor(data__processors_item, custom_formats, (name_prefix or "data") + ".processors[{data__processors_x}]".format(**locals())) + if "limits" in data_keys: + data_keys.remove("limits") + data__limits = data["limits"] + validate____defs_logrecordlimits(data__limits, custom_formats, (name_prefix or "data") + ".limits") + if "logger_configurator/development" in data_keys: + data_keys.remove("logger_configurator/development") + data__loggerconfiguratordevelopment = data["logger_configurator/development"] + validate____defs_experimentalloggerconfigurator(data__loggerconfiguratordevelopment, custom_formats, (name_prefix or "data") + ".logger_configurator/development") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalloggerconfigurator(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "default_config" in data_keys: + data_keys.remove("default_config") + data__defaultconfig = data["default_config"] + validate____defs_experimentalloggerconfig(data__defaultconfig, custom_formats, (name_prefix or "data") + ".default_config") + if "loggers" in data_keys: + data_keys.remove("loggers") + data__loggers = data["loggers"] + if not isinstance(data__loggers, (list, tuple)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".loggers must be array") + data__loggers_is_list = isinstance(data__loggers, (list, tuple)) + if data__loggers_is_list: + data__loggers_len = len(data__loggers) + if data__loggers_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".loggers must contain at least 1 items") + for data__loggers_x, data__loggers_item in enumerate(data__loggers): + validate____defs_experimentalloggermatcherandconfig(data__loggers_item, custom_formats, (name_prefix or "data") + ".loggers[{data__loggers_x}]".format(**locals())) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalloggermatcherandconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['name', 'config']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "name" in data_keys: + data_keys.remove("name") + data__name = data["name"] + if not isinstance(data__name, (str)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string") + if "config" in data_keys: + data_keys.remove("config") + data__config = data["config"] + validate____defs_experimentalloggerconfig(data__config, custom_formats, (name_prefix or "data") + ".config") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_experimentalloggerconfig(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "enabled" in data_keys: + data_keys.remove("enabled") + data__enabled = data["enabled"] + if not isinstance(data__enabled, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".enabled must be boolean or null") + if "minimum_severity" in data_keys: + data_keys.remove("minimum_severity") + data__minimumseverity = data["minimum_severity"] + validate____defs_severitynumber(data__minimumseverity, custom_formats, (name_prefix or "data") + ".minimum_severity") + if "trace_based" in data_keys: + data_keys.remove("trace_based") + data__tracebased = data["trace_based"] + if not isinstance(data__tracebased, (bool, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".trace_based must be boolean or null") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_logrecordlimits(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "attribute_value_length_limit" in data_keys: + data_keys.remove("attribute_value_length_limit") + data__attributevaluelengthlimit = data["attribute_value_length_limit"] + if not isinstance(data__attributevaluelengthlimit, (int, NoneType)) and not (isinstance(data__attributevaluelengthlimit, float) and data__attributevaluelengthlimit.is_integer()) or isinstance(data__attributevaluelengthlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_value_length_limit must be integer or null") + if isinstance(data__attributevaluelengthlimit, (int, float, Decimal)): + if data__attributevaluelengthlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_value_length_limit must be bigger than or equal to 0") + if "attribute_count_limit" in data_keys: + data_keys.remove("attribute_count_limit") + data__attributecountlimit = data["attribute_count_limit"] + if not isinstance(data__attributecountlimit, (int, NoneType)) and not (isinstance(data__attributecountlimit, float) and data__attributecountlimit.is_integer()) or isinstance(data__attributecountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_count_limit must be integer or null") + if isinstance(data__attributecountlimit, (int, float, Decimal)): + if data__attributecountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_count_limit must be bigger than or equal to 0") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_logrecordprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "batch" in data_keys: + data_keys.remove("batch") + data__batch = data["batch"] + validate____defs_batchlogrecordprocessor(data__batch, custom_formats, (name_prefix or "data") + ".batch") + if "simple" in data_keys: + data_keys.remove("simple") + data__simple = data["simple"] + validate____defs_simplelogrecordprocessor(data__simple, custom_formats, (name_prefix or "data") + ".simple") + if "event_to_span_event_bridge/development" in data_keys: + data_keys.remove("event_to_span_event_bridge/development") + data__eventtospaneventbridgedevelopment = data["event_to_span_event_bridge/development"] + validate____defs_experimentaleventtospaneventbridgelogrecordprocessor(data__eventtospaneventbridgedevelopment, custom_formats, (name_prefix or "data") + ".event_to_span_event_bridge/development") + for data_key in data_keys: + if data_key not in ['batch', 'simple', 'event_to_span_event_bridge/development']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_experimentaleventtospaneventbridgelogrecordprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object or null") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_simplelogrecordprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['exporter']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "exporter" in data_keys: + data_keys.remove("exporter") + data__exporter = data["exporter"] + validate____defs_logrecordexporter(data__exporter, custom_formats, (name_prefix or "data") + ".exporter") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_logrecordexporter(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_len = len(data) + if data_len < 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain at least 1 properties") + if data_len > 1: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain less than or equal to 1 properties") + data_keys = set(data.keys()) + if "otlp_http" in data_keys: + data_keys.remove("otlp_http") + data__otlphttp = data["otlp_http"] + validate____defs_otlphttpexporter(data__otlphttp, custom_formats, (name_prefix or "data") + ".otlp_http") + if "otlp_grpc" in data_keys: + data_keys.remove("otlp_grpc") + data__otlpgrpc = data["otlp_grpc"] + validate____defs_otlpgrpcexporter(data__otlpgrpc, custom_formats, (name_prefix or "data") + ".otlp_grpc") + if "otlp_file/development" in data_keys: + data_keys.remove("otlp_file/development") + data__otlpfiledevelopment = data["otlp_file/development"] + validate____defs_experimentalotlpfileexporter(data__otlpfiledevelopment, custom_formats, (name_prefix or "data") + ".otlp_file/development") + if "console" in data_keys: + data_keys.remove("console") + data__console = data["console"] + validate____defs_consoleexporter(data__console, custom_formats, (name_prefix or "data") + ".console") + for data_key in data_keys: + if data_key not in ['otlp_http', 'otlp_grpc', 'otlp_file/development', 'console']: + data_value = data.get(data_key) + if not isinstance(data_value, (dict, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object or null") + return data + +def validate____defs_batchlogrecordprocessor(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data__missing_keys = set(['exporter']) - data.keys() + if data__missing_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + str(sorted(data__missing_keys)) + " properties") + data_keys = set(data.keys()) + if "schedule_delay" in data_keys: + data_keys.remove("schedule_delay") + data__scheduledelay = data["schedule_delay"] + if not isinstance(data__scheduledelay, (int, NoneType)) and not (isinstance(data__scheduledelay, float) and data__scheduledelay.is_integer()) or isinstance(data__scheduledelay, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".schedule_delay must be integer or null") + if isinstance(data__scheduledelay, (int, float, Decimal)): + if data__scheduledelay < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".schedule_delay must be bigger than or equal to 0") + if "export_timeout" in data_keys: + data_keys.remove("export_timeout") + data__exporttimeout = data["export_timeout"] + if not isinstance(data__exporttimeout, (int, NoneType)) and not (isinstance(data__exporttimeout, float) and data__exporttimeout.is_integer()) or isinstance(data__exporttimeout, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".export_timeout must be integer or null") + if isinstance(data__exporttimeout, (int, float, Decimal)): + if data__exporttimeout < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".export_timeout must be bigger than or equal to 0") + if "max_queue_size" in data_keys: + data_keys.remove("max_queue_size") + data__maxqueuesize = data["max_queue_size"] + if not isinstance(data__maxqueuesize, (int, NoneType)) and not (isinstance(data__maxqueuesize, float) and data__maxqueuesize.is_integer()) or isinstance(data__maxqueuesize, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_queue_size must be integer or null") + if isinstance(data__maxqueuesize, (int, float, Decimal)): + if data__maxqueuesize <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_queue_size must be bigger than 0") + if "max_export_batch_size" in data_keys: + data_keys.remove("max_export_batch_size") + data__maxexportbatchsize = data["max_export_batch_size"] + if not isinstance(data__maxexportbatchsize, (int, NoneType)) and not (isinstance(data__maxexportbatchsize, float) and data__maxexportbatchsize.is_integer()) or isinstance(data__maxexportbatchsize, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_export_batch_size must be integer or null") + if isinstance(data__maxexportbatchsize, (int, float, Decimal)): + if data__maxexportbatchsize <= 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".max_export_batch_size must be bigger than 0") + if "exporter" in data_keys: + data_keys.remove("exporter") + data__exporter = data["exporter"] + validate____defs_logrecordexporter(data__exporter, custom_formats, (name_prefix or "data") + ".exporter") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_attributelimits(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (dict)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object") + data_is_dict = isinstance(data, dict) + if data_is_dict: + data_keys = set(data.keys()) + if "attribute_value_length_limit" in data_keys: + data_keys.remove("attribute_value_length_limit") + data__attributevaluelengthlimit = data["attribute_value_length_limit"] + if not isinstance(data__attributevaluelengthlimit, (int, NoneType)) and not (isinstance(data__attributevaluelengthlimit, float) and data__attributevaluelengthlimit.is_integer()) or isinstance(data__attributevaluelengthlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_value_length_limit must be integer or null") + if isinstance(data__attributevaluelengthlimit, (int, float, Decimal)): + if data__attributevaluelengthlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_value_length_limit must be bigger than or equal to 0") + if "attribute_count_limit" in data_keys: + data_keys.remove("attribute_count_limit") + data__attributecountlimit = data["attribute_count_limit"] + if not isinstance(data__attributecountlimit, (int, NoneType)) and not (isinstance(data__attributecountlimit, float) and data__attributecountlimit.is_integer()) or isinstance(data__attributecountlimit, bool): + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_count_limit must be integer or null") + if isinstance(data__attributecountlimit, (int, float, Decimal)): + if data__attributecountlimit < 0: + raise JsonSchemaValueException("" + (name_prefix or "data") + ".attribute_count_limit must be bigger than or equal to 0") + if data_keys: + raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties") + return data + +def validate____defs_severitynumber(data, custom_formats={}, name_prefix=None): + if not isinstance(data, (str, NoneType)): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string or null") + if not (isinstance(data, str) and data == 'trace' or isinstance(data, str) and data == 'trace2' or isinstance(data, str) and data == 'trace3' or isinstance(data, str) and data == 'trace4' or isinstance(data, str) and data == 'debug' or isinstance(data, str) and data == 'debug2' or isinstance(data, str) and data == 'debug3' or isinstance(data, str) and data == 'debug4' or isinstance(data, str) and data == 'info' or isinstance(data, str) and data == 'info2' or isinstance(data, str) and data == 'info3' or isinstance(data, str) and data == 'info4' or isinstance(data, str) and data == 'warn' or isinstance(data, str) and data == 'warn2' or isinstance(data, str) and data == 'warn3' or isinstance(data, str) and data == 'warn4' or isinstance(data, str) and data == 'error' or isinstance(data, str) and data == 'error2' or isinstance(data, str) and data == 'error3' or isinstance(data, str) and data == 'error4' or isinstance(data, str) and data == 'fatal' or isinstance(data, str) and data == 'fatal2' or isinstance(data, str) and data == 'fatal3' or isinstance(data, str) and data == 'fatal4'): + raise JsonSchemaValueException("" + (name_prefix or "data") + " must be one of ['trace', 'trace2', 'trace3', 'trace4', 'debug', 'debug2', 'debug3', 'debug4', 'info', 'info2', 'info3', 'info4', 'warn', 'warn2', 'warn3', 'warn4', 'error', 'error2', 'error3', 'error4', 'fatal', 'fatal2', 'fatal3', 'fatal4']") + return data diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py new file mode 100644 index 00000000000..2ffac8ea14d --- /dev/null +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py @@ -0,0 +1,94 @@ +# Generated by opentelemetry-configuration/codegen/_generate_validator.py +# +# Vendored verbatim from fastjsonschema 2.22.2. +# +# Copyright (c) 2018, Michal Horejsek +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, this +# list of conditions and the following disclaimer in the documentation and/or +# other materials provided with the distribution. +# +# Neither the name of the {organization} nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import re + + +SPLIT_RE = re.compile(r'[\.\[\]]+') + + +class JsonSchemaException(ValueError): + """ + Base exception of ``fastjsonschema`` library. + """ + + +class JsonSchemaValueException(JsonSchemaException): + """ + Exception raised by validation function. Available properties: + + * ``message`` containing human-readable information what is wrong + (e.g. ``data.property[index] must be smaller than or equal to 42``), + * invalid ``value`` (e.g. ``60``), + * ``name`` of a path in the data structure (e.g. ``data.property[index]``), + * ``path`` as an array in the data structure (e.g. ``['data', 'property', 'index']``), + * the whole ``definition`` which the ``value`` has to fulfil (e.g. ``{'type': 'number', 'maximum': 42}``), + * ``rule`` which the ``value`` is breaking (e.g. ``maximum``) + * and ``rule_definition`` (e.g. ``42``). + + .. versionchanged:: 2.14.0 + Added all extra properties. + """ + + def __init__(self, message, value=None, name=None, definition=None, rule=None): + super().__init__(message) + self.message = message + self.value = value + self.name = name + self.definition = definition + self.rule = rule + + @property + def path(self): + return [item for item in SPLIT_RE.split(self.name) if item != ''] + + @property + def rule_definition(self): + if not self.rule or not self.definition: + return None + return self.definition.get(self.rule) + + +class JsonSchemaValuesException(JsonSchemaException): + """ + Exception raised by validation function. It is a collection of all errors. + """ + + def __init__(self, errors): + super().__init__() + self.errors = errors + + +class JsonSchemaDefinitionException(JsonSchemaException): + """ + Exception raised by generator of validation function. + """ diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py b/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py index f3a29aa7986..bd1c4bb67fa 100644 --- a/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/file/_loader.py @@ -3,7 +3,6 @@ """Configuration file loading and parsing.""" -import importlib.resources import json import logging import os @@ -16,6 +15,12 @@ ConfigurationError, MissingDependencyError, ) +from opentelemetry.configuration._generated_validator import ( + validate as _validate_against_schema, +) +from opentelemetry.configuration._validation_exceptions import ( + JsonSchemaValueException, +) from opentelemetry.configuration.file._env_substitution import ( substitute_env_vars, ) @@ -31,16 +36,6 @@ extras="file-configuration", ) from exc -try: - import jsonschema -except ImportError as exc: - raise MissingDependencyError( - package="jsonschema", - feature="File configuration", - install_name="opentelemetry-sdk", - extras="file-configuration", - ) from exc - # Schema version vendored in schema.json. ``file_format`` values are accepted # per the configuration spec's versioning rules: the major version must match, # and a minor version newer than the one this SDK targets is accepted with a @@ -49,16 +44,6 @@ _SUPPORTED_SCHEMA_MAJOR = 1 _SUPPORTED_SCHEMA_MINOR = 1 -_schema_cache: list[dict] = [] - - -def _get_schema() -> dict: - if not _schema_cache: - schema_path = importlib.resources.files("opentelemetry.configuration") / "schema.json" - _schema_cache.append(json.loads(schema_path.read_text(encoding="utf-8"))) - return _schema_cache[0] - - _logger = logging.getLogger(__name__) _YAML_STR_TAG = "tag:yaml.org,2002:str" @@ -294,19 +279,9 @@ def _validate_schema(data: dict) -> None: ConfigurationError: If the data does not conform to the schema. """ try: - jsonschema.validate( - instance=data, - schema=_get_schema(), - cls=jsonschema.Draft202012Validator, - ) - except jsonschema.ValidationError as exc: - raise ConfigurationError( - f"Configuration does not match schema: {exc.message} (at {' -> '.join(str(p) for p in exc.absolute_path)})" - if exc.absolute_path - else f"Configuration does not match schema: {exc.message}" - ) from exc - except jsonschema.SchemaError as exc: - raise ConfigurationError(f"Invalid configuration schema: {exc.message}") from exc + _validate_against_schema(data) + except JsonSchemaValueException as exc: + raise ConfigurationError(f"Configuration does not match schema: {exc.message}") from exc def _validate_file_format(data: dict) -> None: diff --git a/opentelemetry-configuration/test-requirements.txt b/opentelemetry-configuration/test-requirements.txt index 6d5063f09ce..ff3da9f3cec 100644 --- a/opentelemetry-configuration/test-requirements.txt +++ b/opentelemetry-configuration/test-requirements.txt @@ -7,6 +7,7 @@ psutil==7.2.2 py-cpuinfo==9.0.0 pytest==9.0.3 jsonschema==4.25.1 +fastjsonschema==2.22.2 rpds-py==0.23.1; python_version == "3.10" rpds-py==0.30.0; python_version >= "3.11" pyyaml==6.0.3 diff --git a/opentelemetry-configuration/tests/test_generated_validator.py b/opentelemetry-configuration/tests/test_generated_validator.py new file mode 100644 index 00000000000..68dadd5a14c --- /dev/null +++ b/opentelemetry-configuration/tests/test_generated_validator.py @@ -0,0 +1,203 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +"""Checks on the generated validator that replaces ``jsonschema`` at runtime. + +``jsonschema`` stays a test dependency precisely so these can run: the point of +the generated validator is to reach the same verdicts without being installed +alongside the instrumented application, and the only way to know it does is to +ask both and compare. +""" + +import json +import unittest +from importlib.util import module_from_spec, spec_from_file_location +from pathlib import Path + +import jsonschema + +from opentelemetry.configuration import _generated_validator +from opentelemetry.configuration._validation_exceptions import ( + JsonSchemaValueException, +) + +_PACKAGE_ROOT = Path(_generated_validator.__file__).parent +_SCHEMA = json.loads((_PACKAGE_ROOT / "schema.json").read_text(encoding="utf-8")) + +_CODEGEN_SPEC = spec_from_file_location( + "_generate_validator", + Path(__file__).resolve().parent.parent / "codegen" / "_generate_validator.py", +) +_CODEGEN = module_from_spec(_CODEGEN_SPEC) +_CODEGEN_SPEC.loader.exec_module(_CODEGEN) + +_VALID = { + "file_format": "1.0-rc.1", + "tracer_provider": {"processors": [{"simple": {"exporter": {"console": {}}}}]}, +} + +_DOCUMENTS = [ + ("valid", _VALID), + ("missing file_format", {"tracer_provider": {"processors": []}}), + ( + "missing required property", + {"file_format": "1.0-rc.1", "tracer_provider": {"limits": {}}}, + ), + ( + "unknown property", + {"file_format": "1.0-rc.1", "resource": {"detectors": []}}, + ), + ( + "value below minimum", + { + "file_format": "1.0-rc.1", + "tracer_provider": { + "processors": [{"simple": {"exporter": {"console": {}}}}], + "limits": {"attribute_count_limit": -5}, + }, + }, + ), + ( + "ratio above maximum", + { + "file_format": "1.0-rc.1", + "tracer_provider": { + "processors": [{"simple": {"exporter": {"console": {}}}}], + "sampler": {"trace_id_ratio_based": {"ratio": 50}}, + }, + }, + ), + ( + "empty array where one item is required", + {"file_format": "1.0-rc.1", "tracer_provider": {"processors": []}}, + ), + ( + "two exporters in one block", + { + "file_format": "1.0-rc.1", + "tracer_provider": {"processors": [{"simple": {"exporter": {"console": {}, "otlp_http": {}}}}]}, + }, + ), + ("wrong type for file_format", {"file_format": 1}), + ( + "wrong type for a nested object", + {"file_format": "1.0-rc.1", "tracer_provider": "console"}, + ), +] + +# Keywords fastjsonschema does not implement. It ignores an unimplemented +# keyword instead of refusing the schema, which would silently under-enforce +# it, so the schema is checked for them rather than trusted. +_UNIMPLEMENTED_KEYWORDS = frozenset( + { + "prefixItems", + "unevaluatedProperties", + "unevaluatedItems", + "dependentRequired", + "dependentSchemas", + "maxContains", + "minContains", + } +) + + +def _is_valid_per_jsonschema(document): + try: + jsonschema.validate( + instance=document, + schema=_SCHEMA, + cls=jsonschema.Draft202012Validator, + ) + except jsonschema.ValidationError: + return False + return True + + +def _is_valid_per_generated_validator(document): + try: + _generated_validator.validate(document) + except JsonSchemaValueException: + return False + return True + + +def _keywords_in(node): + if isinstance(node, dict): + for key, value in node.items(): + yield key + yield from _keywords_in(value) + elif isinstance(node, list): + for item in node: + yield from _keywords_in(item) + + +class TestGeneratedValidatorAgreesWithJsonschema(unittest.TestCase): + def test_both_validators_reach_the_same_verdict(self): + for label, document in _DOCUMENTS: + with self.subTest(document=label): + self.assertEqual( + _is_valid_per_generated_validator(document), + _is_valid_per_jsonschema(document), + f"the two validators disagree about {label!r}", + ) + + def test_only_the_valid_document_is_accepted(self): + accepted = [label for label, document in _DOCUMENTS if _is_valid_per_generated_validator(document)] + self.assertEqual(accepted, ["valid"]) + + +class TestGeneratedValidatorCoversTheSchema(unittest.TestCase): + def test_schema_uses_no_keyword_fastjsonschema_ignores(self): + used = set(_keywords_in(_SCHEMA)) & _UNIMPLEMENTED_KEYWORDS + self.assertEqual( + used, + set(), + "the schema now uses keywords fastjsonschema does not implement, " + "so the generated validator would silently accept documents " + "jsonschema rejects", + ) + + +class TestGeneratedValidatorHasNoRuntimeDependency(unittest.TestCase): + def test_it_imports_nothing_beyond_decimal_and_its_own_exceptions(self): + source = Path(_generated_validator.__file__).read_text(encoding="utf-8") + imported = { + line.split()[1].split(".")[0] for line in source.splitlines() if line.startswith(("import ", "from ")) + } + self.assertEqual(imported, {"decimal", "opentelemetry"}) + + def test_a_missing_required_property_is_named_in_the_message(self): + with self.assertRaises(JsonSchemaValueException) as caught: + _generated_validator.validate({"tracer_provider": {}}) + self.assertIn("must contain ['file_format'] properties", str(caught.exception)) + + +class TestGeneratedValidatorIsCurrentWithTheSchema(unittest.TestCase): + """The committed output has to be what regenerating would produce today. + + Everything else in this module exercises the validator's behaviour, which + says nothing about whether it was regenerated after the last change to + ``schema.json``. A stale validator enforces the previous schema and fails + nothing, because the only check that reads ``schema.json`` live compares + verdicts on ten fixed documents. + """ + + def test_recompiling_the_schema_reproduces_the_committed_validator(self): + committed = (_PACKAGE_ROOT / "_generated_validator.py").read_text(encoding="utf-8") + recompiled = _CODEGEN.compile_validator().source + self.assertTrue( + recompiled == committed, + f"schema.json no longer compiles to the committed " + f"_generated_validator.py ({len(committed)} bytes committed, " + f"{len(recompiled)} recompiled); run " + f"'tox -e generate-config-validator' and commit the result", + ) + + def test_the_committed_exception_classes_match_the_pinned_fastjsonschema(self): + committed = (_PACKAGE_ROOT / "_validation_exceptions.py").read_text(encoding="utf-8") + self.assertTrue( + _CODEGEN.vendored_exceptions_source() == committed, + "_validation_exceptions.py no longer matches the exceptions module " + "of the installed fastjsonschema; run " + "'tox -e generate-config-validator' and commit the result", + ) diff --git a/pyproject.toml b/pyproject.toml index 24889e0705b..de9ca84aae1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,6 +84,8 @@ force-exclude = true extend-exclude = [ "*_pb2*.py*", "opentelemetry-proto-json/src/*", + "opentelemetry-configuration/src/opentelemetry/configuration/_generated_validator.py", + "opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py", ] output-format = "concise" extension = { added = "markdown", changed = "markdown", deprecated = "markdown", removed = "markdown", fixed = "markdown" } @@ -161,6 +163,7 @@ include = [ exclude = [ "opentelemetry-sdk/tests", "opentelemetry-configuration/tests", + "opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py", "opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py", "opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py", "opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_reservoir.py", diff --git a/scripts/check_license_header.py b/scripts/check_license_header.py index 2830179a825..b57795d6418 100644 --- a/scripts/check_license_header.py +++ b/scripts/check_license_header.py @@ -27,6 +27,7 @@ "# generated by datamodel-codegen", "# Generated by the protocol buffer compiler", "# Generated by the gRPC Python protocol compiler", + "# Generated by opentelemetry-configuration/codegen/_generate_validator.py", ) diff --git a/tox.ini b/tox.ini index 9b0a2e6743e..1b145cbf56d 100644 --- a/tox.ini +++ b/tox.ini @@ -497,6 +497,12 @@ allowlist_externals = commands = datamodel-codegen +[testenv:generate-config-validator] +deps = + fastjsonschema==2.22.2 +commands = + python opentelemetry-configuration/codegen/_generate_validator.py + [testenv:shellcheck] commands_pre = sh -c "sudo apt update -y && sudo apt install --assume-yes shellcheck" @@ -509,6 +515,7 @@ deps = pyright psutil types-PyYAML + fastjsonschema==2.22.2 -e {toxinidir}/opentelemetry-api -e {toxinidir}/opentelemetry-semantic-conventions -e {toxinidir}/opentelemetry-sdk diff --git a/uv.lock b/uv.lock index bd9f1482d86..818f59a4615 100644 --- a/uv.lock +++ b/uv.lock @@ -78,15 +78,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, ] -[[package]] -name = "attrs" -version = "26.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, -] - [[package]] name = "black" version = "26.5.1" @@ -675,34 +666,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, -] - [[package]] name = "markupsafe" version = "3.0.3" @@ -844,7 +807,6 @@ requires-dist = [ name = "opentelemetry-configuration" source = { editable = "opentelemetry-configuration" } dependencies = [ - { name = "jsonschema" }, { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, { name = "pyyaml" }, @@ -852,7 +814,6 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "jsonschema", specifier = ">=4.0" }, { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, { name = "pyyaml", specifier = ">=5.4" }, @@ -1624,21 +1585,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, -] - [[package]] name = "requests" version = "2.34.2" @@ -1654,259 +1600,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, - { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, - { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, - { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, - { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, - { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, - { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, - { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, - { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, - { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, - { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, - { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, - { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, - { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, - { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, - { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, - { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, - { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, - { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, - { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, - { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, - { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, - { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, -] - -[[package]] -name = "rpds-py" -version = "2026.6.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version == '3.13.*'", - "python_full_version >= '3.11' and python_full_version < '3.13'", -] -sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, - { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, - { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, - { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, - { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, - { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, - { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, - { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, - { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, - { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, - { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, - { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, - { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, - { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, - { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, - { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, - { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, - { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, - { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, - { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, - { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, - { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, - { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, - { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, - { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, - { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, - { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, - { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, - { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, - { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, - { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, - { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, - { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, - { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, - { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, - { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, - { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, - { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, - { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, - { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, - { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, - { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, - { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, - { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, - { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, - { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, - { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, - { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, - { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, - { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, - { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, - { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, - { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, - { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, - { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, - { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, - { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, - { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, - { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, - { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, - { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, - { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, - { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, - { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, - { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, - { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, - { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, - { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, - { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, - { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, - { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, - { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, - { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, - { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, - { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, - { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, - { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, - { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, - { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, - { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, - { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, - { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, - { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, - { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, - { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, -] - [[package]] name = "ruff" version = "0.16.1"