From d064ca6b31da62efc5b7c7c67e6f565f0eeed8e7 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Mon, 17 Mar 2025 15:42:54 +0100 Subject: [PATCH 01/11] [Python] Add codegen --- .github/workflows/push.yml | 16 + experimental/python/Makefile | 11 +- experimental/python/codegen/.python-version | 1 + .../python/codegen/codegen/code_builder.py | 36 ++ .../codegen/codegen/generated_dataclass.py | 542 ++++++++++++++++++ .../codegen/generated_dataclass_patch.py | 153 +++++ .../python/codegen/codegen/generated_enum.py | 76 +++ .../codegen/codegen/generated_imports.py | 82 +++ experimental/python/codegen/codegen/main.py | 236 ++++++++ .../python/codegen/codegen/openapi.py | 154 +++++ .../python/codegen/codegen/openapi_patch.py | 83 +++ .../python/codegen/codegen/packages.py | 89 +++ .../python/codegen/codegen_tests/__init__.py | 0 .../codegen_tests/test_generated_dataclass.py | 77 +++ .../codegen_tests/test_generated_enum.py | 20 + .../codegen/codegen_tests/test_openapi.py | 79 +++ experimental/python/codegen/pyproject.toml | 12 + experimental/python/pyproject.toml | 3 + experimental/python/uv.lock | 11 + 19 files changed, 1680 insertions(+), 1 deletion(-) create mode 100644 experimental/python/codegen/.python-version create mode 100644 experimental/python/codegen/codegen/code_builder.py create mode 100644 experimental/python/codegen/codegen/generated_dataclass.py create mode 100644 experimental/python/codegen/codegen/generated_dataclass_patch.py create mode 100644 experimental/python/codegen/codegen/generated_enum.py create mode 100644 experimental/python/codegen/codegen/generated_imports.py create mode 100644 experimental/python/codegen/codegen/main.py create mode 100644 experimental/python/codegen/codegen/openapi.py create mode 100644 experimental/python/codegen/codegen/openapi_patch.py create mode 100644 experimental/python/codegen/codegen/packages.py create mode 100644 experimental/python/codegen/codegen_tests/__init__.py create mode 100644 experimental/python/codegen/codegen_tests/test_generated_dataclass.py create mode 100644 experimental/python/codegen/codegen_tests/test_generated_enum.py create mode 100644 experimental/python/codegen/codegen_tests/test_openapi.py create mode 100644 experimental/python/codegen/pyproject.toml diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2cc3f4ce2e..1d5ae4bc27 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -168,3 +168,19 @@ jobs: for file in ./bundle/internal/schema/testdata/fail/*.yml; do ajv test -s schema.json -d $file --invalid -c=./keywords.js done + + validate-python-codegen: + needs: cleanups + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Verify that python/codegen is up to date + workdir: experimental/python + run: | + if ! ( make codegen && git diff --exit-code ); then + echo "Generated Python code is not up-to-date. Please run 'pushd experimental/python && make codegen' and commit the changes." + exit 1 + fi diff --git a/experimental/python/Makefile b/experimental/python/Makefile index 1878aab767..5270be3103 100644 --- a/experimental/python/Makefile +++ b/experimental/python/Makefile @@ -16,6 +16,15 @@ lint: uv run pyright uv run ruff format --diff +codegen: + find databricks -name _models | xargs rm -rf + + cd codegen; uv run -m pytest codegen_tests + cd codegen; uv run -m codegen.main --output .. + + uv run ruff check --fix $(sources) || true + uv run ruff format + test: uv run python -m pytest databricks_tests --cov=databricks.bundles --cov-report html -vv @@ -23,4 +32,4 @@ build: rm -rf build dist uv build . -.PHONY: fmt docs lint test build +.PHONY: fmt docs lint codegen test build diff --git a/experimental/python/codegen/.python-version b/experimental/python/codegen/.python-version new file mode 100644 index 0000000000..24ee5b1be9 --- /dev/null +++ b/experimental/python/codegen/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/experimental/python/codegen/codegen/code_builder.py b/experimental/python/codegen/codegen/code_builder.py new file mode 100644 index 0000000000..7e01acc2cc --- /dev/null +++ b/experimental/python/codegen/codegen/code_builder.py @@ -0,0 +1,36 @@ +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from typing_extensions import Self + + +class CodeBuilder: + def __init__(self): + self._code = "" + + def append(self, *args: str) -> "Self": + for arg in args: + self._code += arg + + return self + + def indent(self): + return self.append(" ") + + def newline(self) -> "Self": + return self.append("\n") + + def append_list(self, args: list[str], sep: str = ",") -> "Self": + return self.append(sep.join(args)) + + def append_dict(self, args: dict[str, str], sep: str = ",") -> "Self": + return self.append_list([f"{k}={v}" for k, v in args.items()], sep) + + def append_triple_quote(self) -> "Self": + return self.append('"""') + + def append_repr(self, value) -> "Self": + return self.append(repr(value)) + + def build(self): + return self._code diff --git a/experimental/python/codegen/codegen/generated_dataclass.py b/experimental/python/codegen/codegen/generated_dataclass.py new file mode 100644 index 0000000000..2d9e948cee --- /dev/null +++ b/experimental/python/codegen/codegen/generated_dataclass.py @@ -0,0 +1,542 @@ +from dataclasses import dataclass +from typing import Optional, TYPE_CHECKING + +if TYPE_CHECKING: + from typing_extensions import Self + +import codegen.packages as packages +from codegen.code_builder import CodeBuilder +from codegen.openapi import Property, Schema +from codegen.packages import is_resource + + +@dataclass +class GeneratedType: + """ + GeneratedType is a type that can be used in GeneratedField. + + GeneratedType is self-recursive, so it can represent complex types like lists of dataclasses. + """ + + name: str + """ + The name of the type, e.g., "Task" + """ + + package: Optional[str] + """ + The package of the type, e.g., "databricks.bundles.jobs._models.task". + + If type is builtin, package is None. + """ + + parameters: list["Self"] + """ + Parameters of the type, e.g., for list[str]: + + GeneratedType( + name="list", + parameters=[ + GeneratedType(name="str"), + ], + ) + + """ + + +@dataclass +class GeneratedField: + """ + GeneratedField is a field in GeneratedDataclass. + """ + + field_name: str + """ + The name of the field, e.g., "task_key" + """ + + type_name: GeneratedType + """ + The type of the field, e.g., GeneratedType(name="Task", ...) + """ + + param_type_name: GeneratedType + """ + The type of the field in TypedDict, e.g., GeneratedType(name="TaskParam", ...) + """ + + create_func_type_name: GeneratedType + """ + Type type of the field in static "create" function, e.g., GeneratedType(name="TaskParam", ...) + + It can be different from param_type_name because lists are made optional in "create" function + to avoid problems with mutable default arguments. + """ + + description: Optional[str] + """ + The description of the field to be included into a docstring. + """ + + default: Optional[str] + """ + The default value of the field, e.g., "None" + """ + + create_func_default: Optional[str] + """ + The default value of the field in "create" function. + + It can be different from default because lists are made optional in "create" function + to avoid problems with mutable default arguments. + """ + + default_factory: Optional[str] + """ + Factory method for creating a default value, used for lists and dicts. + """ + + def __post_init__(self): + if self.default_factory is not None and self.default is not None: + raise ValueError("Can't have both default and default_factory", self) + + +@dataclass +class GeneratedOneOf: + """ + GeneratedOneOf is a one-of constraint for GeneratedDataclass. + + Example: in jobs.JobRunAs one of the user_name or service_principal_name must be specified. + """ + + fields: list[str] + required: bool + + +@dataclass +class GeneratedDataclass: + """ + GeneratedDataclass represents a dataclass to be generated. + """ + + class_name: str + """ + The name of the dataclass, e.g., "Task". + """ + + package: str + """ + Package of the dataclass, e.g., "databricks.bundles.jobs._models.task". + """ + + description: Optional[str] + """ + The description of the dataclass to be included into a docstring. + """ + + fields: list[GeneratedField] + extends: list[GeneratedType] + one_ofs: list[GeneratedOneOf] + + +def generate_field( + field_name: str, + prop: Property, + is_required: bool, +) -> GeneratedField: + field_type = generate_type(prop.ref, is_param=False) + param_type = generate_type(prop.ref, is_param=True) + + field_type = variable_or_type(field_type, is_required=is_required) + param_type = variable_or_type(param_type, is_required=is_required) + + if field_type.name == "VariableOrDict": + return GeneratedField( + field_name=field_name, + type_name=field_type, + param_type_name=param_type, + create_func_type_name=optional_type(param_type), + description=prop.description, + default=None, + default_factory="dict", + create_func_default="None", + ) + elif field_type.name == "VariableOrList": + return GeneratedField( + field_name=field_name, + type_name=field_type, + param_type_name=param_type, + create_func_type_name=optional_type(param_type), + description=prop.description, + default=None, + default_factory="list", + create_func_default="None", + ) + elif is_required: + return GeneratedField( + field_name=field_name, + type_name=field_type, + param_type_name=param_type, + create_func_type_name=param_type, + description=prop.description, + default=None, + default_factory=None, + create_func_default=None, + ) + else: + return GeneratedField( + field_name=field_name, + type_name=field_type, + param_type_name=param_type, + create_func_type_name=param_type, + description=prop.description, + default="None", + default_factory=None, + create_func_default="None", + ) + + +def optional_type(generated: GeneratedType) -> GeneratedType: + return GeneratedType( + name="Optional", + package="typing", + parameters=[generated], + ) + + +def str_type() -> GeneratedType: + return GeneratedType( + name="str", + package=None, + parameters=[], + ) + + +def dict_type() -> GeneratedType: + return GeneratedType( + name="dict", + package=None, + parameters=[str_type(), str_type()], + ) + + +def variable_or_type(type: GeneratedType, is_required: bool) -> GeneratedType: + if type.name == "list": + [param] = type.parameters + + return variable_or_list_type(param) + elif type.name == "dict": + [key_param, value_param] = type.parameters + + assert key_param.name == "str" + + return variable_or_dict_type(value_param) + else: + name = "VariableOr" if is_required else "VariableOrOptional" + + return GeneratedType( + name=name, + package="databricks.bundles.core", + parameters=[type], + ) + + +def variable_or_list_type(element_type: GeneratedType) -> GeneratedType: + return GeneratedType( + name="VariableOrList", + package="databricks.bundles.core", + parameters=[element_type], + ) + + +def variable_or_dict_type(element_type: GeneratedType) -> GeneratedType: + return GeneratedType( + name="VariableOrDict", + package="databricks.bundles.core", + parameters=[element_type], + ) + + +def generate_type(ref: str, is_param: bool) -> GeneratedType: + if ref.startswith("#/$defs/slice/"): + element_ref = ref.replace("#/$defs/slice/", "#/$defs/") + element_type = generate_type( + ref=element_ref, + is_param=is_param, + ) + + return GeneratedType( + name="list", + package=None, + parameters=[element_type], + ) + + if ref == "#/$defs/map/string": + return dict_type() + + class_name = packages.get_class_name(ref) + package = packages.get_package(ref) + + if is_param and package: + class_name += "Param" + + return GeneratedType( + name=class_name, + package=package, + parameters=[], + ) + + +def resource_type() -> GeneratedType: + return GeneratedType( + name="Resource", + package="databricks.bundles.core", + parameters=[], + ) + + +def generate_dataclass(schema_name: str, schema: Schema) -> GeneratedDataclass: + print(f"Generating dataclass for {schema_name}") + + fields = list[GeneratedField]() + class_name = packages.get_class_name(schema_name) + + for name, prop in schema.properties.items(): + is_required = name in schema.required + field = generate_field(name, prop, is_required=is_required) + + fields.append(field) + + extends = [] + package = packages.get_package(schema_name) + + assert package + + if is_resource(schema_name): + extends.append(resource_type()) + + return GeneratedDataclass( + class_name=class_name, + package=package, + description=schema.description, + fields=fields, + extends=extends, + one_ofs=[], + ) + + +def _get_type_code(generated: GeneratedType, quote: bool = True) -> str: + if generated.parameters: + parameters = ", ".join( + map(lambda x: _get_type_code(x, quote), generated.parameters) + ) + + return f"{generated.name}[{parameters}]" + else: + if generated.name[0].islower(): + return generated.name + else: + if quote: + return '"' + generated.name + '"' + else: + return generated.name + + +def _append_dataclass(b: CodeBuilder, generated: GeneratedDataclass): + # Example: + # + # @dataclass + # class Job(Resource): + # """docstring""" + + b.append("@dataclass(kw_only=True)") + + b.newline() + b.append("class ", generated.class_name) + + if generated.extends: + b.append("(") + b.append_list( + [_get_type_code(extend, quote=False) for extend in generated.extends] + ) + b.append(")") + + b.append(":").newline() + + # FIXME should contain class docstring + if not generated.description: + b.indent().append_triple_quote().append_triple_quote().newline().newline() + else: + _append_description(b, generated.description) + + +def _append_field(b: CodeBuilder, field: GeneratedField): + # Example: + # + # foo: list[str] = field(default_factory=list) + + b.indent().append(field.field_name).append(": ") + + # don't quote types because it breaks reflection + b.append(_get_type_code(field.type_name, quote=False)) + + if field.default_factory: + b.append(" = field(") + b.append_dict({"default_factory": field.default_factory}) + b.append(")") + elif field.default: + b.append(" = ") + b.append(field.default) + + b.newline() + + +def _append_oneof_check( + b: CodeBuilder, + generated: GeneratedDataclass, + one_of: GeneratedOneOf, +): + # Example: + # + # union_fields = [ + # self.foo, + # self.bar, + # ] + # + # if sum(f is not None for f in union_fields) != 1: + # raise ValueError("Only one of 'foo', 'bar' can be specified in Job") + + condition = ( + "if sum(f is not None for f in union_fields) != 1:" + if one_of.required + else "if sum(f is not None for f in union_fields) > 1:" + ) + fields_str = "'" + "', '".join(one_of.fields) + "'" + error_message = ( + f"{generated.class_name} must specify exactly one of {fields_str}" + if one_of.required + else f"Only one of {fields_str} can be specified in {generated.class_name}" + ) + + b.indent().indent().append("union_fields = [").newline() + for field in one_of.fields: + b.indent().indent().indent().append(f"self.{field},").newline() + b.indent().indent().append("]").newline() + b.newline() + + b.indent().indent().append(condition).newline() + b.indent().indent().indent().append( + f'raise ValueError("{error_message}")' + ).newline() + b.newline() + + +def _append_from_dict(b: CodeBuilder, generated: GeneratedDataclass): + # Example: + # + # @classmethod + # def from_dict(cls, value: 'JobDict') -> 'Job': + # return _transform(cls, value) + + b.indent().append("@classmethod").newline() + + ( + b.indent() + .append("def from_dict(cls, value: ") + .append("'") + .append(generated.class_name + "Dict") + .append("'") + .append(") -> 'Self':") + .newline() + ) + + b.indent().indent().append("return _transform(cls, value)").newline() + b.newline() + + +def _append_as_dict(b: CodeBuilder, generated: GeneratedDataclass): + # Example: + # + # def as_dict(self) -> 'JobDict': + # return _transform_to_json_value(self) # type:ignore + # + + b.indent().append("def as_dict(self) -> '").append(generated.class_name).append( + "Dict':" + ).newline() + b.indent().indent().append( + "return _transform_to_json_value(self) # type:ignore", + ).newline() + b.newline() + + +def _append_typed_dict(b: CodeBuilder, generated: GeneratedDataclass): + # Example: + # + # class JobDict(TypedDict, total=False): + # """docstring""" + # + + b.append("class ").append(generated.class_name).append( + "Dict(TypedDict, total=False):" + ).newline() + + # FIXME should contain class description + b.indent().append_triple_quote().append_triple_quote().newline().newline() + + +def _append_description(b: CodeBuilder, description: Optional[str]): + if description: + b.indent().append_triple_quote().newline() + for line in description.split("\n"): + b.indent().append(line).newline() + b.indent().append_triple_quote().newline() + + +def _append_typed_dict_field(b: CodeBuilder, field: GeneratedField): + b.indent().append(field.field_name).append(": ") + b.append(_get_type_code(field.param_type_name, quote=False)) + b.newline() + + +def get_code(generated: GeneratedDataclass) -> str: + b = CodeBuilder() + + _append_dataclass(b, generated) + + for field in generated.fields: + _append_field(b, field) + _append_description(b, field.description) + + b.newline() + + if generated.one_ofs: + b.indent().append("def __post_init__(self):").newline() + + for one_of in generated.one_ofs: + _append_oneof_check(b, generated, one_of) + + _append_from_dict(b, generated) + _append_as_dict(b, generated) + + b.newline().newline() + + _append_typed_dict(b, generated) + + for field in generated.fields: + _append_typed_dict_field(b, field) + _append_description(b, field.description) + + b.newline() + + # Example: FooParam = FooDict | Foo + + b.newline() + b.append(generated.class_name).append("Param") + b.append(" = ") + b.append(generated.class_name).append("Dict") + b.append(" | ") + b.append(generated.class_name) + b.newline() + + return b.build() diff --git a/experimental/python/codegen/codegen/generated_dataclass_patch.py b/experimental/python/codegen/codegen/generated_dataclass_patch.py new file mode 100644 index 0000000000..9f70cb5bce --- /dev/null +++ b/experimental/python/codegen/codegen/generated_dataclass_patch.py @@ -0,0 +1,153 @@ +from dataclasses import replace + +from codegen.generated_dataclass import ( + GeneratedDataclass, + GeneratedField, + GeneratedOneOf, + GeneratedType, +) + + +def reorder_required_fields(models: dict[str, GeneratedDataclass]): + """ + Reorder fields in dataclasses so that required fields come first. + It's necessary for kwargs in the constructor to work correctly. + """ + for name, model in models.items(): + if not model.fields: + continue + + required_fields = [field for field in model.fields if _is_required(field)] + optional_fields = [field for field in model.fields if not _is_required(field)] + + models[name] = replace(model, fields=required_fields + optional_fields) + + +def quote_recursive_references(models: dict[str, GeneratedDataclass]): + """ + If there is a cycle between two dataclasses, we need to quote one of them. + + Example: + + class Foo: + bar: Optional[Bar] + + class Bar: + foo: "Foo" + """ + + # see also _append_resolve_recursive_imports + + models["jobs.ForEachTask"] = _quote_recursive_references_for_model( + models["jobs.ForEachTask"], + references={"Task", "TaskParam"}, + ) + + +def _quote_recursive_references_for_model( + model: GeneratedDataclass, + references: set[str], +) -> GeneratedDataclass: + def update_type_name(type_name: GeneratedType): + if type_name.name in references: + return replace( + type_name, + name=f'"{type_name.name}"', + ) + elif type_name.parameters: + return replace( + type_name, + parameters=[update_type_name(param) for param in type_name.parameters], + ) + else: + return type_name + + def update_field(field: GeneratedField): + return replace( + field, + type_name=update_type_name(field.type_name), + param_type_name=update_type_name(field.param_type_name), + ) + + return replace( + model, + fields=[update_field(field) for field in model.fields], + ) + + +def _is_required(field: GeneratedField) -> bool: + return field.default is None and field.default_factory is None + + +def add_default_values(models: dict[str, GeneratedDataclass]): + models["jobs.CronSchedule"] = _add_default_value( + models["jobs.CronSchedule"], + field_name="timezone_id", + default_value='"UTC"', + ) + + +def add_oneofs(models: dict[str, GeneratedDataclass]): + models["jobs.JobRunAs"] = _add_oneof( + models["jobs.JobRunAs"], + ["user_name", "service_principal_name"], + required=True, + ) + + models["resources.Permission"] = _add_oneof( + models["resources.Permission"], + ["user_name", "service_principal_name", "group_name"], + required=True, + ) + + models["jobs.Task"] = _add_oneof( + models["jobs.Task"], + ["new_cluster", "job_cluster_key", "environment_key", "existing_cluster_id"], + required=False, + ) + + models["jobs.TriggerSettings"] = _add_oneof( + models["jobs.TriggerSettings"], + ["file_arrival", "periodic", "table_update"], + required=True, + ) + + +def _add_default_value( + model: GeneratedDataclass, + field_name: str, + default_value: str, +): + """ + Add a default value for a field in a dataclass. + """ + + def update_field(field: GeneratedField): + if field.field_name == field_name: + return replace( + field, + default=default_value, + create_func_default=default_value, + ) + else: + return field + + return replace( + model, + fields=[update_field(field) for field in model.fields], + ) + + +def _add_oneof( + model: GeneratedDataclass, + values: list[str], + required: bool, +): + """ + Make a field in a dataclass a one-of, one of the fields can be present. + """ + + return replace( + model, + one_ofs=[GeneratedOneOf(values, required=required)], + ) diff --git a/experimental/python/codegen/codegen/generated_enum.py b/experimental/python/codegen/codegen/generated_enum.py new file mode 100644 index 0000000000..0e367d4b06 --- /dev/null +++ b/experimental/python/codegen/codegen/generated_enum.py @@ -0,0 +1,76 @@ +import re +from dataclasses import dataclass +from typing import Optional + +import codegen.packages as packages +from codegen.code_builder import CodeBuilder +from codegen.generated_dataclass import _append_description +from codegen.openapi import Schema + + +@dataclass(kw_only=True) +class GeneratedEnum: + class_name: str + package: str + values: dict[str, str] + description: Optional[str] + + +def generate_enum(schema_name: str, schema: Schema) -> GeneratedEnum: + assert schema.enum + + class_name = packages.get_class_name(schema_name) + package = packages.get_package(schema_name) + values = {} + + assert package + + for value in schema.enum: + values[_camel_to_upper_snake(value)] = value + + return GeneratedEnum( + class_name=class_name, + package=package, + values=values, + description=schema.description, + ) + + +def get_code(generated: GeneratedEnum) -> str: + b = CodeBuilder() + + # Example: + # + # class Color(Enum): + # + b.append(f"class {generated.class_name}(Enum):") + b.newline() + + _append_description(b, generated.description) + + # Example: + # + # RED = "RED" + # + for key, value in generated.values.items(): + b.indent().append(f'{key} = "{value}"') + b.newline() + + b.newline() + + # Example: + # + # ColorParam = Literal["RED", "GREEN", "BLUE"] | Color + + b.append(generated.class_name).append('Param = Literal["') + b.append_list(list(generated.values.values()), sep='", "') + b.append('"] | ', generated.class_name) + b.newline() + + return b.build() + + +def _camel_to_upper_snake(value): + s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", value) + + return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).upper() diff --git a/experimental/python/codegen/codegen/generated_imports.py b/experimental/python/codegen/codegen/generated_imports.py new file mode 100644 index 0000000000..f9217b644f --- /dev/null +++ b/experimental/python/codegen/codegen/generated_imports.py @@ -0,0 +1,82 @@ +from textwrap import dedent + +import codegen.packages as packages +from codegen.code_builder import CodeBuilder +from codegen.generated_dataclass import GeneratedDataclass +from codegen.generated_enum import GeneratedEnum + + +def append_enum_imports( + b: CodeBuilder, + enums: dict[str, GeneratedEnum], + exclude_packages: list[str], +) -> None: + for schema_name in enums.keys(): + package = packages.get_package(schema_name) + class_name = packages.get_class_name(schema_name) + + if package in exclude_packages: + continue + + b.append(f"from {package} import {class_name}, {class_name}Param\n").newline() + + +def append_dataclass_imports( + b: CodeBuilder, + dataclasses: dict[str, GeneratedDataclass], + exclude_packages: list[str], +) -> None: + for schema_name in dataclasses.keys(): + package = packages.get_package(schema_name) + class_name = packages.get_class_name(schema_name) + + if package in exclude_packages: + continue + + b.append( + f"from {package} import {class_name}, {class_name}Dict, {class_name}Param" + ).newline() + + +def get_code( + dataclasses: dict[str, GeneratedDataclass], + enums: dict[str, GeneratedEnum], + typechecking_imports: dict[str, list[str]], + exclude_packages: list[str], +) -> str: + b = CodeBuilder() + + b.append( + "from typing import Literal, Optional, TypedDict, ClassVar, TYPE_CHECKING\n" + ) + b.append("from enum import Enum\n") + b.append("from dataclasses import dataclass, replace, field\n") + b.append("\n") + b.append("from databricks.bundles.core._resource import Resource\n") + b.append("from databricks.bundles.core._transform import _transform\n") + b.append( + "from databricks.bundles.core._transform_to_json import _transform_to_json_value\n" + ) + b.append( + "from databricks.bundles.core._variable import VariableOr, VariableOrOptional, VariableOrList, VariableOrDict\n" + ) + b.newline() + + runtime_dataclasses = { + k: v + for k, v in dataclasses.items() + if v.class_name not in typechecking_imports.get(v.package, []) + } + + append_dataclass_imports(b, runtime_dataclasses, exclude_packages) + append_enum_imports(b, enums, exclude_packages) + + # typechecking_imports is special case because it's only for TYPE_CHECKING + # and formatter doesn't eliminate unused imports for TYPE_CHECKING + if typechecking_imports: + b.newline() + b.append("if TYPE_CHECKING:").newline() + for package, imports in typechecking_imports.items(): + b.indent().append(f"from {package} import {', '.join(imports)}").newline() + + return b.build() diff --git a/experimental/python/codegen/codegen/main.py b/experimental/python/codegen/codegen/main.py new file mode 100644 index 0000000000..e331afc406 --- /dev/null +++ b/experimental/python/codegen/codegen/main.py @@ -0,0 +1,236 @@ +import argparse +from pathlib import Path +from textwrap import dedent + +import codegen.generated_dataclass as generated_dataclass +import codegen.generated_dataclass_patch as generated_dataclass_patch +import codegen.generated_enum as generated_enum +import codegen.generated_imports as generated_imports +import codegen.openapi as openapi +import codegen.openapi_patch as openapi_patch +import codegen.packages as packages + +from codegen.code_builder import CodeBuilder +from codegen.generated_dataclass import GeneratedDataclass, GeneratedType +from codegen.generated_enum import GeneratedEnum + + +def main(output: str): + schemas = openapi.get_schemas() + schemas = openapi_patch.add_extra_required_fields(schemas) + schemas = openapi_patch.remove_unsupported_fields(schemas) + schemas = _remove_unused_schemas(packages.RESOURCE_TYPES, schemas) + + dataclasses, enums = _generate_code(schemas) + + generated_dataclass_patch.add_default_values(dataclasses) + generated_dataclass_patch.add_oneofs(dataclasses) + generated_dataclass_patch.reorder_required_fields(dataclasses) + generated_dataclass_patch.quote_recursive_references(dataclasses) + + _write_code(dataclasses, enums, output) + + for resource in packages.RESOURCE_TYPES: + _write_exports(resource, dataclasses, enums, output) + + +def _generate_code( + schemas: dict[str, openapi.Schema], +) -> tuple[dict[str, GeneratedDataclass], dict[str, GeneratedEnum]]: + dataclasses = {} + enums = {} + + for schema_name, schema in schemas.items(): + if schema.type == openapi.SchemaType.OBJECT: + generated = generated_dataclass.generate_dataclass(schema_name, schema) + + dataclasses[schema_name] = generated + elif schema.type == openapi.SchemaType.STRING: + generated = generated_enum.generate_enum(schema_name, schema) + + enums[schema_name] = generated + else: + raise ValueError(f"Unknown type: {schema.type}") + + return dataclasses, enums + + +def _write_exports( + root: str, + dataclasses: dict[str, GeneratedDataclass], + enums: dict[str, GeneratedEnum], + output: str, +): + exports = [] + + for _, dataclass in dataclasses.items(): + exports += [ + dataclass.class_name, + f"{dataclass.class_name}Dict", + f"{dataclass.class_name}Param", + ] + + for _, enum in enums.items(): + exports += [enum.class_name, f"{enum.class_name}Param"] + + exports.sort() + + b = CodeBuilder() + + b.append("__all__ = [\n") + for export in exports: + b.indent().append_repr(export).append(",").newline() + b.append("]").newline() + b.newline() + b.newline() + + generated_imports.append_dataclass_imports(b, dataclasses, exclude_packages=[]) + generated_imports.append_enum_imports(b, enums, exclude_packages=[]) + + # FIXME should be better generalized + if root == "resources.Job": + _append_resolve_recursive_imports(b) + + root_package = packages.get_package(root) + assert root_package + + # transform databricks.bundles.jobs._models.job -> databricks/bundles/jobs + package_path = Path(root_package.replace(".", "/")).parent.parent + + source_path = Path(output) / package_path / "__init__.py" + source_path.parent.mkdir(exist_ok=True, parents=True) + source_path.write_text(b.build()) + + print(f"Writing exports into {source_path}") + + +def _append_resolve_recursive_imports(b: CodeBuilder): + """ + Resolve forward references for recursive imports so we can assume that there are no forward references + while inspecting type annotations. + """ + + b.append( + dedent(""" + def _resolve_recursive_imports(): + import typing + + from databricks.bundles.core._variable import VariableOr + from databricks.bundles.jobs._models.task import Task + + ForEachTask.__annotations__ = typing.get_type_hints( + ForEachTask, + globalns={"Task": Task, "VariableOr": VariableOr}, + ) + + _resolve_recursive_imports() + """) + ) + + +def _collect_typechecking_imports( + generated: GeneratedDataclass, +) -> dict[str, list[str]]: + out = {} + + def visit_type(type_name: GeneratedType): + if type_name.name.startswith('"'): + out[type_name.package] = out.get(type_name.package, []) + out[type_name.package].append(type_name.name.strip('"')) + + for parameter in type_name.parameters: + visit_type(parameter) + + for field in generated.fields: + visit_type(field.type_name) + visit_type(field.param_type_name) + + return out + + +def _remove_unused_schemas( + roots: list[str], + schemas: dict[str, openapi.Schema], +) -> dict[str, openapi.Schema]: + """ + Remove schemas that are not reachable from the roots, because we + don't want to generate code for them. + """ + + reachable = set(packages.PRIMITIVES) + stack = [] + + for root in roots: + stack.append(root) + + while stack: + current = stack.pop() + if current in reachable: + continue + + reachable.add(current) + + schema = schemas[current] + + if schema.type == openapi.SchemaType.OBJECT: + for field in schema.properties.values(): + if field.ref: + name = field.ref.split("/")[-1] + + if name not in reachable: + stack.append(name) + + return {k: v for k, v in schemas.items() if k in reachable} + + +def _write_code( + dataclasses: dict[str, GeneratedDataclass], + enums: dict[str, GeneratedEnum], + output: str, +): + package_code = {} + typechecking_imports = {} + + for schema_name, generated in dataclasses.items(): + package = generated.package + code = generated_dataclass.get_code(generated) + + typechecking_imports[package] = _collect_typechecking_imports(generated) + typechecking_imports[package]["typing_extensions"] = ["Self"] + + package_code[package] = package_code.get(package, "") + package_code[package] += "\n" + code + + for schema_name, generated in enums.items(): + package = generated.package + code = generated_enum.get_code(generated) + + package_code[package] = package_code.get(package, "") + package_code[package] += "\n" + code + + package_code = { + package: generated_imports.get_code( + dataclasses, + enums, + # don't import package from itself + exclude_packages=[package], + typechecking_imports=typechecking_imports.get(package, {}), + ) + + code + for package, code in package_code.items() + } + + for package, code in package_code.items(): + package_path = package.replace(".", "/") + source_path = Path(output) / (package_path + ".py") + + source_path.parent.mkdir(exist_ok=True, parents=True) + source_path.write_text(code) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--output", type=str) + args = parser.parse_args() + + main(args.output) diff --git a/experimental/python/codegen/codegen/openapi.py b/experimental/python/codegen/codegen/openapi.py new file mode 100644 index 0000000000..6a8a363e7c --- /dev/null +++ b/experimental/python/codegen/codegen/openapi.py @@ -0,0 +1,154 @@ +import json +from pathlib import Path +from dataclasses import dataclass, field +from enum import Enum +from typing import Optional + +import codegen.packages as packages + + +@dataclass +class Property: + ref: str + description: Optional[str] = None + + +class SchemaType(Enum): + OBJECT = "object" + STRING = "string" + + +@dataclass +class Schema: + type: SchemaType + enum: list[str] = field(default_factory=list) + properties: dict[str, Property] = field(default_factory=dict) + required: list[str] = field(default_factory=list) + description: Optional[str] = None + + def __post_init__(self): + match self.type: + case SchemaType.OBJECT: + assert self.properties + assert not self.enum + + case SchemaType.STRING: + assert not self.properties + assert not self.required + assert self.enum + case _: + raise ValueError(f"Unknown type: {self.type}") + + for item in self.enum: + assert isinstance(item, str) + + for item in self.required: + assert isinstance(item, str) + + +@dataclass +class Spec: + schemas: dict[str, Schema] + + +def _unwrap_variable(schema: dict): + # we assume that each field can be a variable + + if anyOf := schema.get("anyOf") or schema.get("oneOf"): + if len(anyOf) != 2: + return None + + [primary, variable] = anyOf + + pattern = variable.get("pattern", "") + type = variable.get("type", "") + + if ( + type == "string" + and pattern.startswith("\\$\\{") + and pattern.endswith("\\}") + ): + return primary + + return None + + +def _parse_schema(schema: dict) -> Schema: + schema = _unwrap_variable(schema) or schema + properties = {} + + for k, v in schema.get("properties", {}).items(): + assert v.get("type") is None + assert v.get("anyOf") is None + assert v.get("properties") is None + assert v.get("items") is None + + assert v.get("$ref") + + prop = Property( + ref=v["$ref"], + description=v.get("description"), + ) + + properties[k] = prop + + assert schema.get("type") in [ + "object", + "string", + ], f"{schema} type not in ['object', 'string']" + + return Schema( + type=SchemaType(schema["type"]), + enum=schema.get("enum", []), + properties=properties, + required=schema.get("required", []), + description=schema.get("description"), + ) + + +def _load_spec() -> dict: + path = ( + Path(__file__).parent # ./experimental/python/codegen/codegen + / ".." # ./experimental/python/codegen + / ".." # ./experimental/python/ + / ".." # ./experimental + / ".." # ./ + / "./bundle/schema/jsonschema.json" + ) + + return json.load(path.open()) + + +def get_schemas(): + output = dict[str, Schema]() + spec = _load_spec() + + sdk_types_spec = _get_spec_path( + spec, + ["$defs", "github.com", "databricks", "databricks-sdk-go", "service"], + ) + resource_types_spec = _get_spec_path( + spec, + ["$defs", "github.com", "databricks", "cli", "bundle", "config"], + ) + + # we don't need all spec, only get supported types + flat_spec = {**sdk_types_spec, **resource_types_spec} + flat_spec = { + key: value for key, value in flat_spec.items() if packages.should_load_ref(key) + } + + for name, schema in flat_spec.items(): + try: + output[name] = _parse_schema(schema) + except Exception as e: + raise ValueError(f"Failed to parse schema for {name}") from e + + return output + + +def _get_spec_path(spec: dict, path: list[str]) -> dict: + for key in path: + spec = spec[key] + + return spec diff --git a/experimental/python/codegen/codegen/openapi_patch.py b/experimental/python/codegen/codegen/openapi_patch.py new file mode 100644 index 0000000000..a9b2b0a2a5 --- /dev/null +++ b/experimental/python/codegen/codegen/openapi_patch.py @@ -0,0 +1,83 @@ +from dataclasses import replace + +from codegen.openapi import Schema + +REMOVED_FIELDS = { + "jobs.RunJobTask": { + # all params except job_parameters should be deprecated and should not be supported + "jar_params", + "notebook_params", + "python_params", + "spark_submit_params", + "python_named_params", + "sql_params", + "dbt_commands", + # except pipeline_params, that is not deprecated + }, + "jobs.TriggerSettings": { + # Old table trigger settings name. Deprecated in favor of `table_update` + "table", + }, + "compute.ClusterSpec": { + # doesn't work, openapi schema needs to be updated to be enum + "kind", + }, + "jobs.Task": { + # TODO add task types as a follow-up + "clean_rooms_notebook_task", + "gen_ai_compute_task", + }, + "jobs.SparkJarTask": { + # Deprecated. A value of `false` is no longer supported. + "run_as_repl", + }, +} + +EXTRA_REQUIRED_FIELDS: dict[str, list[str]] = { + "jobs.SparkJarTask": ["main_class_name"], +} + + +def add_extra_required_fields(schemas: dict[str, Schema]): + output = {} + + for name, schema in schemas.items(): + if extra_required := EXTRA_REQUIRED_FIELDS.get(name): + new_required = [*schema.required, *extra_required] + new_required = list(set(new_required)) + + if set(new_required) == set(schema.required): + raise ValueError( + f"Extra required fields for {name} are already present in the schema" + ) + + new_schema = replace(schema, required=new_required) + + output[name] = new_schema + else: + output[name] = schema + + return output + + +def remove_unsupported_fields(schemas: dict[str, Schema]): + output = {} + + for name, schema in schemas.items(): + if removed_fields := REMOVED_FIELDS.get(name): + new_properties = { + field: prop + for field, prop in schema.properties.items() + if field not in removed_fields + } + + if new_properties.keys() == schema.properties.keys(): + raise ValueError(f"No fields to remove in schema {name}") + + new_schema = replace(schema, properties=new_properties) + + output[name] = new_schema + else: + output[name] = schema + + return output diff --git a/experimental/python/codegen/codegen/packages.py b/experimental/python/codegen/codegen/packages.py new file mode 100644 index 0000000000..d59a3a4d56 --- /dev/null +++ b/experimental/python/codegen/codegen/packages.py @@ -0,0 +1,89 @@ +import re +from typing import Optional + +RESOURCE_NAMESPACE_OVERRIDE = { + "resources.Job": "jobs", + # FIXME this is not correct, other resource types can also have permissions + # we should separate types for those + "resources.Permission": "jobs", +} + +# All supported resource types +RESOURCE_TYPES = [ + "resources.Job", +] + +# Namespaces to load from OpenAPI spec. +# +# We can't load all types because of errors while loading some of them. +LOADED_NAMESPACES = [ + "compute", + "jobs", + "resources", +] + +RENAMES = { + "string": "str", + "boolean": "bool", + "integer": "int", + "number": "float", + "int64": "int", + "float64": "float", +} + +PRIMITIVES = [ + "string", + "boolean", + "integer", + "number", + "bool", + "int", + "int64", + "float64", +] + + +def get_class_name(ref: str) -> str: + name = ref.split("/")[-1] + name = name.split(".")[-1] + + return RENAMES.get(name, name) + + +def is_resource(ref: str) -> bool: + return ref in RESOURCE_TYPES + + +def should_load_ref(ref: str) -> bool: + name = ref.split("/")[-1] + + # FIXME doesn't work, looks like enum, but doesn't have any values specified + if name == "compute.Kind": + return False + + for namespace in LOADED_NAMESPACES: + if name.startswith(f"{namespace}."): + return True + + return name in PRIMITIVES + + +def get_package(ref: str) -> Optional[str]: + """ + Returns Python package for a given OpenAPI ref. + Returns None for builtin types. + """ + + full_name = ref.split("/")[-1] + + if full_name in PRIMITIVES: + return None + + [namespace, name] = full_name.split(".") + + if override := RESOURCE_NAMESPACE_OVERRIDE.get(full_name): + namespace = override + + package_name = re.sub(r"(?=3.10" +dependencies = [] + +[tool.pytest.ini_options] +addopts = "-ra -q -vv" +testpaths = [ + "databricks_tests", +] diff --git a/experimental/python/pyproject.toml b/experimental/python/pyproject.toml index 827f34cfe9..a03fa4544d 100644 --- a/experimental/python/pyproject.toml +++ b/experimental/python/pyproject.toml @@ -32,6 +32,9 @@ dev-dependencies = [ name = "databricks" packages = ["databricks"] +[tool.uv.workspace] +members = ["codegen"] + [tool.pytest.ini_options] addopts = "-ra -q -vv" testpaths = [ diff --git a/experimental/python/uv.lock b/experimental/python/uv.lock index b236ebd1d6..039e2be23b 100644 --- a/experimental/python/uv.lock +++ b/experimental/python/uv.lock @@ -2,6 +2,12 @@ version = 1 revision = 1 requires-python = ">=3.10" +[manifest] +members = [ + "codegen", + "databricks-bundles", +] + [[package]] name = "alabaster" version = "1.0.0" @@ -90,6 +96,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, ] +[[package]] +name = "codegen" +version = "0.1.0" +source = { virtual = "codegen" } + [[package]] name = "colorama" version = "0.4.6" From 977df62b253a517f118e27c8d3d5b7b1537ccaf6 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Wed, 9 Apr 2025 16:51:14 +0200 Subject: [PATCH 02/11] Address CR feedback and clean diff --- .github/workflows/push.yml | 6 +- experimental/python/codegen/.python-version | 1 - .../codegen/generated_dataclass_patch.py | 75 -------- .../codegen/{openapi.py => jsonschema.py} | 1 - .../{openapi_patch.py => jsonschema_patch.py} | 17 +- experimental/python/codegen/codegen/main.py | 29 ++- .../python/codegen/codegen/packages.py | 8 +- experimental/python/codegen/pyproject.toml | 9 +- experimental/python/uv.lock | 170 ++---------------- 9 files changed, 65 insertions(+), 251 deletions(-) delete mode 100644 experimental/python/codegen/.python-version rename experimental/python/codegen/codegen/{openapi.py => jsonschema.py} (98%) rename experimental/python/codegen/codegen/{openapi_patch.py => jsonschema_patch.py} (88%) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1d5ae4bc27..cef89514a7 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -178,9 +178,11 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Verify that python/codegen is up to date - workdir: experimental/python + working-directory: experimental/python run: | if ! ( make codegen && git diff --exit-code ); then echo "Generated Python code is not up-to-date. Please run 'pushd experimental/python && make codegen' and commit the changes." - exit 1 + + # TODO block PR if this fails once diffs are fixed + # exit 1 fi diff --git a/experimental/python/codegen/.python-version b/experimental/python/codegen/.python-version deleted file mode 100644 index 24ee5b1be9..0000000000 --- a/experimental/python/codegen/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.13 diff --git a/experimental/python/codegen/codegen/generated_dataclass_patch.py b/experimental/python/codegen/codegen/generated_dataclass_patch.py index 9f70cb5bce..50bcd3205a 100644 --- a/experimental/python/codegen/codegen/generated_dataclass_patch.py +++ b/experimental/python/codegen/codegen/generated_dataclass_patch.py @@ -3,7 +3,6 @@ from codegen.generated_dataclass import ( GeneratedDataclass, GeneratedField, - GeneratedOneOf, GeneratedType, ) @@ -77,77 +76,3 @@ def update_field(field: GeneratedField): def _is_required(field: GeneratedField) -> bool: return field.default is None and field.default_factory is None - - -def add_default_values(models: dict[str, GeneratedDataclass]): - models["jobs.CronSchedule"] = _add_default_value( - models["jobs.CronSchedule"], - field_name="timezone_id", - default_value='"UTC"', - ) - - -def add_oneofs(models: dict[str, GeneratedDataclass]): - models["jobs.JobRunAs"] = _add_oneof( - models["jobs.JobRunAs"], - ["user_name", "service_principal_name"], - required=True, - ) - - models["resources.Permission"] = _add_oneof( - models["resources.Permission"], - ["user_name", "service_principal_name", "group_name"], - required=True, - ) - - models["jobs.Task"] = _add_oneof( - models["jobs.Task"], - ["new_cluster", "job_cluster_key", "environment_key", "existing_cluster_id"], - required=False, - ) - - models["jobs.TriggerSettings"] = _add_oneof( - models["jobs.TriggerSettings"], - ["file_arrival", "periodic", "table_update"], - required=True, - ) - - -def _add_default_value( - model: GeneratedDataclass, - field_name: str, - default_value: str, -): - """ - Add a default value for a field in a dataclass. - """ - - def update_field(field: GeneratedField): - if field.field_name == field_name: - return replace( - field, - default=default_value, - create_func_default=default_value, - ) - else: - return field - - return replace( - model, - fields=[update_field(field) for field in model.fields], - ) - - -def _add_oneof( - model: GeneratedDataclass, - values: list[str], - required: bool, -): - """ - Make a field in a dataclass a one-of, one of the fields can be present. - """ - - return replace( - model, - one_ofs=[GeneratedOneOf(values, required=required)], - ) diff --git a/experimental/python/codegen/codegen/openapi.py b/experimental/python/codegen/codegen/jsonschema.py similarity index 98% rename from experimental/python/codegen/codegen/openapi.py rename to experimental/python/codegen/codegen/jsonschema.py index 6a8a363e7c..e230d6d0b3 100644 --- a/experimental/python/codegen/codegen/openapi.py +++ b/experimental/python/codegen/codegen/jsonschema.py @@ -29,7 +29,6 @@ class Schema: def __post_init__(self): match self.type: case SchemaType.OBJECT: - assert self.properties assert not self.enum case SchemaType.STRING: diff --git a/experimental/python/codegen/codegen/openapi_patch.py b/experimental/python/codegen/codegen/jsonschema_patch.py similarity index 88% rename from experimental/python/codegen/codegen/openapi_patch.py rename to experimental/python/codegen/codegen/jsonschema_patch.py index a9b2b0a2a5..4b2c3862d8 100644 --- a/experimental/python/codegen/codegen/openapi_patch.py +++ b/experimental/python/codegen/codegen/jsonschema_patch.py @@ -22,14 +22,23 @@ # doesn't work, openapi schema needs to be updated to be enum "kind", }, - "jobs.Task": { - # TODO add task types as a follow-up - "clean_rooms_notebook_task", - "gen_ai_compute_task", + "jobs.TaskEmailNotifications": { + # Deprecated + "no_alert_for_skipped_runs", }, "jobs.SparkJarTask": { # Deprecated. A value of `false` is no longer supported. "run_as_repl", + # Deprecated + "jar_uri", + }, + "resources.Pipeline": { + # Deprecated + "trigger", + }, + "pipelines.PipelineLibrary": { + # Deprecated + "whl", }, } diff --git a/experimental/python/codegen/codegen/main.py b/experimental/python/codegen/codegen/main.py index e331afc406..7c99b62a6c 100644 --- a/experimental/python/codegen/codegen/main.py +++ b/experimental/python/codegen/codegen/main.py @@ -23,15 +23,18 @@ def main(output: str): dataclasses, enums = _generate_code(schemas) - generated_dataclass_patch.add_default_values(dataclasses) - generated_dataclass_patch.add_oneofs(dataclasses) generated_dataclass_patch.reorder_required_fields(dataclasses) generated_dataclass_patch.quote_recursive_references(dataclasses) _write_code(dataclasses, enums, output) for resource in packages.RESOURCE_TYPES: - _write_exports(resource, dataclasses, enums, output) + reachable = _collect_reachable_schemas([resource], schemas) + + resource_dataclasses = {k: v for k, v in dataclasses.items() if k in reachable} + resource_enums = {k: v for k, v in enums.items() if k in reachable} + + _write_exports(resource, resource_dataclasses, resource_enums, output) def _generate_code( @@ -148,10 +151,12 @@ def visit_type(type_name: GeneratedType): return out -def _remove_unused_schemas( +def _collect_reachable_schemas( roots: list[str], schemas: dict[str, openapi.Schema], -) -> dict[str, openapi.Schema]: + include_private: bool = True, + include_deprecated: bool = True, +) -> set[str]: """ Remove schemas that are not reachable from the roots, because we don't want to generate code for them. @@ -180,6 +185,20 @@ def _remove_unused_schemas( if name not in reachable: stack.append(name) + return reachable + + +def _remove_unused_schemas( + roots: list[str], + schemas: dict[str, openapi.Schema], +) -> dict[str, openapi.Schema]: + """ + Remove schemas that are not reachable from the roots, because we + don't want to generate code for them. + """ + + reachable = _collect_reachable_schemas(roots, schemas) + return {k: v for k, v in schemas.items() if k in reachable} diff --git a/experimental/python/codegen/codegen/packages.py b/experimental/python/codegen/codegen/packages.py index d59a3a4d56..333c6ecd8a 100644 --- a/experimental/python/codegen/codegen/packages.py +++ b/experimental/python/codegen/codegen/packages.py @@ -3,14 +3,15 @@ RESOURCE_NAMESPACE_OVERRIDE = { "resources.Job": "jobs", - # FIXME this is not correct, other resource types can also have permissions - # we should separate types for those - "resources.Permission": "jobs", + "resources.Pipeline": "pipelines", + "resources.JobPermission": "jobs", + "resources.PipelinePermission": "jobs", } # All supported resource types RESOURCE_TYPES = [ "resources.Job", + "resources.Pipeline", ] # Namespaces to load from OpenAPI spec. @@ -19,6 +20,7 @@ LOADED_NAMESPACES = [ "compute", "jobs", + "pipelines", "resources", ] diff --git a/experimental/python/codegen/pyproject.toml b/experimental/python/codegen/pyproject.toml index 02ed52ed00..66726a77c6 100644 --- a/experimental/python/codegen/pyproject.toml +++ b/experimental/python/codegen/pyproject.toml @@ -2,11 +2,16 @@ name = "codegen" version = "0.1.0" description = "Code generator for Python" -requires-python = ">=3.10" +requires-python = "==3.13.*" # constrained version for deterministic output dependencies = [] [tool.pytest.ini_options] addopts = "-ra -q -vv" testpaths = [ - "databricks_tests", + "codegen_tests", +] + +[tool.uv] +dev-dependencies = [ + "pytest==8.3.3", ] diff --git a/experimental/python/uv.lock b/experimental/python/uv.lock index 039e2be23b..0d0d34edd6 100644 --- a/experimental/python/uv.lock +++ b/experimental/python/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 1 -requires-python = ">=3.10" +requires-python = "==3.13.*" [manifest] members = [ @@ -41,45 +41,6 @@ version = "3.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, - { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, - { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, - { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, - { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, - { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, - { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, - { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, - { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, - { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, - { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, - { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, - { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, @@ -101,6 +62,16 @@ name = "codegen" version = "0.1.0" source = { virtual = "codegen" } +[package.dev-dependencies] +dev = [ + { name = "pytest" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [{ name = "pytest", specifier = "==8.3.3" }] + [[package]] name = "colorama" version = "0.4.6" @@ -116,36 +87,6 @@ version = "7.6.12" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0c/d6/2b53ab3ee99f2262e6f0b8369a43f6d66658eab45510331c0b3d5c8c4272/coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2", size = 805941 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/67/81dc41ec8f548c365d04a29f1afd492d3176b372c33e47fa2a45a01dc13a/coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8", size = 208345 }, - { url = "https://files.pythonhosted.org/packages/33/43/17f71676016c8829bde69e24c852fef6bd9ed39f774a245d9ec98f689fa0/coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879", size = 208775 }, - { url = "https://files.pythonhosted.org/packages/86/25/c6ff0775f8960e8c0840845b723eed978d22a3cd9babd2b996e4a7c502c6/coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe", size = 237925 }, - { url = "https://files.pythonhosted.org/packages/b0/3d/5f5bd37046243cb9d15fff2c69e498c2f4fe4f9b42a96018d4579ed3506f/coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674", size = 235835 }, - { url = "https://files.pythonhosted.org/packages/b5/f1/9e6b75531fe33490b910d251b0bf709142e73a40e4e38a3899e6986fe088/coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb", size = 236966 }, - { url = "https://files.pythonhosted.org/packages/4f/bc/aef5a98f9133851bd1aacf130e754063719345d2fb776a117d5a8d516971/coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c", size = 236080 }, - { url = "https://files.pythonhosted.org/packages/eb/d0/56b4ab77f9b12aea4d4c11dc11cdcaa7c29130b837eb610639cf3400c9c3/coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c", size = 234393 }, - { url = "https://files.pythonhosted.org/packages/0d/77/28ef95c5d23fe3dd191a0b7d89c82fea2c2d904aef9315daf7c890e96557/coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e", size = 235536 }, - { url = "https://files.pythonhosted.org/packages/29/62/18791d3632ee3ff3f95bc8599115707d05229c72db9539f208bb878a3d88/coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425", size = 211063 }, - { url = "https://files.pythonhosted.org/packages/fc/57/b3878006cedfd573c963e5c751b8587154eb10a61cc0f47a84f85c88a355/coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa", size = 211955 }, - { url = "https://files.pythonhosted.org/packages/64/2d/da78abbfff98468c91fd63a73cccdfa0e99051676ded8dd36123e3a2d4d5/coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015", size = 208464 }, - { url = "https://files.pythonhosted.org/packages/31/f2/c269f46c470bdabe83a69e860c80a82e5e76840e9f4bbd7f38f8cebbee2f/coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45", size = 208893 }, - { url = "https://files.pythonhosted.org/packages/47/63/5682bf14d2ce20819998a49c0deadb81e608a59eed64d6bc2191bc8046b9/coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702", size = 241545 }, - { url = "https://files.pythonhosted.org/packages/6a/b6/6b6631f1172d437e11067e1c2edfdb7238b65dff965a12bce3b6d1bf2be2/coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0", size = 239230 }, - { url = "https://files.pythonhosted.org/packages/c7/01/9cd06cbb1be53e837e16f1b4309f6357e2dfcbdab0dd7cd3b1a50589e4e1/coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f", size = 241013 }, - { url = "https://files.pythonhosted.org/packages/4b/26/56afefc03c30871326e3d99709a70d327ac1f33da383cba108c79bd71563/coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f", size = 239750 }, - { url = "https://files.pythonhosted.org/packages/dd/ea/88a1ff951ed288f56aa561558ebe380107cf9132facd0b50bced63ba7238/coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d", size = 238462 }, - { url = "https://files.pythonhosted.org/packages/6e/d4/1d9404566f553728889409eff82151d515fbb46dc92cbd13b5337fa0de8c/coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba", size = 239307 }, - { url = "https://files.pythonhosted.org/packages/12/c1/e453d3b794cde1e232ee8ac1d194fde8e2ba329c18bbf1b93f6f5eef606b/coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f", size = 211117 }, - { url = "https://files.pythonhosted.org/packages/d5/db/829185120c1686fa297294f8fcd23e0422f71070bf85ef1cc1a72ecb2930/coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558", size = 212019 }, - { url = "https://files.pythonhosted.org/packages/e2/7f/4af2ed1d06ce6bee7eafc03b2ef748b14132b0bdae04388e451e4b2c529b/coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad", size = 208645 }, - { url = "https://files.pythonhosted.org/packages/dc/60/d19df912989117caa95123524d26fc973f56dc14aecdec5ccd7d0084e131/coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3", size = 208898 }, - { url = "https://files.pythonhosted.org/packages/bd/10/fecabcf438ba676f706bf90186ccf6ff9f6158cc494286965c76e58742fa/coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574", size = 242987 }, - { url = "https://files.pythonhosted.org/packages/4c/53/4e208440389e8ea936f5f2b0762dcd4cb03281a7722def8e2bf9dc9c3d68/coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985", size = 239881 }, - { url = "https://files.pythonhosted.org/packages/c4/47/2ba744af8d2f0caa1f17e7746147e34dfc5f811fb65fc153153722d58835/coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750", size = 242142 }, - { url = "https://files.pythonhosted.org/packages/e9/90/df726af8ee74d92ee7e3bf113bf101ea4315d71508952bd21abc3fae471e/coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea", size = 241437 }, - { url = "https://files.pythonhosted.org/packages/f6/af/995263fd04ae5f9cf12521150295bf03b6ba940d0aea97953bb4a6db3e2b/coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3", size = 239724 }, - { url = "https://files.pythonhosted.org/packages/1c/8e/5bb04f0318805e190984c6ce106b4c3968a9562a400180e549855d8211bd/coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a", size = 241329 }, - { url = "https://files.pythonhosted.org/packages/9e/9d/fa04d9e6c3f6459f4e0b231925277cfc33d72dfab7fa19c312c03e59da99/coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95", size = 211289 }, - { url = "https://files.pythonhosted.org/packages/53/40/53c7ffe3c0c3fff4d708bc99e65f3d78c129110d6629736faf2dbd60ad57/coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288", size = 212079 }, { url = "https://files.pythonhosted.org/packages/76/89/1adf3e634753c0de3dad2f02aac1e73dba58bc5a3a914ac94a25b2ef418f/coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1", size = 208673 }, { url = "https://files.pythonhosted.org/packages/ce/64/92a4e239d64d798535c5b45baac6b891c205a8a2e7c9cc8590ad386693dc/coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd", size = 208945 }, { url = "https://files.pythonhosted.org/packages/b4/d0/4596a3ef3bca20a94539c9b1e10fd250225d1dec57ea78b0867a1cf9742e/coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9", size = 242484 }, @@ -166,15 +107,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/8e/c14a79f535ce41af7d436bbad0d3d90c43d9e38ec409b4770c894031422e/coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9", size = 250627 }, { url = "https://files.pythonhosted.org/packages/cb/79/b7cee656cfb17a7f2c1b9c3cee03dd5d8000ca299ad4038ba64b61a9b044/coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3", size = 212033 }, { url = "https://files.pythonhosted.org/packages/b6/c3/f7aaa3813f1fa9a4228175a7bd368199659d392897e184435a3b66408dd3/coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f", size = 213240 }, - { url = "https://files.pythonhosted.org/packages/7a/7f/05818c62c7afe75df11e0233bd670948d68b36cdbf2a339a095bc02624a8/coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf", size = 200558 }, { url = "https://files.pythonhosted.org/packages/fb/b2/f655700e1024dec98b10ebaafd0cedbc25e40e4abe62a3c8e2ceef4f8f0a/coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953", size = 200552 }, ] -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, -] - [[package]] name = "databricks-bundles" version = "0.243.0.dev0" @@ -211,15 +146,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, ] -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, -] - [[package]] name = "idna" version = "3.10" @@ -265,36 +191,6 @@ version = "3.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, @@ -371,11 +267,9 @@ version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } wheels = [ @@ -387,7 +281,7 @@ name = "pytest-cov" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"] }, + { name = "coverage" }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } @@ -465,7 +359,6 @@ dependencies = [ { name = "sphinxcontrib-jsmath" }, { name = "sphinxcontrib-qthelp" }, { name = "sphinxcontrib-serializinghtml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/a7/3cc3d6dcad70aba2e32a3ae8de5a90026a0a2fdaaa0756925e3a120249b6/sphinx-8.0.2.tar.gz", hash = "sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b", size = 8189041 } wheels = [ @@ -526,45 +419,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, ] -[[package]] -name = "tomli" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, -] - [[package]] name = "typing-extensions" version = "4.12.2" From d4a64b7bdbb208eba96a03055dcd44a2a9ec9957 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Wed, 9 Apr 2025 16:58:13 +0200 Subject: [PATCH 03/11] Fix build --- experimental/python/pyproject.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/experimental/python/pyproject.toml b/experimental/python/pyproject.toml index a03fa4544d..827f34cfe9 100644 --- a/experimental/python/pyproject.toml +++ b/experimental/python/pyproject.toml @@ -32,9 +32,6 @@ dev-dependencies = [ name = "databricks" packages = ["databricks"] -[tool.uv.workspace] -members = ["codegen"] - [tool.pytest.ini_options] addopts = "-ra -q -vv" testpaths = [ From 3d23a56a5ba2e601f3e3dfe636351c9a0b4558b4 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Wed, 9 Apr 2025 17:00:55 +0200 Subject: [PATCH 04/11] Fix uv.lock --- experimental/python/uv.lock | 181 +++++++++++++++++++++++++++++++----- 1 file changed, 158 insertions(+), 23 deletions(-) diff --git a/experimental/python/uv.lock b/experimental/python/uv.lock index 0d0d34edd6..b236ebd1d6 100644 --- a/experimental/python/uv.lock +++ b/experimental/python/uv.lock @@ -1,12 +1,6 @@ version = 1 revision = 1 -requires-python = "==3.13.*" - -[manifest] -members = [ - "codegen", - "databricks-bundles", -] +requires-python = ">=3.10" [[package]] name = "alabaster" @@ -41,6 +35,45 @@ version = "3.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, + { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, + { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, + { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, + { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, + { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, + { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, + { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, + { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, + { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, + { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, + { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, + { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, @@ -57,21 +90,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, ] -[[package]] -name = "codegen" -version = "0.1.0" -source = { virtual = "codegen" } - -[package.dev-dependencies] -dev = [ - { name = "pytest" }, -] - -[package.metadata] - -[package.metadata.requires-dev] -dev = [{ name = "pytest", specifier = "==8.3.3" }] - [[package]] name = "colorama" version = "0.4.6" @@ -87,6 +105,36 @@ version = "7.6.12" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0c/d6/2b53ab3ee99f2262e6f0b8369a43f6d66658eab45510331c0b3d5c8c4272/coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2", size = 805941 } wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/67/81dc41ec8f548c365d04a29f1afd492d3176b372c33e47fa2a45a01dc13a/coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8", size = 208345 }, + { url = "https://files.pythonhosted.org/packages/33/43/17f71676016c8829bde69e24c852fef6bd9ed39f774a245d9ec98f689fa0/coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879", size = 208775 }, + { url = "https://files.pythonhosted.org/packages/86/25/c6ff0775f8960e8c0840845b723eed978d22a3cd9babd2b996e4a7c502c6/coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe", size = 237925 }, + { url = "https://files.pythonhosted.org/packages/b0/3d/5f5bd37046243cb9d15fff2c69e498c2f4fe4f9b42a96018d4579ed3506f/coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674", size = 235835 }, + { url = "https://files.pythonhosted.org/packages/b5/f1/9e6b75531fe33490b910d251b0bf709142e73a40e4e38a3899e6986fe088/coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb", size = 236966 }, + { url = "https://files.pythonhosted.org/packages/4f/bc/aef5a98f9133851bd1aacf130e754063719345d2fb776a117d5a8d516971/coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c", size = 236080 }, + { url = "https://files.pythonhosted.org/packages/eb/d0/56b4ab77f9b12aea4d4c11dc11cdcaa7c29130b837eb610639cf3400c9c3/coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c", size = 234393 }, + { url = "https://files.pythonhosted.org/packages/0d/77/28ef95c5d23fe3dd191a0b7d89c82fea2c2d904aef9315daf7c890e96557/coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e", size = 235536 }, + { url = "https://files.pythonhosted.org/packages/29/62/18791d3632ee3ff3f95bc8599115707d05229c72db9539f208bb878a3d88/coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425", size = 211063 }, + { url = "https://files.pythonhosted.org/packages/fc/57/b3878006cedfd573c963e5c751b8587154eb10a61cc0f47a84f85c88a355/coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa", size = 211955 }, + { url = "https://files.pythonhosted.org/packages/64/2d/da78abbfff98468c91fd63a73cccdfa0e99051676ded8dd36123e3a2d4d5/coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015", size = 208464 }, + { url = "https://files.pythonhosted.org/packages/31/f2/c269f46c470bdabe83a69e860c80a82e5e76840e9f4bbd7f38f8cebbee2f/coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45", size = 208893 }, + { url = "https://files.pythonhosted.org/packages/47/63/5682bf14d2ce20819998a49c0deadb81e608a59eed64d6bc2191bc8046b9/coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702", size = 241545 }, + { url = "https://files.pythonhosted.org/packages/6a/b6/6b6631f1172d437e11067e1c2edfdb7238b65dff965a12bce3b6d1bf2be2/coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0", size = 239230 }, + { url = "https://files.pythonhosted.org/packages/c7/01/9cd06cbb1be53e837e16f1b4309f6357e2dfcbdab0dd7cd3b1a50589e4e1/coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f", size = 241013 }, + { url = "https://files.pythonhosted.org/packages/4b/26/56afefc03c30871326e3d99709a70d327ac1f33da383cba108c79bd71563/coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f", size = 239750 }, + { url = "https://files.pythonhosted.org/packages/dd/ea/88a1ff951ed288f56aa561558ebe380107cf9132facd0b50bced63ba7238/coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d", size = 238462 }, + { url = "https://files.pythonhosted.org/packages/6e/d4/1d9404566f553728889409eff82151d515fbb46dc92cbd13b5337fa0de8c/coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba", size = 239307 }, + { url = "https://files.pythonhosted.org/packages/12/c1/e453d3b794cde1e232ee8ac1d194fde8e2ba329c18bbf1b93f6f5eef606b/coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f", size = 211117 }, + { url = "https://files.pythonhosted.org/packages/d5/db/829185120c1686fa297294f8fcd23e0422f71070bf85ef1cc1a72ecb2930/coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558", size = 212019 }, + { url = "https://files.pythonhosted.org/packages/e2/7f/4af2ed1d06ce6bee7eafc03b2ef748b14132b0bdae04388e451e4b2c529b/coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad", size = 208645 }, + { url = "https://files.pythonhosted.org/packages/dc/60/d19df912989117caa95123524d26fc973f56dc14aecdec5ccd7d0084e131/coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3", size = 208898 }, + { url = "https://files.pythonhosted.org/packages/bd/10/fecabcf438ba676f706bf90186ccf6ff9f6158cc494286965c76e58742fa/coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574", size = 242987 }, + { url = "https://files.pythonhosted.org/packages/4c/53/4e208440389e8ea936f5f2b0762dcd4cb03281a7722def8e2bf9dc9c3d68/coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985", size = 239881 }, + { url = "https://files.pythonhosted.org/packages/c4/47/2ba744af8d2f0caa1f17e7746147e34dfc5f811fb65fc153153722d58835/coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750", size = 242142 }, + { url = "https://files.pythonhosted.org/packages/e9/90/df726af8ee74d92ee7e3bf113bf101ea4315d71508952bd21abc3fae471e/coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea", size = 241437 }, + { url = "https://files.pythonhosted.org/packages/f6/af/995263fd04ae5f9cf12521150295bf03b6ba940d0aea97953bb4a6db3e2b/coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3", size = 239724 }, + { url = "https://files.pythonhosted.org/packages/1c/8e/5bb04f0318805e190984c6ce106b4c3968a9562a400180e549855d8211bd/coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a", size = 241329 }, + { url = "https://files.pythonhosted.org/packages/9e/9d/fa04d9e6c3f6459f4e0b231925277cfc33d72dfab7fa19c312c03e59da99/coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95", size = 211289 }, + { url = "https://files.pythonhosted.org/packages/53/40/53c7ffe3c0c3fff4d708bc99e65f3d78c129110d6629736faf2dbd60ad57/coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288", size = 212079 }, { url = "https://files.pythonhosted.org/packages/76/89/1adf3e634753c0de3dad2f02aac1e73dba58bc5a3a914ac94a25b2ef418f/coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1", size = 208673 }, { url = "https://files.pythonhosted.org/packages/ce/64/92a4e239d64d798535c5b45baac6b891c205a8a2e7c9cc8590ad386693dc/coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd", size = 208945 }, { url = "https://files.pythonhosted.org/packages/b4/d0/4596a3ef3bca20a94539c9b1e10fd250225d1dec57ea78b0867a1cf9742e/coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9", size = 242484 }, @@ -107,9 +155,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/8e/c14a79f535ce41af7d436bbad0d3d90c43d9e38ec409b4770c894031422e/coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9", size = 250627 }, { url = "https://files.pythonhosted.org/packages/cb/79/b7cee656cfb17a7f2c1b9c3cee03dd5d8000ca299ad4038ba64b61a9b044/coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3", size = 212033 }, { url = "https://files.pythonhosted.org/packages/b6/c3/f7aaa3813f1fa9a4228175a7bd368199659d392897e184435a3b66408dd3/coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f", size = 213240 }, + { url = "https://files.pythonhosted.org/packages/7a/7f/05818c62c7afe75df11e0233bd670948d68b36cdbf2a339a095bc02624a8/coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf", size = 200558 }, { url = "https://files.pythonhosted.org/packages/fb/b2/f655700e1024dec98b10ebaafd0cedbc25e40e4abe62a3c8e2ceef4f8f0a/coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953", size = 200552 }, ] +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + [[package]] name = "databricks-bundles" version = "0.243.0.dev0" @@ -146,6 +200,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, ] +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + [[package]] name = "idna" version = "3.10" @@ -191,6 +254,36 @@ version = "3.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, @@ -267,9 +360,11 @@ version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } wheels = [ @@ -281,7 +376,7 @@ name = "pytest-cov" version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage" }, + { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } @@ -359,6 +454,7 @@ dependencies = [ { name = "sphinxcontrib-jsmath" }, { name = "sphinxcontrib-qthelp" }, { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/a7/3cc3d6dcad70aba2e32a3ae8de5a90026a0a2fdaaa0756925e3a120249b6/sphinx-8.0.2.tar.gz", hash = "sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b", size = 8189041 } wheels = [ @@ -419,6 +515,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, ] +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, +] + [[package]] name = "typing-extensions" version = "4.12.2" From 81be56b0fe1e4e9b894caa91551432abe89cc906 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Wed, 9 Apr 2025 17:03:40 +0200 Subject: [PATCH 05/11] Fix CI --- experimental/python/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/python/pyproject.toml b/experimental/python/pyproject.toml index 827f34cfe9..c3d9c14199 100644 --- a/experimental/python/pyproject.toml +++ b/experimental/python/pyproject.toml @@ -42,6 +42,7 @@ testpaths = [ exclude = [ "**/__pycache__", ".venv", + "codegen", "docs", ] From 4328e3e59fc66eed6b0b3708a7516739681b4dda Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Wed, 9 Apr 2025 17:09:19 +0200 Subject: [PATCH 06/11] Install uv --- .github/workflows/push.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index cef89514a7..3eeafb81aa 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -177,6 +177,11 @@ jobs: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Install uv + uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182 # v5.4.1 + with: + version: "0.6.5" + - name: Verify that python/codegen is up to date working-directory: experimental/python run: | From e92c9321b5027a630bae438dbfde8ddb2d173e55 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Wed, 9 Apr 2025 17:12:18 +0200 Subject: [PATCH 07/11] Fix diff --- experimental/python/codegen/codegen/packages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/python/codegen/codegen/packages.py b/experimental/python/codegen/codegen/packages.py index 333c6ecd8a..782b66ba6a 100644 --- a/experimental/python/codegen/codegen/packages.py +++ b/experimental/python/codegen/codegen/packages.py @@ -5,7 +5,7 @@ "resources.Job": "jobs", "resources.Pipeline": "pipelines", "resources.JobPermission": "jobs", - "resources.PipelinePermission": "jobs", + "resources.PipelinePermission": "pipelines", } # All supported resource types From 545adeb8d8ea28bd4d04ee7b4f1b9d3d8f04d758 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Thu, 10 Apr 2025 15:12:44 +0200 Subject: [PATCH 08/11] Fix codegen --- .../codegen/codegen/generated_dataclass.py | 2 +- .../python/codegen/codegen/generated_enum.py | 2 +- .../codegen/codegen/jsonschema_patch.py | 2 +- experimental/python/codegen/codegen/main.py | 4 +- .../codegen_tests/test_generated_dataclass.py | 2 +- .../codegen_tests/test_generated_enum.py | 2 +- .../{test_openapi.py => test_jsonschema.py} | 2 +- experimental/python/codegen/uv.lock | 69 +++++++++++++++++++ 8 files changed, 77 insertions(+), 8 deletions(-) rename experimental/python/codegen/codegen_tests/{test_openapi.py => test_jsonschema.py} (98%) create mode 100644 experimental/python/codegen/uv.lock diff --git a/experimental/python/codegen/codegen/generated_dataclass.py b/experimental/python/codegen/codegen/generated_dataclass.py index 2d9e948cee..c28b658c90 100644 --- a/experimental/python/codegen/codegen/generated_dataclass.py +++ b/experimental/python/codegen/codegen/generated_dataclass.py @@ -6,7 +6,7 @@ import codegen.packages as packages from codegen.code_builder import CodeBuilder -from codegen.openapi import Property, Schema +from codegen.jsonschema import Property, Schema from codegen.packages import is_resource diff --git a/experimental/python/codegen/codegen/generated_enum.py b/experimental/python/codegen/codegen/generated_enum.py index 0e367d4b06..0ea33aa898 100644 --- a/experimental/python/codegen/codegen/generated_enum.py +++ b/experimental/python/codegen/codegen/generated_enum.py @@ -5,7 +5,7 @@ import codegen.packages as packages from codegen.code_builder import CodeBuilder from codegen.generated_dataclass import _append_description -from codegen.openapi import Schema +from codegen.jsonschema import Schema @dataclass(kw_only=True) diff --git a/experimental/python/codegen/codegen/jsonschema_patch.py b/experimental/python/codegen/codegen/jsonschema_patch.py index 4b2c3862d8..1f0dfdf944 100644 --- a/experimental/python/codegen/codegen/jsonschema_patch.py +++ b/experimental/python/codegen/codegen/jsonschema_patch.py @@ -1,6 +1,6 @@ from dataclasses import replace -from codegen.openapi import Schema +from codegen.jsonschema import Schema REMOVED_FIELDS = { "jobs.RunJobTask": { diff --git a/experimental/python/codegen/codegen/main.py b/experimental/python/codegen/codegen/main.py index 7c99b62a6c..735309ff4c 100644 --- a/experimental/python/codegen/codegen/main.py +++ b/experimental/python/codegen/codegen/main.py @@ -6,8 +6,8 @@ import codegen.generated_dataclass_patch as generated_dataclass_patch import codegen.generated_enum as generated_enum import codegen.generated_imports as generated_imports -import codegen.openapi as openapi -import codegen.openapi_patch as openapi_patch +import codegen.jsonschema as openapi +import codegen.jsonschema_patch as openapi_patch import codegen.packages as packages from codegen.code_builder import CodeBuilder diff --git a/experimental/python/codegen/codegen_tests/test_generated_dataclass.py b/experimental/python/codegen/codegen_tests/test_generated_dataclass.py index bd3720fec8..bddc5e4b51 100644 --- a/experimental/python/codegen/codegen_tests/test_generated_dataclass.py +++ b/experimental/python/codegen/codegen_tests/test_generated_dataclass.py @@ -9,7 +9,7 @@ str_type, variable_or_type, ) -from codegen.openapi import Property, Schema, SchemaType +from codegen.jsonschema import Property, Schema, SchemaType def test_generate_type_string(): diff --git a/experimental/python/codegen/codegen_tests/test_generated_enum.py b/experimental/python/codegen/codegen_tests/test_generated_enum.py index 003bf3e6fe..8340e456e0 100644 --- a/experimental/python/codegen/codegen_tests/test_generated_enum.py +++ b/experimental/python/codegen/codegen_tests/test_generated_enum.py @@ -1,5 +1,5 @@ from codegen.generated_enum import GeneratedEnum, generate_enum -from codegen.openapi import Schema, SchemaType +from codegen.jsonschema import Schema, SchemaType def test_generate_enum(): diff --git a/experimental/python/codegen/codegen_tests/test_openapi.py b/experimental/python/codegen/codegen_tests/test_jsonschema.py similarity index 98% rename from experimental/python/codegen/codegen_tests/test_openapi.py rename to experimental/python/codegen/codegen_tests/test_jsonschema.py index 13f037089e..307bcc1dec 100644 --- a/experimental/python/codegen/codegen_tests/test_openapi.py +++ b/experimental/python/codegen/codegen_tests/test_jsonschema.py @@ -1,4 +1,4 @@ -from codegen.openapi import ( +from codegen.jsonschema import ( Property, Schema, SchemaType, diff --git a/experimental/python/codegen/uv.lock b/experimental/python/codegen/uv.lock new file mode 100644 index 0000000000..c516736860 --- /dev/null +++ b/experimental/python/codegen/uv.lock @@ -0,0 +1,69 @@ +version = 1 +revision = 1 +requires-python = "==3.13.*" + +[[package]] +name = "codegen" +version = "0.1.0" +source = { virtual = "." } + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [{ name = "pytest", specifier = "==8.3.3" }] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "pytest" +version = "8.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, +] From 479ed4f95dfe84f51de24299a1c87a2ccd0f24b6 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Thu, 10 Apr 2025 15:13:45 +0200 Subject: [PATCH 09/11] Fix codegen --- experimental/python/codegen/codegen/packages.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/experimental/python/codegen/codegen/packages.py b/experimental/python/codegen/codegen/packages.py index 782b66ba6a..b81e9cad4d 100644 --- a/experimental/python/codegen/codegen/packages.py +++ b/experimental/python/codegen/codegen/packages.py @@ -5,7 +5,9 @@ "resources.Job": "jobs", "resources.Pipeline": "pipelines", "resources.JobPermission": "jobs", + "resources.JobPermissionLevel": "jobs", "resources.PipelinePermission": "pipelines", + "resources.PipelinePermissionLevel": "pipelines", } # All supported resource types From 670b8d9da179e74d3013ed457587f94b84fb1fad Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Thu, 10 Apr 2025 15:22:49 +0200 Subject: [PATCH 10/11] Remove one-of generation --- .../codegen/codegen/generated_dataclass.py | 69 +------------------ .../codegen_tests/test_generated_dataclass.py | 1 - 2 files changed, 3 insertions(+), 67 deletions(-) diff --git a/experimental/python/codegen/codegen/generated_dataclass.py b/experimental/python/codegen/codegen/generated_dataclass.py index c28b658c90..37c81a75a2 100644 --- a/experimental/python/codegen/codegen/generated_dataclass.py +++ b/experimental/python/codegen/codegen/generated_dataclass.py @@ -101,18 +101,6 @@ def __post_init__(self): raise ValueError("Can't have both default and default_factory", self) -@dataclass -class GeneratedOneOf: - """ - GeneratedOneOf is a one-of constraint for GeneratedDataclass. - - Example: in jobs.JobRunAs one of the user_name or service_principal_name must be specified. - """ - - fields: list[str] - required: bool - - @dataclass class GeneratedDataclass: """ @@ -136,7 +124,6 @@ class GeneratedDataclass: fields: list[GeneratedField] extends: list[GeneratedType] - one_ofs: list[GeneratedOneOf] def generate_field( @@ -321,7 +308,6 @@ def generate_dataclass(schema_name: str, schema: Schema) -> GeneratedDataclass: description=schema.description, fields=fields, extends=extends, - one_ofs=[], ) @@ -333,13 +319,10 @@ def _get_type_code(generated: GeneratedType, quote: bool = True) -> str: return f"{generated.name}[{parameters}]" else: - if generated.name[0].islower(): - return generated.name + if quote: + return '"' + generated.name + '"' else: - if quote: - return '"' + generated.name + '"' - else: - return generated.name + return generated.name def _append_dataclass(b: CodeBuilder, generated: GeneratedDataclass): @@ -391,46 +374,6 @@ def _append_field(b: CodeBuilder, field: GeneratedField): b.newline() -def _append_oneof_check( - b: CodeBuilder, - generated: GeneratedDataclass, - one_of: GeneratedOneOf, -): - # Example: - # - # union_fields = [ - # self.foo, - # self.bar, - # ] - # - # if sum(f is not None for f in union_fields) != 1: - # raise ValueError("Only one of 'foo', 'bar' can be specified in Job") - - condition = ( - "if sum(f is not None for f in union_fields) != 1:" - if one_of.required - else "if sum(f is not None for f in union_fields) > 1:" - ) - fields_str = "'" + "', '".join(one_of.fields) + "'" - error_message = ( - f"{generated.class_name} must specify exactly one of {fields_str}" - if one_of.required - else f"Only one of {fields_str} can be specified in {generated.class_name}" - ) - - b.indent().indent().append("union_fields = [").newline() - for field in one_of.fields: - b.indent().indent().indent().append(f"self.{field},").newline() - b.indent().indent().append("]").newline() - b.newline() - - b.indent().indent().append(condition).newline() - b.indent().indent().indent().append( - f'raise ValueError("{error_message}")' - ).newline() - b.newline() - - def _append_from_dict(b: CodeBuilder, generated: GeneratedDataclass): # Example: # @@ -510,12 +453,6 @@ def get_code(generated: GeneratedDataclass) -> str: b.newline() - if generated.one_ofs: - b.indent().append("def __post_init__(self):").newline() - - for one_of in generated.one_ofs: - _append_oneof_check(b, generated, one_of) - _append_from_dict(b, generated) _append_as_dict(b, generated) diff --git a/experimental/python/codegen/codegen_tests/test_generated_dataclass.py b/experimental/python/codegen/codegen_tests/test_generated_dataclass.py index bddc5e4b51..aa9a9b1a33 100644 --- a/experimental/python/codegen/codegen_tests/test_generated_dataclass.py +++ b/experimental/python/codegen/codegen_tests/test_generated_dataclass.py @@ -55,7 +55,6 @@ def test_generate_dataclass(): package="databricks.bundles.jobs._models.task", description="task description", extends=[], - one_ofs=[], fields=[ GeneratedField( create_func_default=None, From 1a6449e2ff3b79911554a1cb6479e3d97e61c7c5 Mon Sep 17 00:00:00 2001 From: Gleb Kanterov Date: Thu, 10 Apr 2025 15:23:47 +0200 Subject: [PATCH 11/11] Fix workflow --- .github/workflows/push.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 3eeafb81aa..02fe69380d 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -185,7 +185,9 @@ jobs: - name: Verify that python/codegen is up to date working-directory: experimental/python run: | - if ! ( make codegen && git diff --exit-code ); then + make codegen + + if ! ( git diff --exit-code ); then echo "Generated Python code is not up-to-date. Please run 'pushd experimental/python && make codegen' and commit the changes." # TODO block PR if this fails once diffs are fixed