From 8d7e530bd0ef831ca572c78569bcbcd28b7cca96 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 19:57:42 -0600 Subject: [PATCH 1/8] Add a codegen script that compiles schema.json into a validator fastjsonschema turns a JSON Schema into plain Python source. Running it at development time instead of at import time keeps both jsonschema and fastjsonschema out of the runtime dependency set of opentelemetry-configuration. The script compiles with detailed_exceptions=False, which keeps the output at roughly a fifth of the size of the detailed variant, and then repairs the one message that choice degrades: a missing required property otherwise reports a bare "data must contain" naming no property. Both the repair and the import rewrite assert on what they matched, so a change in fastjsonschema's code generation fails the script rather than producing quietly wrong output. The generate-config-validator tox environment runs it. The typecheck environment gains fastjsonschema so pyright can resolve the script's imports. --- .../codegen/generate_validator.py | 133 ++++++++++++++++++ tox.ini | 7 + 2 files changed, 140 insertions(+) create mode 100644 opentelemetry-configuration/codegen/generate_validator.py diff --git a/opentelemetry-configuration/codegen/generate_validator.py b/opentelemetry-configuration/codegen/generate_validator.py new file mode 100644 index 00000000000..73f3ac61d48 --- /dev/null +++ b/opentelemetry-configuration/codegen/generate_validator.py @@ -0,0 +1,133 @@ +"""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 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" +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.""" + return Path(fastjsonschema_exceptions.__file__).read_text(encoding="utf-8") + + +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/tox.ini b/tox.ini index 9b0a2e6743e..eacc9833070 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 From 51da56926494c98f24ef9317859f458641a7c168 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 19:57:52 -0600 Subject: [PATCH 2/8] Add the generated validator and its vendored exception classes Both files are the output of 'tox -e generate-config-validator' and are not edited by hand. _generated_validator.py imports decimal and the exception classes next to it, and nothing else. _validation_exceptions.py is a copy of the exceptions module of fastjsonschema 2.22.2, so that the raised types do not come from a package the installed tree no longer contains. Three linters are told to leave them alone. ruff would reformat both and the drift check compares the committed bytes against what the generator produces. pylint rates 2935 lines of generated code against rules written for hand-written code. pyright reports two call-site errors in the vendored exceptions module, which cannot be fixed without diverging from the upstream copy the drift check compares against. --- .pylintrc | 2 +- .../configuration/_generated_validator.py | 2936 +++++++++++++++++ .../configuration/_validation_exceptions.py | 62 + pyproject.toml | 3 + 4 files changed, 3002 insertions(+), 1 deletion(-) create mode 100644 opentelemetry-configuration/src/opentelemetry/configuration/_generated_validator.py create mode 100644 opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py 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/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..68fe5fd4827 --- /dev/null +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py @@ -0,0 +1,62 @@ +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/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", From fa90b8650f3f1e420b8138677870c960390774f0 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 19:58:01 -0600 Subject: [PATCH 3/8] Test the generated validator against jsonschema and against the schema jsonschema stays a test dependency precisely so these can run. The generated validator is only useful if it reaches the same verdicts as the reference implementation, and the only way to know it does is to ask both and compare, which the first test does over ten documents. Two gaps are checked that behaviour tests cannot reach. fastjsonschema ignores a keyword it does not implement rather than refusing the schema, so a schema that started using one would be under-enforced silently; the schema is scanned for that set. A validator left unregenerated after a schema change also fails nothing, since the verdict comparison only covers ten fixed documents; the schema is recompiled and the result compared against the committed file. --- .../test-requirements.txt | 1 + .../tests/test_generated_validator.py | 203 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 opentelemetry-configuration/tests/test_generated_validator.py 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..9b0afe9765e --- /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", + ) From 25fbdfca041725e364cd9b75fc4a38a517a75972 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 19:58:13 -0600 Subject: [PATCH 4/8] Validate configuration files with the generated validator _validate_schema calls the generated validator instead of jsonschema. The import guard that raised MissingDependencyError for jsonschema goes away along with it, as does the lazy read of schema.json: the schema is compiled into the module rather than parsed at first use. The wording of a rejection changes. jsonschema reported the location as a suffix, "(at tracer_provider -> processors)", while fastjsonschema puts it in the message itself, "data.tracer_provider must contain ['processors'] properties". The ConfigurationError type and the "Configuration does not match schema: " prefix are unchanged. The SchemaError branch is gone because there is no longer a schema to parse at runtime. A malformed schema now fails in the generator instead. --- .../configuration/file/_loader.py | 43 ++++--------------- 1 file changed, 9 insertions(+), 34 deletions(-) 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: From 6fafc49dfebb6a5d6d5d10776ea3d05752fb3a31 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 19:58:13 -0600 Subject: [PATCH 5/8] Drop the jsonschema runtime dependency from opentelemetry-configuration Five packages leave the resolved set: jsonschema itself and attrs, referencing, jsonschema-specifications and rpds-py behind it. rpds-py is a compiled extension, so its removal is what lets an installed tree of this package stay pure Python. jsonschema's own floors, attrs >= 22.2.0 among them, could also force an upgrade of a package the instrumented application had already pinned. --- opentelemetry-configuration/pyproject.toml | 1 - uv.lock | 307 --------------------- 2 files changed, 308 deletions(-) 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/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" From 8e4bcd847ef381f2bea16bd47c83140bd5c05ffc Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 20:01:11 -0600 Subject: [PATCH 6/8] Add changelog fragment --- .changelog/50.removed | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/50.removed 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. From e0e7920b69e8be0ef2a75f077152bc0b2ad0dedf Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 20:28:59 -0600 Subject: [PATCH 7/8] Give the new modules the license headers the repo checks for lint-license-header-check rejected two files. The codegen script is our own code and simply lacked the Apache header. _validation_exceptions.py cannot carry that header, because it is a verbatim copy of a BSD-3-Clause module and is not ours to relicense. BSD-3-Clause requires a redistribution in source form to retain the copyright notice, the conditions and the disclaimer, so the generator now reads the LICENSE file of the installed fastjsonschema distribution and writes it into the copy, and fails if that distribution does not ship exactly one. The file opens with the marker scripts/check_license_header.py already uses to recognise generated output, which is now registered there. --- .../codegen/generate_validator.py | 25 +++++++++++++-- .../configuration/_validation_exceptions.py | 32 +++++++++++++++++++ scripts/check_license_header.py | 1 + 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/opentelemetry-configuration/codegen/generate_validator.py b/opentelemetry-configuration/codegen/generate_validator.py index 73f3ac61d48..cbd29fc0975 100644 --- a/opentelemetry-configuration/codegen/generate_validator.py +++ b/opentelemetry-configuration/codegen/generate_validator.py @@ -1,3 +1,6 @@ +# 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 @@ -36,6 +39,7 @@ 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 @@ -51,6 +55,7 @@ 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" @@ -107,8 +112,24 @@ def compile_validator() -> CompiledValidator: def vendored_exceptions_source() -> str: - """Return the text of ``_validation_exceptions.py``, copied from fastjsonschema.""" - return Path(fastjsonschema_exceptions.__file__).read_text(encoding="utf-8") + """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: diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py index 68fe5fd4827..ebb15f8a6ae 100644 --- a/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py @@ -1,3 +1,35 @@ +# 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 diff --git a/scripts/check_license_header.py b/scripts/check_license_header.py index 2830179a825..49eedce667c 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", ) From d78920933940a8969b0fab36d364e7dfcdcd55f6 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Sun, 25 Oct 2026 20:33:23 -0600 Subject: [PATCH 8/8] Mark the codegen module private so it is not read as public API public-symbols-check reported the script's five module-level names as public API added by this branch. The script is development tooling under opentelemetry-configuration/codegen/, which is not packaged, so none of them are API at all. scripts/public_symbols_checker.py already treats any path component with a single leading underscore as private, so renaming the module says that once and in the place that is true, rather than underscoring each of the five names and then having to silence protected-access everywhere the tests reach for them. --- .../codegen/{generate_validator.py => _generate_validator.py} | 2 +- .../src/opentelemetry/configuration/_validation_exceptions.py | 2 +- opentelemetry-configuration/tests/test_generated_validator.py | 4 ++-- scripts/check_license_header.py | 2 +- tox.ini | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) rename opentelemetry-configuration/codegen/{generate_validator.py => _generate_validator.py} (99%) diff --git a/opentelemetry-configuration/codegen/generate_validator.py b/opentelemetry-configuration/codegen/_generate_validator.py similarity index 99% rename from opentelemetry-configuration/codegen/generate_validator.py rename to opentelemetry-configuration/codegen/_generate_validator.py index cbd29fc0975..07f5404b30b 100644 --- a/opentelemetry-configuration/codegen/generate_validator.py +++ b/opentelemetry-configuration/codegen/_generate_validator.py @@ -55,7 +55,7 @@ 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" +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" diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py index ebb15f8a6ae..2ffac8ea14d 100644 --- a/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_validation_exceptions.py @@ -1,4 +1,4 @@ -# Generated by opentelemetry-configuration/codegen/generate_validator.py +# Generated by opentelemetry-configuration/codegen/_generate_validator.py # # Vendored verbatim from fastjsonschema 2.22.2. # diff --git a/opentelemetry-configuration/tests/test_generated_validator.py b/opentelemetry-configuration/tests/test_generated_validator.py index 9b0afe9765e..68dadd5a14c 100644 --- a/opentelemetry-configuration/tests/test_generated_validator.py +++ b/opentelemetry-configuration/tests/test_generated_validator.py @@ -25,8 +25,8 @@ _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", + "_generate_validator", + Path(__file__).resolve().parent.parent / "codegen" / "_generate_validator.py", ) _CODEGEN = module_from_spec(_CODEGEN_SPEC) _CODEGEN_SPEC.loader.exec_module(_CODEGEN) diff --git a/scripts/check_license_header.py b/scripts/check_license_header.py index 49eedce667c..b57795d6418 100644 --- a/scripts/check_license_header.py +++ b/scripts/check_license_header.py @@ -27,7 +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", + "# Generated by opentelemetry-configuration/codegen/_generate_validator.py", ) diff --git a/tox.ini b/tox.ini index eacc9833070..1b145cbf56d 100644 --- a/tox.ini +++ b/tox.ini @@ -501,7 +501,7 @@ commands = deps = fastjsonschema==2.22.2 commands = - python opentelemetry-configuration/codegen/generate_validator.py + python opentelemetry-configuration/codegen/_generate_validator.py [testenv:shellcheck] commands_pre =