diff --git a/.github/workflows/build-image-pr.yml b/.github/workflows/build-image-pr.yml index 47ba7fc633..2e47f22048 100644 --- a/.github/workflows/build-image-pr.yml +++ b/.github/workflows/build-image-pr.yml @@ -41,7 +41,6 @@ jobs: - name: Remove AppArmor profile for mysql in KinD on GHA # https://github.com/kubeflow/manifests/issues/2507 run: | set -x - sudo apt-get install apparmor-profiles sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld - name: Load Local Registry Test Image env: diff --git a/.github/workflows/csi-test.yml b/.github/workflows/csi-test.yml index 5f434ccd1f..6e097c0b0f 100644 --- a/.github/workflows/csi-test.yml +++ b/.github/workflows/csi-test.yml @@ -68,7 +68,6 @@ jobs: - name: Remove AppArmor profile for mysql in KinD on GHA # https://github.com/kubeflow/manifests/issues/2507 run: | set -x - sudo apt-get install apparmor-profiles sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld - name: Install kustomize diff --git a/.github/workflows/first-time-contributor-pr.yml b/.github/workflows/first-time-contributor-pr.yml new file mode 100644 index 0000000000..c7d2cef3b5 --- /dev/null +++ b/.github/workflows/first-time-contributor-pr.yml @@ -0,0 +1,44 @@ +name: Welcome first-time contributors (Beta) +on: + pull_request_target: + types: + - opened +permissions: + issues: write + pull-requests: read + +# do NOT: add actions/checkout to this flow, add-third party scripts, or auto-trigger CI jobs +# goal: this is meant to remind maintainers/approvers to add labels to ensure all tests are executed before merging +# and avoid merging without realizing that required tests has not been run; complementary to bulletpoint in template: https://github.com/kubeflow/model-registry/blame/de5f225d96a4daeca77506d233082b1c4ea5afa3/.github/pull_request_template.md#L21 +jobs: + welcome: + runs-on: ubuntu-latest + steps: + - name: Check contributor status + uses: actions/github-script@v7 + with: + script: | + const { data: pr } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number + }); + const isFirstTimeContributor = pr.user.contributions === 0; + console.log(`First-time contributor status: ${isFirstTimeContributor}`); + return { isFirstTimeContributor }; + + - name: Log contributor status + run: echo "First-time contributor status is ${{ steps.check_author.outputs.isFirstTimeContributor }}" + + # - name: Add a comment to the PR if first time contributor + # if: steps.check_author.outputs.isFirstTimeContributor == 'true' + # uses: actions/github-script@v7 + # with: + # script: | + # github.rest.issues.createComment({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # body: "Maintainers: let's ensure the label `ok-to-test` has been maintained and all the tests have been executed before merging.

Thank you for your first Pull Request! 🎉🎉" + # }) +# do NOT: add actions/checkout to this flow, add-third party scripts, or auto-trigger CI jobs diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 12f4473a73..25d437dc36 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -197,7 +197,6 @@ jobs: - name: Remove AppArmor profile for mysql in KinD on GHA # https://github.com/kubeflow/manifests/issues/2507 run: | set -x - sudo apt-get install apparmor-profiles sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld - name: Load Local Registry Test Image env: diff --git a/.github/workflows/ui-bff-build.yml b/.github/workflows/ui-bff-build.yml index 82fb45ccdf..786e019d60 100644 --- a/.github/workflows/ui-bff-build.yml +++ b/.github/workflows/ui-bff-build.yml @@ -9,7 +9,7 @@ on: - "!DOCKERFILE*" - "!**.gitignore" - "!**.md" - + pull_request: paths: - "clients/ui/**" @@ -27,16 +27,16 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.23.5" + go-version: "1.24.3" - name: Clean working-directory: clients/ui/bff run: make clean - name: Lint - uses: golangci/golangci-lint-action@v7 + uses: golangci/golangci-lint-action@v8 with: - version: v2.0.2 + version: v2.1.0 working-directory: clients/ui/bff/ - name: Build diff --git a/ADOPTERS.md b/ADOPTERS.md index 258d9cec6d..1820e9bbbf 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -2,6 +2,11 @@ Below are the adopters of the Model Registry project. If you are using Model Registry, please add your name to the list by submitting a pull request: this will help foster the Kubeflow community. Kindly ensure the list remains in alphabetical order. -| Organization | Contact (GitHub User Name) | Environment | Description of Use | -| ------------- | ------------- | ------------- | ------------- | -| | | Production/Testing/Experimenting/etc | | +| Organization | Contact (GitHub User Name) | Environment | Description of Use | +|-------------------------------|--------------------------------------------|--------------------------------------------|-----------------------------------------------------------------------| +| [Pepsico](https://www.pepsico.com/) | [@milosjava](https://github.com/milosjava) | Experimenting | Evaluating a transition from Azure Model Registry to Kubeflow Model Registry | +| [Red Hat](https://www.redhat.com) | [@rareddy](https://github.com/rareddy)| Production | Kubeflow Model Registry is part of [OpenShift AI](https://www.redhat.com/en/products/ai/openshift-ai) | +| [INFN (National Institute for Nuclear Physics)](https://www.infn.it/en/) | [@mginfn](https://github.com/mginfn) | Experimenting | Building a platform for running ML workflows | +| [YIQISOFT](https://www.yiqisoft.com) | [@jiekechoo](https://github.com/jiekechoo) | Production | Model Registry is part of [YiAI](https://www.yiqisoft.cn/products/)| +| [VMware](https://www.vmware.com) | [@tiansiyuan](https://github.com/tiansiyuan) | Testing | Model Registry is important for LLMs | +| < company name here> | < your github handle here > | | | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7fd47cc204..d86b995968 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,20 +1,26 @@ # Kubeflow Contributor Guide -Welcome to the Kubeflow project! We'd love to accept your patches and +Welcome to the Kubeflow Model Registry project! We'd love to accept your patches and contributions to this project. Please read the [contributor's guide in our docs](https://www.kubeflow.org/docs/about/contributing/). -The contributor's guide +The contributor's guide: -* shows you where to find the Contributor License Agreement (CLA) that you need - to sign, -* helps you get started with your first contribution to Kubeflow, -* and describes the pull request and review workflow in detail, including the - OWNERS files and automated workflow tool. +* explains how to use the Developer Certificate of Origin (DCO) with git commit system + * like explained in [this guide](https://wiki.linuxfoundation.org/dco), or [this example](https://github.com/kubeflow/community/tree/master/dco-signoff-hook#signing-off-commits) +* references the [Code of Conduct](https://www.kubeflow.org/docs/about/contributing/#follow-the-code-of-conduct) +* helps you get started with your first contribution to Kubeflow + * like how to identify [good-first-issue](https://github.com/kubeflow/model-registry/labels/good%20first%20issue) tickets +* and [describes](https://www.kubeflow.org/docs/about/contributing/#owners-files-and-pr-workflow) the pull request and review workflow in detail, including the + OWNERS files and automated workflow tool + +The [Kubeflow Community calendar](https://www.kubeflow.org/docs/about/community/#kubeflow-community-calendar) provides an overview of the community calls and specifically the bi-weekly Kubeflow Model Registry meeting.
-This document focus on technical aspects while contributing to the Model Registry project +The remainder of this document focuses on technical aspects while contributing to the Model Registry project specifically. + +The [Model Registry documentation](https://github.com/kubeflow/model-registry?tab=readme-ov-file#documentation-links) provides details about: what is a Model Registry, how to Install, logical model Concepts, how the MR python client works, Tutorials, FAQs and most importantly the [Technical References](https://github.com/kubeflow/model-registry?tab=readme-ov-file#documentation-links:~:text=FAQs-,Development,-introduction%20to%20local)! # Contributing to Model Registry using Apple-silicon/ARM-based computers diff --git a/OWNERS b/OWNERS index a876d871e9..9731231e6e 100644 --- a/OWNERS +++ b/OWNERS @@ -1,6 +1,7 @@ approvers: - andreyvelich - ckadner + - ederign - tarilabs - rareddy - Tomcli diff --git a/README.md b/README.md index 300defb0c0..364e19cbbd 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Model registry provides a central repository for model developers to store and m 1. Introduction - [What is Kubeflow Model Registry](https://www.kubeflow.org/docs/components/model-registry/overview/) - [Blog KF 1.9 introducing Model Registry](https://blog.kubeflow.org/kubeflow-1.9-release/#model-registry) + - [Blog KF 1.10 introducing UI for Model Registry, CSI, and other features](https://blog.kubeflow.org/kubeflow-1.10-release/#model-registry) 2. Installation - [installing Model Registry standalone](https://www.kubeflow.org/docs/components/model-registry/installation/#standalone-installation) - [installing Model Registry with Kubeflow manifests](https://github.com/kubeflow/manifests/tree/master/apps/model-registry/upstream#readme) diff --git a/RELEASE.md b/RELEASE.md index e39f95f4c3..223cfc8459 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -17,10 +17,10 @@ The Kubeflow Model Registry per governance of the Kubeflow Community, Kubeflow P The Release of the Kubeflow Model Registry provides: - a container image for the Backend; known as the "KF MR Go REST server" -- a Python client to be used in Jupyter notebook, programmatically, or that can be integrated in the Kubeflow SDK; known as the "MR py client" +- a Python client to be used in a Jupyter notebook, programmatically, or that can be integrated in the Kubeflow SDK; known as the "MR py client" - an optional Model Registry Custom Storage Initializer container image for KServe; the "Model Registry CSI" -- a collection of Kubernetes Manifest, which get synchronized to the `kubeflow/manifests` repository -- an update the the Kubeflow website +- a collection of Kubernetes Manifests, which get synchronized to the `kubeflow/manifests` repository +- an update to the Kubeflow website # Instructions diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000000..3ec3cb9025 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,23 @@ +# Kubeflow Model Registry Roadmap + +## Overview + +The Kubeflow Model Registry project roadmap is tracked using [GitHub Milestones](https://github.com/kubeflow/model-registry/milestones), following the Kubeflow Release Team's request: this approach has been recommended in order to maintain a detailed view of all the items intended for upcoming Kubeflow releases, organized by "themes". The roadmap is continuously updated as we make progress towards a Kubeflow Release. + +## Current Roadmap + +The current roadmap and upcoming features are tracked in our [GitHub Milestones](https://github.com/kubeflow/model-registry/milestones). Each milestone tracks specific or future Kubeflow release and contains the planned features, enhancements, and bug fixes. For each milestone, a GitHub Issue is typically attached serving as a Tracker record to provide additional details. + +## Past Roadmaps + +- Model Registry in Kubeflow 1.10 + - [Milestone](https://github.com/kubeflow/model-registry/milestone/1) + - [Tracker for details](https://github.com/kubeflow/model-registry/issues/175) +- Model Registry in Kubeflow 1.9 + - [Tracker for details](https://github.com/kubeflow/model-registry/issues/3) + +## See also + +For more information about contributing to this project including the roadmap, refer to our [CONTRIBUTING.md](./CONTRIBUTING.md) file. + +For more information about the release process, refer to our [RELEASE.md](./RELEASE.md) file. diff --git a/api/openapi/model-registry.yaml b/api/openapi/model-registry.yaml index 3aee7d1b32..8252176f5c 100644 --- a/api/openapi/model-registry.yaml +++ b/api/openapi/model-registry.yaml @@ -1188,73 +1188,68 @@ components: mapping: model-artifact: "#/components/schemas/ModelArtifactUpdate" doc-artifact: "#/components/schemas/DocArtifactUpdate" - BaseArtifact: - allOf: - - $ref: "#/components/schemas/BaseArtifactCreate" - - $ref: "#/components/schemas/BaseResource" - BaseArtifactCreate: - allOf: - - $ref: "#/components/schemas/BaseArtifactUpdate" - - $ref: "#/components/schemas/BaseResourceCreate" - BaseArtifactUpdate: - allOf: - - $ref: "#/components/schemas/BaseResourceUpdate" - - type: object - properties: - uri: - description: |- - The uniform resource identifier of the physical artifact. - May be empty if there is no physical artifact. - type: string - state: - $ref: "#/components/schemas/ArtifactState" - BaseExecution: - allOf: - - $ref: "#/components/schemas/BaseExecutionCreate" - - $ref: "#/components/schemas/BaseResource" - BaseExecutionCreate: - allOf: - - $ref: "#/components/schemas/BaseExecutionUpdate" - - $ref: "#/components/schemas/BaseResourceCreate" - BaseExecutionUpdate: - allOf: - - type: object - properties: - lastKnownState: - $ref: "#/components/schemas/ExecutionState" - - $ref: "#/components/schemas/BaseResourceUpdate" BaseResource: - allOf: - - $ref: "#/components/schemas/BaseResourceCreate" - - type: object - properties: - id: - format: int64 - description: The unique server generated id of the resource. - type: string - createTimeSinceEpoch: - format: int64 - description: Output only. Create time of the resource in millisecond since epoch. - type: string - readOnly: true - lastUpdateTimeSinceEpoch: - format: int64 - description: |- - Output only. Last update time of the resource since epoch in millisecond - since epoch. - type: string - readOnly: true + type: object + properties: + customProperties: + description: User provided custom properties which are not defined by its type. + type: object + additionalProperties: + $ref: "#/components/schemas/MetadataValue" + description: + description: |- + An optional description about the resource. + type: string + externalId: + description: |- + The external id that come from the clients’ system. This field is optional. + If set, it must be unique among all resources within a database instance. + type: string + name: + description: |- + The client provided name of the artifact. This field is optional. If set, + it must be unique among all the artifacts of the same artifact type within + a database instance and cannot be changed once set. + type: string + id: + format: int64 + description: The unique server generated id of the resource. + type: string + createTimeSinceEpoch: + format: int64 + description: Output only. Create time of the resource in millisecond since epoch. + type: string + readOnly: true + lastUpdateTimeSinceEpoch: + format: int64 + description: |- + Output only. Last update time of the resource since epoch in millisecond + since epoch. + type: string + readOnly: true BaseResourceCreate: - allOf: - - $ref: "#/components/schemas/BaseResourceUpdate" - - type: object - properties: - name: - description: |- - The client provided name of the artifact. This field is optional. If set, - it must be unique among all the artifacts of the same artifact type within - a database instance and cannot be changed once set. - type: string + type: object + properties: + customProperties: + description: User provided custom properties which are not defined by its type. + type: object + additionalProperties: + $ref: "#/components/schemas/MetadataValue" + description: + description: |- + An optional description about the resource. + type: string + externalId: + description: |- + The external id that come from the clients’ system. This field is optional. + If set, it must be unique among all resources within a database instance. + type: string + name: + description: |- + The client provided name of the artifact. This field is optional. If set, + it must be unique among all the artifacts of the same artifact type within + a database instance and cannot be changed once set. + type: string BaseResourceList: required: - nextPageToken @@ -1293,7 +1288,7 @@ components: DocArtifact: description: A document. allOf: - - $ref: "#/components/schemas/BaseArtifact" + - $ref: "#/components/schemas/BaseResource" - $ref: "#/components/schemas/DocArtifactCreate" - type: object properties: @@ -1303,7 +1298,7 @@ components: DocArtifactCreate: description: A document artifact to be created. allOf: - - $ref: "#/components/schemas/BaseArtifactCreate" + - $ref: "#/components/schemas/BaseResourceCreate" - $ref: "#/components/schemas/DocArtifactUpdate" - type: object properties: @@ -1313,12 +1308,19 @@ components: DocArtifactUpdate: description: A document artifact to be updated. allOf: - - $ref: "#/components/schemas/BaseArtifactUpdate" + - $ref: "#/components/schemas/BaseResourceUpdate" - type: object properties: artifactType: type: string default: "doc-artifact" + uri: + description: |- + The uniform resource identifier of the physical artifact. + May be empty if there is no physical artifact. + type: string + state: + $ref: "#/components/schemas/ArtifactState" Error: description: Error code and message. required: @@ -1527,7 +1529,7 @@ components: ModelArtifact: description: An ML model artifact. allOf: - - $ref: "#/components/schemas/BaseArtifact" + - $ref: "#/components/schemas/BaseResource" - $ref: "#/components/schemas/ModelArtifactCreate" - type: object properties: @@ -1541,7 +1543,7 @@ components: type: string default: "model-artifact" allOf: - - $ref: "#/components/schemas/BaseArtifactCreate" + - $ref: "#/components/schemas/BaseResourceCreate" - $ref: "#/components/schemas/ModelArtifactUpdate" ModelArtifactList: description: List of ModelArtifact entities. @@ -1559,7 +1561,7 @@ components: ModelArtifactUpdate: description: An ML model artifact to be updated. allOf: - - $ref: "#/components/schemas/BaseArtifactUpdate" + - $ref: "#/components/schemas/BaseResourceUpdate" - type: object properties: artifactType: @@ -1600,6 +1602,13 @@ components: modelSourceName: type: string description: "A human-readable name for the source model. \nE.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`." + uri: + description: |- + The uniform resource identifier of the physical artifact. + May be empty if there is no physical artifact. + type: string + state: + $ref: "#/components/schemas/ArtifactState" ModelVersion: description: Represents a ModelVersion belonging to a RegisteredModel. allOf: @@ -1718,14 +1727,14 @@ components: ServeModel: description: An ML model serving action. allOf: - - $ref: "#/components/schemas/BaseExecution" + - $ref: "#/components/schemas/BaseResource" - $ref: "#/components/schemas/ServeModelCreate" ServeModelCreate: description: An ML model serving action. required: - modelVersionId allOf: - - $ref: "#/components/schemas/BaseExecutionCreate" + - $ref: "#/components/schemas/BaseResourceCreate" - $ref: "#/components/schemas/ServeModelUpdate" - type: object properties: @@ -1748,7 +1757,11 @@ components: ServeModelUpdate: description: An ML model serving action. allOf: - - $ref: "#/components/schemas/BaseExecutionUpdate" + - $ref: "#/components/schemas/BaseResourceUpdate" + - type: object + properties: + lastKnownState: + $ref: "#/components/schemas/ExecutionState" ServingEnvironment: description: A Model Serving environment for serving `RegisteredModels`. allOf: diff --git a/clients/python/README.md b/clients/python/README.md index 0c092b7b56..434e6cd583 100644 --- a/clients/python/README.md +++ b/clients/python/README.md @@ -188,6 +188,12 @@ By default, all queries will be `ascending`, but this method is also available f > Advanced usage note: You can also set the `page_size()` that you want the Pager to use when invoking the Model Registry backend. > When using it as an iterator, it will automatically manage pages for you. +#### Implementation notes + +The pager will manage pages for you in order to prevent infinite looping. +Currently, the Model Registry backend treats model lists as a circular buffer, and **will not end iteration** for you. + + ### Uploading local models to external storage and registering them To both upload and register a model, use the convenience method `upload_artifact_and_register_model`. @@ -201,12 +207,14 @@ In order to utilize this method you must instantiate an `upload_params` object w Common S3 env vars will be automatically read, such ass the access_key_id, etc. It can also be provided explicitly in the `S3Params` object if desired. ```python +from model_registry.utils import S3Params + s3_upload_params = S3Params( bucket_name="my-bucket", s3_prefix="models/my_fraud_model", ) -registered_model = client.upload_artifact_and_register_model( +registered_model = registry.upload_artifact_and_register_model( name="hello_world_model", model_files_path="/home/user-01/models/model_training_01", # If the model consists of a single file, such as a .onnx file, you can specify that as well @@ -243,12 +251,14 @@ First, you must ensure you are logged in the to appropriate OCI registry using Full example: ```python +from model_registry.utils import OCIParams + oci_upload_params = OCIParams( base_image="busybox", oci_ref="registry.example.com/acme_org/hello_world_model:0.0.1" ) -registered_model = client.upload_artifact_and_register_model( +registered_model = registry.upload_artifact_and_register_model( name="hello_world_model", model_files_path="/home/user-01/models/model_training_01", # If the model consists of a single file, such as a .onnx file, you can specify that as well @@ -296,11 +306,6 @@ oci_upload_params = OCIParams( ) ``` -#### Implementation notes - -The pager will manage pages for you in order to prevent infinite looping. -Currently, the Model Registry backend treats model lists as a circular buffer, and **will not end iteration** for you. - ### Running ModelRegistry on Ray or Uvloop When running `ModelRegistry` on a platform that sets a custom event loop that cannot be nested, an error will occur. @@ -357,6 +362,35 @@ Check out our [recommendations on setting up your docker engine](https://github. ### Troubleshooting -- On running `make test test-e2e` if you see a similar problem `unknown flag: --load`, install [buildx](https://formulae.brew.sh/formula/docker-buildx) +- On running `make test test-e2e` if you see a similar problem `unknown flag: --load`, install [buildx](https://formulae.brew.sh/formula/docker-buildx). You will then need to add `cliPluginsExtraDirs` to ~/.docker/config.json, like so: +``` +"cliPluginsExtraDirs": [ + "/opt/homebrew/lib/docker/cli-plugins" # depending on your system config, brew should give you the proper one + ] +``` +Before running make, ensure docker is running (`docker ps -a`). If it's not, assuming you're using `colima` on macos, run +`colima start`. + +- On running `make test-e2e` you might see an error similar to +``` +102.7 /workspace/bin/golangci-lint run cmd/... internal/... ./pkg/... --timeout 3m +124.6 make: *** [Makefile:243: lint] Killed +------ +Dockerfile:60 +-------------------- + 58 | + 59 | # prepare the build in a separate layer + 60 | >>> RUN make clean build/prepare + 61 | # compile separately to optimize multi-platform builds + 62 | RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} make build/compile +-------------------- +ERROR: failed to solve: process "/bin/sh -c make clean build/prepare" did not complete successfully: exit code: 2 +make[1]: *** [image/build] Error 1 +make: *** [deploy-latest-mr] Error 2 +``` +To solve it, you can try launching `colima` with these settings: +``` +colima start --cpu 6 --memory 16 --profile docker --arch aarch64 --vm-type=vz --vz-rosetta +``` diff --git a/clients/python/poetry.lock b/clients/python/poetry.lock index fc16a50378..4977e65255 100644 --- a/clients/python/poetry.lock +++ b/clients/python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -137,7 +137,7 @@ version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, @@ -217,6 +217,7 @@ files = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] +markers = {dev = "python_version < \"3.13\""} [package.extras] dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] @@ -310,19 +311,19 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.38.3" +version = "1.38.13" description = "The AWS SDK for Python" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"boto3\"" files = [ - {file = "boto3-1.38.3-py3-none-any.whl", hash = "sha256:9218f86e2164e1bddb75d435bbde4fa651aa58687213d7e3e1b50f7eb8868f66"}, - {file = "boto3-1.38.3.tar.gz", hash = "sha256:655d51abcd68a40a33c52dbaa2ca73fc63c746b894e2ae22ed8ddc1912ddd93f"}, + {file = "boto3-1.38.13-py3-none-any.whl", hash = "sha256:668400d13889d2d2fcd66ce785cc0b0fc040681f58a9c7f67daa9149a52b6c63"}, + {file = "boto3-1.38.13.tar.gz", hash = "sha256:6633bce2b73284acce1453ca85834c7c5a59e0dbcce1170be461cc079bdcdfcf"}, ] [package.dependencies] -botocore = ">=1.38.3,<1.39.0" +botocore = ">=1.38.13,<1.39.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.12.0,<0.13.0" @@ -331,15 +332,15 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.38.3" +version = "1.38.13" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"boto3\"" files = [ - {file = "botocore-1.38.3-py3-none-any.whl", hash = "sha256:96f823240fe3704b99c17d1d1b2fd2d1679cf56d2a55b095f00255b76087cbf0"}, - {file = "botocore-1.38.3.tar.gz", hash = "sha256:790f8f966201781f5fcf486d48b4492e9f734446bbf9d19ef8159d08be854243"}, + {file = "botocore-1.38.13-py3-none-any.whl", hash = "sha256:de29fee43a1f02787fb5b3756ec09917d5661ed95b2b2d64797ab04196f69e14"}, + {file = "botocore-1.38.13.tar.gz", hash = "sha256:22feee15753cd3f9f7179d041604078a1024701497d27b22be7c6707e8d13ccb"}, ] [package.dependencies] @@ -627,7 +628,7 @@ files = [ {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, ] -markers = {main = "extra == \"hf\""} +markers = {main = "extra == \"hf\"", dev = "python_version < \"3.13\""} [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] @@ -640,7 +641,7 @@ version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, @@ -788,22 +789,45 @@ files = [ {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +[[package]] +name = "hf-xet" +version = "1.1.0" +description = "" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"hf\" and (platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\")" +files = [ + {file = "hf_xet-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0322c42551e275fcb7949c083a54a81b2898e50787c9aa74284fcb8d2c58c12c"}, + {file = "hf_xet-1.1.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:667153a0304ac2debf2af95a8ff7687186f885b493f4cd16344869af270cd110"}, + {file = "hf_xet-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:995eeffb119636ea617b96c7d7bf3c3f5ea8727fa57974574e25d700b8532d48"}, + {file = "hf_xet-1.1.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3aee847da362393331f515c4010d0aaa1c2669acfcca1f4b28946d6949cc0086"}, + {file = "hf_xet-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68c5813a6074aa36e12ef5983230e3b03148cce61e0fcdd294096493795565b4"}, + {file = "hf_xet-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ee9222bf9274b1c198b88a929de0b5a49349c4962d89c5b3b2f0f7f47d9761c"}, + {file = "hf_xet-1.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:73153eab9abf3d6973b21e94a67ccba5d595c3e12feb8c0bf50be02964e7f126"}, + {file = "hf_xet-1.1.0.tar.gz", hash = "sha256:a7c2a4c2b6eee9ce0a1a367a82b60d95ba634420ef1c250addad7aa4af419cf4"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "huggingface-hub" -version = "0.30.2" +version = "0.31.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true python-versions = ">=3.8.0" groups = ["main"] markers = "extra == \"hf\"" files = [ - {file = "huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28"}, - {file = "huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466"}, + {file = "huggingface_hub-0.31.1-py3-none-any.whl", hash = "sha256:43f73124819b48b42d140cbc0d7a2e6bd15b2853b1b9d728d4d55ad1750cac5b"}, + {file = "huggingface_hub-0.31.1.tar.gz", hash = "sha256:492bb5f545337aa9e2f59b75ef4c5f535a371e8958a6ce90af056387e67f1180"}, ] [package.dependencies] filelock = "*" fsspec = ">=2023.5.0" +hf-xet = {version = ">=1.1.0,<2.0.0", markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\""} packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -816,7 +840,7 @@ cli = ["InquirerPy (==0.3.4)"] dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] -hf-xet = ["hf-xet (>=0.1.4)"] +hf-xet = ["hf-xet (>=1.1.0,<2.0.0)"] inference = ["aiohttp"] quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] @@ -856,7 +880,7 @@ description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" groups = ["docs"] -markers = "python_version == \"3.9\"" +markers = "python_version < \"3.10\"" files = [ {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, @@ -920,6 +944,7 @@ description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.7" groups = ["dev"] +markers = "python_version < \"3.13\"" files = [ {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, @@ -1088,6 +1113,7 @@ description = "MessagePack serializer" optional = false python-versions = ">=3.8" groups = ["dev"] +markers = "python_version < \"3.13\"" files = [ {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, @@ -1363,15 +1389,15 @@ files = [ [[package]] name = "olot" -version = "0.1.6" +version = "0.1.7" description = "oci layers on top" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] markers = "extra == \"olot\"" files = [ - {file = "olot-0.1.6-py3-none-any.whl", hash = "sha256:7ab8461a019ff280fd508fb75af8abaec3a9e625b578a4b6224dc9346faad002"}, - {file = "olot-0.1.6.tar.gz", hash = "sha256:aaf8f9196d80ef7ba25a4bf9e7c9c6128a60d5f4032c776763aa6f57a16d4290"}, + {file = "olot-0.1.7-py3-none-any.whl", hash = "sha256:38f65a09e9cb22acfb2325b0f9853f98b866a9203f4d5efd67917fe466c0afc5"}, + {file = "olot-0.1.7.tar.gz", hash = "sha256:c94656d286ec02d6a6e31567901af064b0c9aa66fd2bc4b542bc96e1de8b1f76"}, ] [package.dependencies] @@ -1551,6 +1577,7 @@ description = "" optional = false python-versions = ">=3.9" groups = ["dev"] +markers = "python_version < \"3.13\"" files = [ {file = "protobuf-6.30.0-cp310-abi3-win32.whl", hash = "sha256:7337d76d8efe65ee09ee566b47b5914c517190196f414e5418fa236dfd1aed3e"}, {file = "protobuf-6.30.0-cp310-abi3-win_amd64.whl", hash = "sha256:9b33d51cc95a7ec4f407004c8b744330b6911a37a782e2629c67e1e8ac41318f"}, @@ -1565,19 +1592,19 @@ files = [ [[package]] name = "pydantic" -version = "2.11.3" +version = "2.11.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f"}, - {file = "pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3"}, + {file = "pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb"}, + {file = "pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.33.1" +pydantic-core = "2.33.2" typing-extensions = ">=4.12.2" typing-inspection = ">=0.4.0" @@ -1587,111 +1614,111 @@ timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows [[package]] name = "pydantic-core" -version = "2.33.1" +version = "2.33.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"}, - {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89"}, - {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde"}, - {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65"}, - {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc"}, - {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091"}, - {file = "pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383"}, - {file = "pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504"}, - {file = "pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24"}, - {file = "pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f"}, - {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77"}, - {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961"}, - {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1"}, - {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c"}, - {file = "pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896"}, - {file = "pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83"}, - {file = "pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89"}, - {file = "pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8"}, - {file = "pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d"}, - {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b"}, - {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39"}, - {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a"}, - {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db"}, - {file = "pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda"}, - {file = "pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4"}, - {file = "pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea"}, - {file = "pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a"}, - {file = "pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d"}, - {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4"}, - {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde"}, - {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e"}, - {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd"}, - {file = "pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f"}, - {file = "pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40"}, - {file = "pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523"}, - {file = "pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d"}, - {file = "pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c"}, - {file = "pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18"}, - {file = "pydantic_core-2.33.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb"}, - {file = "pydantic_core-2.33.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad"}, - {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b"}, - {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5"}, - {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331"}, - {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824"}, - {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5"}, - {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6"}, - {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d"}, - {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96"}, - {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599"}, - {file = "pydantic_core-2.33.1-cp39-cp39-win32.whl", hash = "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5"}, - {file = "pydantic_core-2.33.1-cp39-cp39-win_amd64.whl", hash = "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add"}, - {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544"}, - {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672"}, - {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3"}, - {file = "pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, ] [package.dependencies] @@ -1720,6 +1747,7 @@ description = "Persistent/Functional/Immutable data structures" optional = false python-versions = ">=3.8" groups = ["dev"] +markers = "python_version < \"3.13\"" files = [ {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, @@ -1892,43 +1920,46 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] -markers = {main = "extra == \"hf\""} +markers = {main = "extra == \"hf\"", dev = "python_version < \"3.13\""} [[package]] name = "ray" -version = "2.44.1" +version = "2.46.0" description = "Ray provides a simple, universal API for building distributed applications." optional = false python-versions = ">=3.9" groups = ["dev"] -files = [ - {file = "ray-2.44.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:7d83999ead98bed7e70afddcda870cc1684773cb888e90768ce1a4c72c5fe009"}, - {file = "ray-2.44.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f221b1426d8657ce0c24508d5ff11cabc4a8c40a833c8c5bb63e2217f37cfd9"}, - {file = "ray-2.44.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3a3db83c54085535bed9b4861d871f6527c5df61532bf7d2285701485de8968f"}, - {file = "ray-2.44.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:18073261c09811d5faefc918abbd8a6bf5f4968277eeae6fbc0992e3724d1496"}, - {file = "ray-2.44.1-cp310-cp310-win_amd64.whl", hash = "sha256:9decf32c1402f44b5f7a54f29bd422e0ae9a45afc0a10090acf9ba6011ca12a7"}, - {file = "ray-2.44.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:949dbd735e5edec80f6140fa6bb536248c7c97535fe5a11acd279295b7bd1a6d"}, - {file = "ray-2.44.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c21a452227eeecfa3d89b50480d1f9bab11b15c9b3695af41421ab8e7e608cfd"}, - {file = "ray-2.44.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:0c6d395c05542a882d14e31abec1dd1a1808a9a0c0dcf94200a827d2d04c08a1"}, - {file = "ray-2.44.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:6e6bd0430d2eb664ae632c96e74c01e4a1bf14ab2a15102e1809b05ea9e0c2c7"}, - {file = "ray-2.44.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e94bd887898dc08db7f87c0429bc41219aceb552af0b1cd4924c01718fc6a77"}, - {file = "ray-2.44.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:b6c7b677035c08141ae01adc25eade20a979eb7c9cabfe9ad1c99396e157ed59"}, - {file = "ray-2.44.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:865a83eaf06d5e988c441bc2607b8d1f326d952d139f66c18ea21f077fedbff4"}, - {file = "ray-2.44.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:3d9807c9c31d42793ca309747b9c7affdd7488a532979aa346d4c889b828783a"}, - {file = "ray-2.44.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:a4c0175cc40e6b065391bc8be0f208bacf8cee7ee61392c7791004f17622e7bd"}, - {file = "ray-2.44.1-cp312-cp312-win_amd64.whl", hash = "sha256:2d62f875c36432b6d5ee666ec23280d23a8de44c0a14a56959aa9b75e644b49f"}, - {file = "ray-2.44.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:12e94c27fedd703566de016314c8a5b164a96c5802313c64e7b643157c3930eb"}, - {file = "ray-2.44.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:16ecb31e1156a8952ad7a27da6e91704a67e8f37cb5519b0afc76fb5b21515d6"}, - {file = "ray-2.44.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:72d09a7bd2803979c322f0820f1138257b2fe7f557a615b6521441a1a14a044a"}, - {file = "ray-2.44.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:1cadfa4ec992d3f9c56ffc5ce22b4a937546954a3f5ea10f32d3cf870e0a6c37"}, - {file = "ray-2.44.1-cp39-cp39-win_amd64.whl", hash = "sha256:35028f39090de977374f7ecdd10fdbd6cffd1dece22c31a9143b5be1da76ac50"}, +markers = "python_version < \"3.13\"" +files = [ + {file = "ray-2.46.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:719244b84df79502e5f09497f256618d94d78d66fbaf229422008a0568d3a0ff"}, + {file = "ray-2.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4378a86919e6643238a1094f711b87fa8dc1a18b998d4190f69ab33c64a22a8c"}, + {file = "ray-2.46.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:396b912a4dbf64966e2fdfca9facbcafe57b792ca4842ac5ae17507fdbdfe89f"}, + {file = "ray-2.46.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:c12850608c57c8afd9613a9f757d77663c50d4bd4e77ba2f181425052520c01a"}, + {file = "ray-2.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc953aa4879c7a77893f921905df5cf65227cafd94fbc8273bec65ea393eacdd"}, + {file = "ray-2.46.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:942ba51de6f9cd7fb2ed17618181af48ce6b9517743d3235d846ec32295eca76"}, + {file = "ray-2.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af84f3ed0854bb6de28192ca9e0a3bfa1eb34d69f118ae6348522198896480c8"}, + {file = "ray-2.46.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:81c8ce8b7ba33cb607ec78f5eb2555470e3046bb317732d8282e8189bb58ccbd"}, + {file = "ray-2.46.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d4ddedc3f4d48df564bcee7b131c98c9f898fef0a57483f4ba335f47f951a62f"}, + {file = "ray-2.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:130415c4d231830156f37ce70acbdb5fdee10f6886adc4e85bdc4533d51c24c6"}, + {file = "ray-2.46.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:d1f37ead29299637144726f809c2e0ff958dd9c0e75930ef614156d6a0a3a57f"}, + {file = "ray-2.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7a064acfeee7f0677d9e3f25daef9c59593559faea764b44a3e2c5331d5d832"}, + {file = "ray-2.46.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:006cbe1a8fdc37664114aa218773100ee891399785e256c202e48958d2dac167"}, + {file = "ray-2.46.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:5cec1edda93f618ffd2301f81d5398037f03fa9b16825e7e4d8a00ae7a9a4381"}, + {file = "ray-2.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:7d3160f8d187baaea91a86d16a9fd81136cf8607419c94b7a74d66fce774b5c2"}, + {file = "ray-2.46.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:b2fc2c43ea0a37521193c61ef9a27b6fca8dbab116a58a52fd44344cd73e1ece"}, + {file = "ray-2.46.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4296dd8c0174256a04ee4b54abe013b6802a45fb85fb7cfdb1375231965d6d4d"}, + {file = "ray-2.46.0-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:808daece1f12bd8924b9c6382a0f98da6f5c6886cfb271ed8d89407a89413cd5"}, + {file = "ray-2.46.0-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:a5a28c0a311d2c3221dcf729c40898a6df82466bb5af21e81be0453e09856adf"}, + {file = "ray-2.46.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:e0ec198c16d0e9af7f03242ef7ad7d548eee37a918193917278a124ddd57410a"}, + {file = "ray-2.46.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e31568818973efa4f8ce18b82bce03089395a62ac9fe639e94d755959f607fe9"}, + {file = "ray-2.46.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7c44a98cb24f4905e898d05b787cbe9f267a9f66c1e1f8cda50814f8b3673be2"}, + {file = "ray-2.46.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:91ea998a49578b1450cbef60705f6ece8622a262a3d764d5c99ba89b741de5d0"}, + {file = "ray-2.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:018e98c9745eae53b53ad14fef1ca1c43bb64c39c3cceb9e6d4517729396003b"}, ] [package.dependencies] -aiosignal = "*" click = ">=7.0" filelock = "*" -frozenlist = "*" jsonschema = "*" msgpack = ">=1.0.0,<2.0.0" packaging = "*" @@ -1940,13 +1971,13 @@ requests = "*" adag = ["cupy-cuda12x ; sys_platform != \"darwin\""] air = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "numpy (>=1.20)", "opencensus", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] all = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] -all-cpp = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.44.1)", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +all-cpp = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "cupy-cuda12x ; sys_platform != \"darwin\"", "dm-tree", "fastapi", "fsspec", "grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\"", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "gymnasium (==1.0.0)", "lz4", "memray ; sys_platform != \"win32\"", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "ormsgpack (==1.7.0)", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyOpenSSL", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.46.0)", "requests", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] cgraph = ["cupy-cuda12x ; sys_platform != \"darwin\""] client = ["grpcio", "grpcio (!=1.56.0) ; sys_platform == \"darwin\""] -cpp = ["ray-cpp (==2.44.1)"] +cpp = ["ray-cpp (==2.46.0)"] data = ["fsspec", "numpy (>=1.20)", "pandas (>=1.3)", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)"] default = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "virtualenv (>=20.0.24,!=20.21.1)"] -llm = ["aiohttp (>=3.7)", "aiohttp-cors", "async-timeout ; python_version < \"3.11\"", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "jsonref (>=1.1.0)", "jsonschema", "ninja", "numpy (>=1.20)", "opencensus", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "vllm (>=0.7.2)", "watchfiles"] +llm = ["aiohttp (>=3.7)", "aiohttp-cors", "async-timeout ; python_version < \"3.11\"", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "jsonref (>=1.1.0)", "jsonschema", "ninja", "numpy (>=1.20)", "opencensus", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "vllm (>=0.8.5)", "watchfiles"] observability = ["memray ; sys_platform != \"win32\"", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"] rllib = ["dm-tree", "fsspec", "gymnasium (==1.0.0)", "lz4", "ormsgpack (==1.7.0)", "pandas", "pyarrow (<18) ; sys_platform == \"darwin\" and platform_machine == \"x86_64\"", "pyarrow (>=9.0.0)", "pyyaml", "requests", "scipy", "tensorboardX (>=1.9)"] serve = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0) ; python_version < \"3.10\"", "grpcio (>=1.42.0) ; python_version >= \"3.10\"", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0) ; python_version < \"3.12\"", "py-spy (>=0.4.0) ; python_version >= \"3.12\"", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] @@ -1978,30 +2009,30 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.11.7" +version = "0.11.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.11.7-py3-none-linux_armv6l.whl", hash = "sha256:d29e909d9a8d02f928d72ab7837b5cbc450a5bdf578ab9ebee3263d0a525091c"}, - {file = "ruff-0.11.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dd1fb86b168ae349fb01dd497d83537b2c5541fe0626e70c786427dd8363aaee"}, - {file = "ruff-0.11.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d3d7d2e140a6fbbc09033bce65bd7ea29d6a0adeb90b8430262fbacd58c38ada"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4809df77de390a1c2077d9b7945d82f44b95d19ceccf0c287c56e4dc9b91ca64"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3a0c2e169e6b545f8e2dba185eabbd9db4f08880032e75aa0e285a6d3f48201"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49b888200a320dd96a68e86736cf531d6afba03e4f6cf098401406a257fcf3d6"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2b19cdb9cf7dae00d5ee2e7c013540cdc3b31c4f281f1dacb5a799d610e90db4"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64e0ee994c9e326b43539d133a36a455dbaab477bc84fe7bfbd528abe2f05c1e"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bad82052311479a5865f52c76ecee5d468a58ba44fb23ee15079f17dd4c8fd63"}, - {file = "ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7940665e74e7b65d427b82bffc1e46710ec7f30d58b4b2d5016e3f0321436502"}, - {file = "ruff-0.11.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:169027e31c52c0e36c44ae9a9c7db35e505fee0b39f8d9fca7274a6305295a92"}, - {file = "ruff-0.11.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:305b93f9798aee582e91e34437810439acb28b5fc1fee6b8205c78c806845a94"}, - {file = "ruff-0.11.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a681db041ef55550c371f9cd52a3cf17a0da4c75d6bd691092dfc38170ebc4b6"}, - {file = "ruff-0.11.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:07f1496ad00a4a139f4de220b0c97da6d4c85e0e4aa9b2624167b7d4d44fd6b6"}, - {file = "ruff-0.11.7-py3-none-win32.whl", hash = "sha256:f25dfb853ad217e6e5f1924ae8a5b3f6709051a13e9dad18690de6c8ff299e26"}, - {file = "ruff-0.11.7-py3-none-win_amd64.whl", hash = "sha256:0a931d85959ceb77e92aea4bbedfded0a31534ce191252721128f77e5ae1f98a"}, - {file = "ruff-0.11.7-py3-none-win_arm64.whl", hash = "sha256:778c1e5d6f9e91034142dfd06110534ca13220bfaad5c3735f6cb844654f6177"}, - {file = "ruff-0.11.7.tar.gz", hash = "sha256:655089ad3224070736dc32844fde783454f8558e71f501cb207485fe4eee23d4"}, + {file = "ruff-0.11.9-py3-none-linux_armv6l.whl", hash = "sha256:a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c"}, + {file = "ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722"}, + {file = "ruff-0.11.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6"}, + {file = "ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70"}, + {file = "ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381"}, + {file = "ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787"}, + {file = "ruff-0.11.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd"}, + {file = "ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b"}, + {file = "ruff-0.11.9-py3-none-win32.whl", hash = "sha256:7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a"}, + {file = "ruff-0.11.9-py3-none-win_amd64.whl", hash = "sha256:52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964"}, + {file = "ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca"}, + {file = "ruff-0.11.9.tar.gz", hash = "sha256:ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517"}, ] [[package]] @@ -2747,7 +2778,7 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" groups = ["docs"] -markers = "python_version == \"3.9\"" +markers = "python_version < \"3.10\"" files = [ {file = "zipp-3.19.1-py3-none-any.whl", hash = "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091"}, {file = "zipp-3.19.1.tar.gz", hash = "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f"}, @@ -2765,4 +2796,4 @@ olot = ["olot"] [metadata] lock-version = "2.1" python-versions = ">= 3.9, < 4.0" -content-hash = "dce978a008624eb0606f45d3f630d42443e3da92a033eb519c5a6cc0060cbafb" +content-hash = "e7a592aa999086f73695a83016b300b9ce79ea07eb5c28cf7d26d8c07b779615" diff --git a/clients/python/pyproject.toml b/clients/python/pyproject.toml index 97aaffa60f..c99fb76839 100644 --- a/clients/python/pyproject.toml +++ b/clients/python/pyproject.toml @@ -26,7 +26,7 @@ nest-asyncio = "^1.6.0" # necessary for modern type annotations using pydantic on 3.9 eval-type-backport = "^0.2.0" -huggingface-hub = { version = ">=0.20.1,<0.31.0", optional = true } +huggingface-hub = { version = ">=0.20.1,<0.32.0", optional = true } olot = { version = "^0.1.6", optional = true } boto3 = { version = "^1.37.34", optional = true } @@ -50,7 +50,10 @@ coverage = { extras = ["toml"], version = "^7.3.2" } pytest-cov = ">=4.1,<7.0" ruff = ">=0.5.2,<0.12.0" mypy = "^1.7.0" -ray = "^2.43.0" +# atm Ray is only available <3.13, so we will E2E test using Ray in compatible py environments. +ray = [ + {version = "^2.43.0", python = ">=3.9, <3.13"} +] uvloop = "^0.21.0" pytest-asyncio = ">=0.23.7,<0.27.0" requests = "^2.32.2" diff --git a/clients/python/src/.openapi-generator/FILES b/clients/python/src/.openapi-generator/FILES index 1d6f28a42f..0d0d9e93f6 100644 --- a/clients/python/src/.openapi-generator/FILES +++ b/clients/python/src/.openapi-generator/FILES @@ -11,12 +11,6 @@ mr_openapi/models/artifact_create.py mr_openapi/models/artifact_list.py mr_openapi/models/artifact_state.py mr_openapi/models/artifact_update.py -mr_openapi/models/base_artifact.py -mr_openapi/models/base_artifact_create.py -mr_openapi/models/base_artifact_update.py -mr_openapi/models/base_execution.py -mr_openapi/models/base_execution_create.py -mr_openapi/models/base_execution_update.py mr_openapi/models/base_resource.py mr_openapi/models/base_resource_create.py mr_openapi/models/base_resource_list.py diff --git a/clients/python/src/model_registry/types/contexts.py b/clients/python/src/model_registry/types/contexts.py index 2d50c42372..cb6b69d172 100644 --- a/clients/python/src/model_registry/types/contexts.py +++ b/clients/python/src/model_registry/types/contexts.py @@ -82,6 +82,18 @@ def from_basemodel(cls, source: ModelVersionBaseModel) -> ModelVersion: else None, ) + def __repr_str__(self, join_str: str) -> str: + """Overrides pydantic Representation.__repr_str__ to bring name to the front.""" + result = [] + for a, v in self.__repr_args__(): + if a is None: + result.append(repr(v)) + elif a == "name": + result.insert(0, f"{a}={v!r}") + else: + result.append(f"{a}={v!r}") + return join_str.join(result) + class RegisteredModel(BaseResourceModel): """Represents a registered model. @@ -131,3 +143,15 @@ def from_basemodel(cls, source: RegisteredModelBaseModel) -> RegisteredModel: if source.custom_properties else None, ) + + def __repr_str__(self, join_str: str) -> str: + """Overrides pydantic Representation.__repr_str__ to bring name to the front.""" + result = [] + for a, v in self.__repr_args__(): + if a is None: + result.append(repr(v)) + elif a == "name": + result.insert(0, f"{a}={v!r}") + else: + result.append(f"{a}={v!r}") + return join_str.join(result) diff --git a/clients/python/src/mr_openapi/README.md b/clients/python/src/mr_openapi/README.md index c7f687c7b2..01bebdd948 100644 --- a/clients/python/src/mr_openapi/README.md +++ b/clients/python/src/mr_openapi/README.md @@ -122,12 +122,6 @@ Class | Method | HTTP request | Description - [ArtifactList](mr_openapi/docs/ArtifactList.md) - [ArtifactState](mr_openapi/docs/ArtifactState.md) - [ArtifactUpdate](mr_openapi/docs/ArtifactUpdate.md) - - [BaseArtifact](mr_openapi/docs/BaseArtifact.md) - - [BaseArtifactCreate](mr_openapi/docs/BaseArtifactCreate.md) - - [BaseArtifactUpdate](mr_openapi/docs/BaseArtifactUpdate.md) - - [BaseExecution](mr_openapi/docs/BaseExecution.md) - - [BaseExecutionCreate](mr_openapi/docs/BaseExecutionCreate.md) - - [BaseExecutionUpdate](mr_openapi/docs/BaseExecutionUpdate.md) - [BaseResource](mr_openapi/docs/BaseResource.md) - [BaseResourceCreate](mr_openapi/docs/BaseResourceCreate.md) - [BaseResourceList](mr_openapi/docs/BaseResourceList.md) diff --git a/clients/python/src/mr_openapi/__init__.py b/clients/python/src/mr_openapi/__init__.py index 08a4a0a7a1..4740b215f2 100644 --- a/clients/python/src/mr_openapi/__init__.py +++ b/clients/python/src/mr_openapi/__init__.py @@ -36,12 +36,6 @@ from mr_openapi.models.artifact_list import ArtifactList from mr_openapi.models.artifact_state import ArtifactState from mr_openapi.models.artifact_update import ArtifactUpdate -from mr_openapi.models.base_artifact import BaseArtifact -from mr_openapi.models.base_artifact_create import BaseArtifactCreate -from mr_openapi.models.base_artifact_update import BaseArtifactUpdate -from mr_openapi.models.base_execution import BaseExecution -from mr_openapi.models.base_execution_create import BaseExecutionCreate -from mr_openapi.models.base_execution_update import BaseExecutionUpdate from mr_openapi.models.base_resource import BaseResource from mr_openapi.models.base_resource_create import BaseResourceCreate from mr_openapi.models.base_resource_list import BaseResourceList diff --git a/clients/python/src/mr_openapi/models/__init__.py b/clients/python/src/mr_openapi/models/__init__.py index 7fd7bc2600..4c362eaddf 100644 --- a/clients/python/src/mr_openapi/models/__init__.py +++ b/clients/python/src/mr_openapi/models/__init__.py @@ -19,12 +19,6 @@ from mr_openapi.models.artifact_list import ArtifactList from mr_openapi.models.artifact_state import ArtifactState from mr_openapi.models.artifact_update import ArtifactUpdate -from mr_openapi.models.base_artifact import BaseArtifact -from mr_openapi.models.base_artifact_create import BaseArtifactCreate -from mr_openapi.models.base_artifact_update import BaseArtifactUpdate -from mr_openapi.models.base_execution import BaseExecution -from mr_openapi.models.base_execution_create import BaseExecutionCreate -from mr_openapi.models.base_execution_update import BaseExecutionUpdate from mr_openapi.models.base_resource import BaseResource from mr_openapi.models.base_resource_create import BaseResourceCreate from mr_openapi.models.base_resource_list import BaseResourceList diff --git a/clients/python/src/mr_openapi/models/base_artifact.py b/clients/python/src/mr_openapi/models/base_artifact.py deleted file mode 100644 index 742b33ff12..0000000000 --- a/clients/python/src/mr_openapi/models/base_artifact.py +++ /dev/null @@ -1,147 +0,0 @@ -"""Model Registry REST API. - -REST API for Model Registry to create and manage ML model metadata - -The version of the OpenAPI document: v1alpha3 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations - -import json -import pprint -import re # noqa: F401 -from typing import Any, ClassVar - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing_extensions import Self - -from mr_openapi.models.artifact_state import ArtifactState -from mr_openapi.models.metadata_value import MetadataValue - - -class BaseArtifact(BaseModel): - """BaseArtifact.""" # noqa: E501 - - custom_properties: dict[str, MetadataValue] | None = Field( - default=None, - description="User provided custom properties which are not defined by its type.", - alias="customProperties", - ) - description: StrictStr | None = Field(default=None, description="An optional description about the resource.") - external_id: StrictStr | None = Field( - default=None, - description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", - alias="externalId", - ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None - name: StrictStr | None = Field( - default=None, - description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", - ) - id: StrictStr | None = Field(default=None, description="The unique server generated id of the resource.") - create_time_since_epoch: StrictStr | None = Field( - default=None, - description="Output only. Create time of the resource in millisecond since epoch.", - alias="createTimeSinceEpoch", - ) - last_update_time_since_epoch: StrictStr | None = Field( - default=None, - description="Output only. Last update time of the resource since epoch in millisecond since epoch.", - alias="lastUpdateTimeSinceEpoch", - ) - __properties: ClassVar[list[str]] = [ - "customProperties", - "description", - "externalId", - "uri", - "state", - "name", - "id", - "createTimeSinceEpoch", - "lastUpdateTimeSinceEpoch", - ] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - def to_str(self) -> str: - """Returns the string representation of the model using alias.""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias.""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self | None: - """Create an instance of BaseArtifact from a JSON string.""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * OpenAPI `readOnly` fields are excluded. - * OpenAPI `readOnly` fields are excluded. - """ - excluded_fields: set[str] = { - "create_time_since_epoch", - "last_update_time_since_epoch", - } - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in custom_properties (dict) - _field_dict = {} - if self.custom_properties: - for _key in self.custom_properties: - if self.custom_properties[_key]: - _field_dict[_key] = self.custom_properties[_key].to_dict() - _dict["customProperties"] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: - """Create an instance of BaseArtifact from a dict.""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - return cls.model_validate( - { - "customProperties": ( - {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} - if obj.get("customProperties") is not None - else None - ), - "description": obj.get("description"), - "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), - "name": obj.get("name"), - "id": obj.get("id"), - "createTimeSinceEpoch": obj.get("createTimeSinceEpoch"), - "lastUpdateTimeSinceEpoch": obj.get("lastUpdateTimeSinceEpoch"), - } - ) diff --git a/clients/python/src/mr_openapi/models/base_artifact_create.py b/clients/python/src/mr_openapi/models/base_artifact_create.py deleted file mode 100644 index 40540b0f0f..0000000000 --- a/clients/python/src/mr_openapi/models/base_artifact_create.py +++ /dev/null @@ -1,118 +0,0 @@ -"""Model Registry REST API. - -REST API for Model Registry to create and manage ML model metadata - -The version of the OpenAPI document: v1alpha3 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations - -import json -import pprint -import re # noqa: F401 -from typing import Any, ClassVar - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing_extensions import Self - -from mr_openapi.models.artifact_state import ArtifactState -from mr_openapi.models.metadata_value import MetadataValue - - -class BaseArtifactCreate(BaseModel): - """BaseArtifactCreate.""" # noqa: E501 - - custom_properties: dict[str, MetadataValue] | None = Field( - default=None, - description="User provided custom properties which are not defined by its type.", - alias="customProperties", - ) - description: StrictStr | None = Field(default=None, description="An optional description about the resource.") - external_id: StrictStr | None = Field( - default=None, - description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", - alias="externalId", - ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None - name: StrictStr | None = Field( - default=None, - description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", - ) - __properties: ClassVar[list[str]] = ["customProperties", "description", "externalId", "uri", "state", "name"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - def to_str(self) -> str: - """Returns the string representation of the model using alias.""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias.""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self | None: - """Create an instance of BaseArtifactCreate from a JSON string.""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: set[str] = set() - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in custom_properties (dict) - _field_dict = {} - if self.custom_properties: - for _key in self.custom_properties: - if self.custom_properties[_key]: - _field_dict[_key] = self.custom_properties[_key].to_dict() - _dict["customProperties"] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: - """Create an instance of BaseArtifactCreate from a dict.""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - return cls.model_validate( - { - "customProperties": ( - {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} - if obj.get("customProperties") is not None - else None - ), - "description": obj.get("description"), - "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), - "name": obj.get("name"), - } - ) diff --git a/clients/python/src/mr_openapi/models/base_artifact_update.py b/clients/python/src/mr_openapi/models/base_artifact_update.py deleted file mode 100644 index 08c6b4c2e3..0000000000 --- a/clients/python/src/mr_openapi/models/base_artifact_update.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Model Registry REST API. - -REST API for Model Registry to create and manage ML model metadata - -The version of the OpenAPI document: v1alpha3 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations - -import json -import pprint -import re # noqa: F401 -from typing import Any, ClassVar - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing_extensions import Self - -from mr_openapi.models.artifact_state import ArtifactState -from mr_openapi.models.metadata_value import MetadataValue - - -class BaseArtifactUpdate(BaseModel): - """BaseArtifactUpdate.""" # noqa: E501 - - custom_properties: dict[str, MetadataValue] | None = Field( - default=None, - description="User provided custom properties which are not defined by its type.", - alias="customProperties", - ) - description: StrictStr | None = Field(default=None, description="An optional description about the resource.") - external_id: StrictStr | None = Field( - default=None, - description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", - alias="externalId", - ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None - __properties: ClassVar[list[str]] = ["customProperties", "description", "externalId", "uri", "state"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - def to_str(self) -> str: - """Returns the string representation of the model using alias.""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias.""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self | None: - """Create an instance of BaseArtifactUpdate from a JSON string.""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: set[str] = set() - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in custom_properties (dict) - _field_dict = {} - if self.custom_properties: - for _key in self.custom_properties: - if self.custom_properties[_key]: - _field_dict[_key] = self.custom_properties[_key].to_dict() - _dict["customProperties"] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: - """Create an instance of BaseArtifactUpdate from a dict.""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - return cls.model_validate( - { - "customProperties": ( - {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} - if obj.get("customProperties") is not None - else None - ), - "description": obj.get("description"), - "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), - } - ) diff --git a/clients/python/src/mr_openapi/models/base_execution.py b/clients/python/src/mr_openapi/models/base_execution.py deleted file mode 100644 index b1fed836d7..0000000000 --- a/clients/python/src/mr_openapi/models/base_execution.py +++ /dev/null @@ -1,141 +0,0 @@ -"""Model Registry REST API. - -REST API for Model Registry to create and manage ML model metadata - -The version of the OpenAPI document: v1alpha3 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations - -import json -import pprint -import re # noqa: F401 -from typing import Any, ClassVar - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing_extensions import Self - -from mr_openapi.models.execution_state import ExecutionState -from mr_openapi.models.metadata_value import MetadataValue - - -class BaseExecution(BaseModel): - """BaseExecution.""" # noqa: E501 - - last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") - custom_properties: dict[str, MetadataValue] | None = Field( - default=None, - description="User provided custom properties which are not defined by its type.", - alias="customProperties", - ) - description: StrictStr | None = Field(default=None, description="An optional description about the resource.") - external_id: StrictStr | None = Field( - default=None, - description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", - alias="externalId", - ) - name: StrictStr | None = Field( - default=None, - description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", - ) - id: StrictStr | None = Field(default=None, description="The unique server generated id of the resource.") - create_time_since_epoch: StrictStr | None = Field( - default=None, - description="Output only. Create time of the resource in millisecond since epoch.", - alias="createTimeSinceEpoch", - ) - last_update_time_since_epoch: StrictStr | None = Field( - default=None, - description="Output only. Last update time of the resource since epoch in millisecond since epoch.", - alias="lastUpdateTimeSinceEpoch", - ) - __properties: ClassVar[list[str]] = [ - "lastKnownState", - "customProperties", - "description", - "externalId", - "name", - "id", - "createTimeSinceEpoch", - "lastUpdateTimeSinceEpoch", - ] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - def to_str(self) -> str: - """Returns the string representation of the model using alias.""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias.""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self | None: - """Create an instance of BaseExecution from a JSON string.""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - * OpenAPI `readOnly` fields are excluded. - * OpenAPI `readOnly` fields are excluded. - """ - excluded_fields: set[str] = { - "create_time_since_epoch", - "last_update_time_since_epoch", - } - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in custom_properties (dict) - _field_dict = {} - if self.custom_properties: - for _key in self.custom_properties: - if self.custom_properties[_key]: - _field_dict[_key] = self.custom_properties[_key].to_dict() - _dict["customProperties"] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: - """Create an instance of BaseExecution from a dict.""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - return cls.model_validate( - { - "lastKnownState": obj.get("lastKnownState"), - "customProperties": ( - {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} - if obj.get("customProperties") is not None - else None - ), - "description": obj.get("description"), - "externalId": obj.get("externalId"), - "name": obj.get("name"), - "id": obj.get("id"), - "createTimeSinceEpoch": obj.get("createTimeSinceEpoch"), - "lastUpdateTimeSinceEpoch": obj.get("lastUpdateTimeSinceEpoch"), - } - ) diff --git a/clients/python/src/mr_openapi/models/base_execution_create.py b/clients/python/src/mr_openapi/models/base_execution_create.py deleted file mode 100644 index 3cd70a8a3f..0000000000 --- a/clients/python/src/mr_openapi/models/base_execution_create.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Model Registry REST API. - -REST API for Model Registry to create and manage ML model metadata - -The version of the OpenAPI document: v1alpha3 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations - -import json -import pprint -import re # noqa: F401 -from typing import Any, ClassVar - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing_extensions import Self - -from mr_openapi.models.execution_state import ExecutionState -from mr_openapi.models.metadata_value import MetadataValue - - -class BaseExecutionCreate(BaseModel): - """BaseExecutionCreate.""" # noqa: E501 - - last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") - custom_properties: dict[str, MetadataValue] | None = Field( - default=None, - description="User provided custom properties which are not defined by its type.", - alias="customProperties", - ) - description: StrictStr | None = Field(default=None, description="An optional description about the resource.") - external_id: StrictStr | None = Field( - default=None, - description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", - alias="externalId", - ) - name: StrictStr | None = Field( - default=None, - description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", - ) - __properties: ClassVar[list[str]] = ["lastKnownState", "customProperties", "description", "externalId", "name"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - def to_str(self) -> str: - """Returns the string representation of the model using alias.""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias.""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self | None: - """Create an instance of BaseExecutionCreate from a JSON string.""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: set[str] = set() - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in custom_properties (dict) - _field_dict = {} - if self.custom_properties: - for _key in self.custom_properties: - if self.custom_properties[_key]: - _field_dict[_key] = self.custom_properties[_key].to_dict() - _dict["customProperties"] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: - """Create an instance of BaseExecutionCreate from a dict.""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - return cls.model_validate( - { - "lastKnownState": obj.get("lastKnownState"), - "customProperties": ( - {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} - if obj.get("customProperties") is not None - else None - ), - "description": obj.get("description"), - "externalId": obj.get("externalId"), - "name": obj.get("name"), - } - ) diff --git a/clients/python/src/mr_openapi/models/base_execution_update.py b/clients/python/src/mr_openapi/models/base_execution_update.py deleted file mode 100644 index bdef49c4b5..0000000000 --- a/clients/python/src/mr_openapi/models/base_execution_update.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Model Registry REST API. - -REST API for Model Registry to create and manage ML model metadata - -The version of the OpenAPI document: v1alpha3 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - -from __future__ import annotations - -import json -import pprint -import re # noqa: F401 -from typing import Any, ClassVar - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing_extensions import Self - -from mr_openapi.models.execution_state import ExecutionState -from mr_openapi.models.metadata_value import MetadataValue - - -class BaseExecutionUpdate(BaseModel): - """BaseExecutionUpdate.""" # noqa: E501 - - custom_properties: dict[str, MetadataValue] | None = Field( - default=None, - description="User provided custom properties which are not defined by its type.", - alias="customProperties", - ) - description: StrictStr | None = Field(default=None, description="An optional description about the resource.") - external_id: StrictStr | None = Field( - default=None, - description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", - alias="externalId", - ) - last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") - __properties: ClassVar[list[str]] = ["customProperties", "description", "externalId", "lastKnownState"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - def to_str(self) -> str: - """Returns the string representation of the model using alias.""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias.""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Self | None: - """Create an instance of BaseExecutionUpdate from a JSON string.""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: set[str] = set() - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in custom_properties (dict) - _field_dict = {} - if self.custom_properties: - for _key in self.custom_properties: - if self.custom_properties[_key]: - _field_dict[_key] = self.custom_properties[_key].to_dict() - _dict["customProperties"] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: - """Create an instance of BaseExecutionUpdate from a dict.""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - return cls.model_validate( - { - "customProperties": ( - {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} - if obj.get("customProperties") is not None - else None - ), - "description": obj.get("description"), - "externalId": obj.get("externalId"), - "lastKnownState": obj.get("lastKnownState"), - } - ) diff --git a/clients/python/src/mr_openapi/models/doc_artifact.py b/clients/python/src/mr_openapi/models/doc_artifact.py index 5326d7dd3b..4dabeeda8b 100644 --- a/clients/python/src/mr_openapi/models/doc_artifact.py +++ b/clients/python/src/mr_openapi/models/doc_artifact.py @@ -36,11 +36,6 @@ class DocArtifact(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None name: StrictStr | None = Field( default=None, description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", @@ -57,17 +52,22 @@ class DocArtifact(BaseModel): alias="lastUpdateTimeSinceEpoch", ) artifact_type: StrictStr | None = Field(default="doc-artifact", alias="artifactType") + uri: StrictStr | None = Field( + default=None, + description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", + ) + state: ArtifactState | None = None __properties: ClassVar[list[str]] = [ "customProperties", "description", "externalId", - "uri", - "state", "name", "id", "createTimeSinceEpoch", "lastUpdateTimeSinceEpoch", "artifactType", + "uri", + "state", ] model_config = ConfigDict( @@ -140,12 +140,12 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), "name": obj.get("name"), "id": obj.get("id"), "createTimeSinceEpoch": obj.get("createTimeSinceEpoch"), "lastUpdateTimeSinceEpoch": obj.get("lastUpdateTimeSinceEpoch"), "artifactType": obj.get("artifactType") if obj.get("artifactType") is not None else "doc-artifact", + "uri": obj.get("uri"), + "state": obj.get("state"), } ) diff --git a/clients/python/src/mr_openapi/models/doc_artifact_create.py b/clients/python/src/mr_openapi/models/doc_artifact_create.py index e2cdc7857c..ff24f41790 100644 --- a/clients/python/src/mr_openapi/models/doc_artifact_create.py +++ b/clients/python/src/mr_openapi/models/doc_artifact_create.py @@ -36,24 +36,24 @@ class DocArtifactCreate(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None name: StrictStr | None = Field( default=None, description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", ) artifact_type: StrictStr | None = Field(default="doc-artifact", alias="artifactType") + uri: StrictStr | None = Field( + default=None, + description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", + ) + state: ArtifactState | None = None __properties: ClassVar[list[str]] = [ "customProperties", "description", "externalId", - "uri", - "state", "name", "artifactType", + "uri", + "state", ] model_config = ConfigDict( @@ -120,9 +120,9 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), "name": obj.get("name"), "artifactType": obj.get("artifactType") if obj.get("artifactType") is not None else "doc-artifact", + "uri": obj.get("uri"), + "state": obj.get("state"), } ) diff --git a/clients/python/src/mr_openapi/models/doc_artifact_update.py b/clients/python/src/mr_openapi/models/doc_artifact_update.py index 3f5c84c9c4..ef86ee4516 100644 --- a/clients/python/src/mr_openapi/models/doc_artifact_update.py +++ b/clients/python/src/mr_openapi/models/doc_artifact_update.py @@ -36,19 +36,19 @@ class DocArtifactUpdate(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) + artifact_type: StrictStr | None = Field(default="doc-artifact", alias="artifactType") uri: StrictStr | None = Field( default=None, description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", ) state: ArtifactState | None = None - artifact_type: StrictStr | None = Field(default="doc-artifact", alias="artifactType") __properties: ClassVar[list[str]] = [ "customProperties", "description", "externalId", + "artifactType", "uri", "state", - "artifactType", ] model_config = ConfigDict( @@ -115,8 +115,8 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), + "artifactType": obj.get("artifactType") if obj.get("artifactType") is not None else "doc-artifact", "uri": obj.get("uri"), "state": obj.get("state"), - "artifactType": obj.get("artifactType") if obj.get("artifactType") is not None else "doc-artifact", } ) diff --git a/clients/python/src/mr_openapi/models/model_artifact.py b/clients/python/src/mr_openapi/models/model_artifact.py index aea9ce2eb2..bde281d693 100644 --- a/clients/python/src/mr_openapi/models/model_artifact.py +++ b/clients/python/src/mr_openapi/models/model_artifact.py @@ -36,11 +36,6 @@ class ModelArtifact(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None name: StrictStr | None = Field( default=None, description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", @@ -95,12 +90,15 @@ class ModelArtifact(BaseModel): description="A human-readable name for the source model. E.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`.", alias="modelSourceName", ) + uri: StrictStr | None = Field( + default=None, + description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", + ) + state: ArtifactState | None = None __properties: ClassVar[list[str]] = [ "customProperties", "description", "externalId", - "uri", - "state", "name", "id", "createTimeSinceEpoch", @@ -116,6 +114,8 @@ class ModelArtifact(BaseModel): "modelSourceGroup", "modelSourceId", "modelSourceName", + "uri", + "state", ] model_config = ConfigDict( @@ -188,8 +188,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), "name": obj.get("name"), "id": obj.get("id"), "createTimeSinceEpoch": obj.get("createTimeSinceEpoch"), @@ -205,5 +203,7 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "modelSourceGroup": obj.get("modelSourceGroup"), "modelSourceId": obj.get("modelSourceId"), "modelSourceName": obj.get("modelSourceName"), + "uri": obj.get("uri"), + "state": obj.get("state"), } ) diff --git a/clients/python/src/mr_openapi/models/model_artifact_create.py b/clients/python/src/mr_openapi/models/model_artifact_create.py index 8cc5055969..7b79f4521c 100644 --- a/clients/python/src/mr_openapi/models/model_artifact_create.py +++ b/clients/python/src/mr_openapi/models/model_artifact_create.py @@ -37,11 +37,6 @@ class ModelArtifactCreate(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None name: StrictStr | None = Field( default=None, description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", @@ -84,12 +79,15 @@ class ModelArtifactCreate(BaseModel): description="A human-readable name for the source model. E.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`.", alias="modelSourceName", ) + uri: StrictStr | None = Field( + default=None, + description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", + ) + state: ArtifactState | None = None __properties: ClassVar[list[str]] = [ "customProperties", "description", "externalId", - "uri", - "state", "name", "artifactType", "modelFormatName", @@ -102,6 +100,8 @@ class ModelArtifactCreate(BaseModel): "modelSourceGroup", "modelSourceId", "modelSourceName", + "uri", + "state", ] model_config = ConfigDict( @@ -168,8 +168,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), "name": obj.get("name"), "artifactType": obj.get("artifactType") if obj.get("artifactType") is not None else "model-artifact", "modelFormatName": obj.get("modelFormatName"), @@ -182,5 +180,7 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "modelSourceGroup": obj.get("modelSourceGroup"), "modelSourceId": obj.get("modelSourceId"), "modelSourceName": obj.get("modelSourceName"), + "uri": obj.get("uri"), + "state": obj.get("state"), } ) diff --git a/clients/python/src/mr_openapi/models/model_artifact_update.py b/clients/python/src/mr_openapi/models/model_artifact_update.py index da6ce71d15..ad68b4213e 100644 --- a/clients/python/src/mr_openapi/models/model_artifact_update.py +++ b/clients/python/src/mr_openapi/models/model_artifact_update.py @@ -36,11 +36,6 @@ class ModelArtifactUpdate(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) - uri: StrictStr | None = Field( - default=None, - description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", - ) - state: ArtifactState | None = None artifact_type: StrictStr | None = Field(default="model-artifact", alias="artifactType") model_format_name: StrictStr | None = Field( default=None, description="Name of the model format.", alias="modelFormatName" @@ -80,12 +75,15 @@ class ModelArtifactUpdate(BaseModel): description="A human-readable name for the source model. E.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`.", alias="modelSourceName", ) + uri: StrictStr | None = Field( + default=None, + description="The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact.", + ) + state: ArtifactState | None = None __properties: ClassVar[list[str]] = [ "customProperties", "description", "externalId", - "uri", - "state", "artifactType", "modelFormatName", "storageKey", @@ -97,6 +95,8 @@ class ModelArtifactUpdate(BaseModel): "modelSourceGroup", "modelSourceId", "modelSourceName", + "uri", + "state", ] model_config = ConfigDict( @@ -163,8 +163,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), - "uri": obj.get("uri"), - "state": obj.get("state"), "artifactType": obj.get("artifactType") if obj.get("artifactType") is not None else "model-artifact", "modelFormatName": obj.get("modelFormatName"), "storageKey": obj.get("storageKey"), @@ -176,5 +174,7 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "modelSourceGroup": obj.get("modelSourceGroup"), "modelSourceId": obj.get("modelSourceId"), "modelSourceName": obj.get("modelSourceName"), + "uri": obj.get("uri"), + "state": obj.get("state"), } ) diff --git a/clients/python/src/mr_openapi/models/serve_model.py b/clients/python/src/mr_openapi/models/serve_model.py index 0c4473942a..4b95ecef5a 100644 --- a/clients/python/src/mr_openapi/models/serve_model.py +++ b/clients/python/src/mr_openapi/models/serve_model.py @@ -25,7 +25,6 @@ class ServeModel(BaseModel): """An ML model serving action.""" # noqa: E501 - last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") custom_properties: dict[str, MetadataValue] | None = Field( default=None, description="User provided custom properties which are not defined by its type.", @@ -52,11 +51,11 @@ class ServeModel(BaseModel): description="Output only. Last update time of the resource since epoch in millisecond since epoch.", alias="lastUpdateTimeSinceEpoch", ) + last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") model_version_id: StrictStr = Field( description="ID of the `ModelVersion` that was served in `InferenceService`.", alias="modelVersionId" ) __properties: ClassVar[list[str]] = [ - "lastKnownState", "customProperties", "description", "externalId", @@ -64,6 +63,7 @@ class ServeModel(BaseModel): "id", "createTimeSinceEpoch", "lastUpdateTimeSinceEpoch", + "lastKnownState", "modelVersionId", ] @@ -129,7 +129,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: return cls.model_validate( { - "lastKnownState": obj.get("lastKnownState"), "customProperties": ( {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} if obj.get("customProperties") is not None @@ -141,6 +140,7 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "id": obj.get("id"), "createTimeSinceEpoch": obj.get("createTimeSinceEpoch"), "lastUpdateTimeSinceEpoch": obj.get("lastUpdateTimeSinceEpoch"), + "lastKnownState": obj.get("lastKnownState"), "modelVersionId": obj.get("modelVersionId"), } ) diff --git a/clients/python/src/mr_openapi/models/serve_model_create.py b/clients/python/src/mr_openapi/models/serve_model_create.py index 005e601b36..95893d3be9 100644 --- a/clients/python/src/mr_openapi/models/serve_model_create.py +++ b/clients/python/src/mr_openapi/models/serve_model_create.py @@ -25,7 +25,6 @@ class ServeModelCreate(BaseModel): """An ML model serving action.""" # noqa: E501 - last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") custom_properties: dict[str, MetadataValue] | None = Field( default=None, description="User provided custom properties which are not defined by its type.", @@ -41,15 +40,16 @@ class ServeModelCreate(BaseModel): default=None, description="The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set.", ) + last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") model_version_id: StrictStr = Field( description="ID of the `ModelVersion` that was served in `InferenceService`.", alias="modelVersionId" ) __properties: ClassVar[list[str]] = [ - "lastKnownState", "customProperties", "description", "externalId", "name", + "lastKnownState", "modelVersionId", ] @@ -110,7 +110,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: return cls.model_validate( { - "lastKnownState": obj.get("lastKnownState"), "customProperties": ( {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} if obj.get("customProperties") is not None @@ -119,6 +118,7 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "description": obj.get("description"), "externalId": obj.get("externalId"), "name": obj.get("name"), + "lastKnownState": obj.get("lastKnownState"), "modelVersionId": obj.get("modelVersionId"), } ) diff --git a/clients/python/src/mr_openapi/models/serve_model_update.py b/clients/python/src/mr_openapi/models/serve_model_update.py index 59c8cce096..7a12448ac1 100644 --- a/clients/python/src/mr_openapi/models/serve_model_update.py +++ b/clients/python/src/mr_openapi/models/serve_model_update.py @@ -25,7 +25,6 @@ class ServeModelUpdate(BaseModel): """An ML model serving action.""" # noqa: E501 - last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") custom_properties: dict[str, MetadataValue] | None = Field( default=None, description="User provided custom properties which are not defined by its type.", @@ -37,7 +36,8 @@ class ServeModelUpdate(BaseModel): description="The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance.", alias="externalId", ) - __properties: ClassVar[list[str]] = ["lastKnownState", "customProperties", "description", "externalId"] + last_known_state: ExecutionState | None = Field(default=None, alias="lastKnownState") + __properties: ClassVar[list[str]] = ["customProperties", "description", "externalId", "lastKnownState"] model_config = ConfigDict( populate_by_name=True, @@ -96,7 +96,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: return cls.model_validate( { - "lastKnownState": obj.get("lastKnownState"), "customProperties": ( {_k: MetadataValue.from_dict(_v) for _k, _v in obj["customProperties"].items()} if obj.get("customProperties") is not None @@ -104,5 +103,6 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: ), "description": obj.get("description"), "externalId": obj.get("externalId"), + "lastKnownState": obj.get("lastKnownState"), } ) diff --git a/clients/python/tests/test_client.py b/clients/python/tests/test_client.py index 93fe592ec6..ff354d6a77 100644 --- a/clients/python/tests/test_client.py +++ b/clients/python/tests/test_client.py @@ -843,8 +843,7 @@ async def test_custom_async_runner_with_ray( client_attrs: dict[str, any], client: ModelRegistry ): import asyncio - - import ray + ray = pytest.importorskip("ray") import uvloop # Check to make sure the uvloop event loop is running @@ -998,3 +997,53 @@ async def test_register_model_with_owner(client): assert rm.owner == model_params["owner"] assert (_get_rm := client.get_registered_model(name=model_params["name"])) assert _get_rm.owner == model_params["owner"] + + +@pytest.mark.e2e +async def test_register_model_with_s3_data_connection(client: ModelRegistry): + """As a MLOps engineer I want to track a Model from an S3 bucket Data Connection""" + data_connection_name = "aws-connection-my-data-connection" + s3_bucket = "my-bucket" + s3_path = "my-path" + s3_endpoint = "https://minio-api.acme.org" + s3_region = "us-east-1" + + # Create the S3 URI using the utility function + uri = utils.s3_uri_from( + path=s3_path, + bucket=s3_bucket, + endpoint=s3_endpoint, + region=s3_region + ) + + model_params = { + "name": "test_model", + "uri": uri, + "model_format_name": "onnx", + "model_format_version": "1", + "version": "v1.0", + "description": "The Model", # This will be set on the model version + "storage_key": data_connection_name, + "storage_path": s3_path + } + + # Register the model with S3 connection details + rm = client.register_model(**model_params) + assert rm.id + + # Get and verify the registered model + rm_by_name = client.get_registered_model(model_params["name"]) + assert rm_by_name.id == rm.id + + # Get and verify the model version + mv = client.get_model_version(model_params["name"], model_params["version"]) + assert mv.description == "The Model" + assert mv.name == "v1.0" + + # Get and verify the model artifact + ma = client.get_model_artifact(model_params["name"], model_params["version"]) + assert ma.uri == uri + assert ma.model_format_name == "onnx" + assert ma.model_format_version == "1" + assert ma.storage_key == data_connection_name + assert ma.storage_path == s3_path diff --git a/clients/python/tests/types/test_context.py b/clients/python/tests/types/test_context.py new file mode 100644 index 0000000000..a583f1a487 --- /dev/null +++ b/clients/python/tests/types/test_context.py @@ -0,0 +1,57 @@ +from model_registry.types.contexts import ModelVersion, RegisteredModel + + +def test_model_version_repr(): + """Test the repr of a ModelVersion, with name to the front, ensuring other fields are also present""" + mv = ModelVersion(name="Version 1", id="123", author="test_author", description="test_description") + print(mv) + assert str(mv).startswith("name='Version 1'") + assert "id='123'" in str(mv) + assert "author='test_author'" in str(mv) + assert "description='test_description'" in str(mv) + print(repr(mv)) + assert repr(mv).startswith("ModelVersion(name='Version 1'") + assert "id='123'" in str(mv) + assert "author='test_author'" in str(mv) + assert "description='test_description'" in str(mv) + + # Test with empty name, not really used in practice but to increase coverage + mv = ModelVersion(name="", id="123", author="test_author", description="test_description") + print(mv) + assert str(mv).startswith("name=''") + assert "id='123'" in str(mv) + assert "author='test_author'" in str(mv) + assert "description='test_description'" in str(mv) + print(repr(mv)) + assert repr(mv).startswith("ModelVersion(name=''") + assert "id='123'" in str(mv) + assert "author='test_author'" in str(mv) + assert "description='test_description'" in str(mv) + + +def test_registered_model_repr(): + """Test the repr of a RegisteredModel, with name to the front, ensuring other fields are also present""" + rm = RegisteredModel(name="Model 1", id="123", owner="test_owner", description="test_description") + print(rm) + assert str(rm).startswith("name='Model 1'") + assert "id='123'" in str(rm) + assert "owner='test_owner'" in str(rm) + assert "description='test_description'" in str(rm) + print(repr(rm)) + assert repr(rm).startswith("RegisteredModel(name='Model 1'") + assert "id='123'" in str(rm) + assert "owner='test_owner'" in str(rm) + assert "description='test_description'" in str(rm) + + # Test with empty name, not really used in practice but to increase coverage + rm = RegisteredModel(name="", id="123", owner="test_owner", description="test_description") + print(rm) + assert str(rm).startswith("name=''") + assert "id='123'" in str(rm) + assert "owner='test_owner'" in str(rm) + assert "description='test_description'" in str(rm) + print(repr(rm)) + assert repr(rm).startswith("RegisteredModel(name=''") + assert "id='123'" in str(rm) + assert "owner='test_owner'" in str(rm) + assert "description='test_description'" in str(rm) diff --git a/clients/ui/Dockerfile b/clients/ui/Dockerfile index d61463aea6..6de3416e96 100644 --- a/clients/ui/Dockerfile +++ b/clients/ui/Dockerfile @@ -4,7 +4,7 @@ ARG BFF_SOURCE_CODE=./bff # Set the base images for the build stages ARG NODE_BASE_IMAGE=node:20 -ARG GOLANG_BASE_IMAGE=golang:1.23.5 +ARG GOLANG_BASE_IMAGE=golang:1.24.3 ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot # UI build stage diff --git a/clients/ui/bff/.gitignore b/clients/ui/bff/.gitignore index ee5236afe8..79751c7cb3 100644 --- a/clients/ui/bff/.gitignore +++ b/clients/ui/bff/.gitignore @@ -1,2 +1,6 @@ /bin -/static-local-run \ No newline at end of file +/static-local-run +# Ignore personal vscode settings but keep launch/tasks +.vscode/* +!.vscode/launch.json +!.vscode/tasks.json diff --git a/clients/ui/bff/.vscode/launch.json b/clients/ui/bff/.vscode/launch.json new file mode 100644 index 0000000000..13ba91b86c --- /dev/null +++ b/clients/ui/bff/.vscode/launch.json @@ -0,0 +1,68 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug BFF (default mocks enabled)", + "type": "go", + "request": "launch", + "mode": "exec", + "program": "${workspaceFolder}/bin/bff", + "args": [ + "--port=4000", + "--auth-method=internal", + "--auth-token-header=Authorization", + "--auth-token-prefix=Bearer", + "--static-assets-dir=./static", + "--mock-k8s-client=true", + "--mock-mr-client=true", + "--dev-mode=false", + "--dev-mode-port=8080", + "--standalone-mode=true", + "--log-level=info" + ], + "preLaunchTask": "make build debug" + }, + { + "name": "Debug BFF (MOCK_K8S_CLIENT=false, MOCK_MR_CLIENT=true)", + "type": "go", + "request": "launch", + "mode": "exec", + "program": "${workspaceFolder}/bin/bff", + "args": [ + "--port=4000", + "--auth-method=internal", + "--auth-token-header=Authorization", + "--auth-token-prefix=Bearer", + "--static-assets-dir=./static", + "--mock-k8s-client=false", + "--mock-mr-client=true", + "--dev-mode=false", + "--dev-mode-port=8080", + "--standalone-mode=true", + "--log-level=info" + ], + "preLaunchTask": "make build debug" + }, + { + "name": "Debug BFF (MOCK_K8S_CLIENT=false, MOCK_MR_CLIENT=false)", + "type": "go", + "request": "launch", + "mode": "exec", + "program": "${workspaceFolder}/bin/bff", + "args": [ + "--port=4000", + "--auth-method=internal", + "--auth-token-header=Authorization", + "--auth-token-prefix=Bearer", + "--static-assets-dir=./static", + "--mock-k8s-client=false", + "--mock-mr-client=false", + "--dev-mode=false", + "--dev-mode-port=8080", + "--standalone-mode=true", + "--log-level=info" + ], + "preLaunchTask": "make build debug" + } + ] +} diff --git a/clients/ui/bff/.vscode/tasks.json b/clients/ui/bff/.vscode/tasks.json new file mode 100644 index 0000000000..072b246808 --- /dev/null +++ b/clients/ui/bff/.vscode/tasks.json @@ -0,0 +1,13 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "make build debug", + "type": "shell", + "command": "make build DEBUG=true", + "group": "build", + "problemMatcher": [] + } + ] + } + \ No newline at end of file diff --git a/clients/ui/bff/Makefile b/clients/ui/bff/Makefile index 986cc1fb3a..3a4ee6de16 100644 --- a/clients/ui/bff/Makefile +++ b/clients/ui/bff/Makefile @@ -13,6 +13,8 @@ STATIC_ASSETS_DIR ?= ./static ENVTEST_K8S_VERSION = 1.29.0 LOG_LEVEL ?= info ALLOWED_ORIGINS ?= "" +DEBUG ?= false +GCFLAGS_DEBUG := -gcflags="all=-N -l" .PHONY: all all: build @@ -48,7 +50,11 @@ test: fmt vet envtest ## Runs the full test suite. .PHONY: build build: fmt vet test ## Builds the project to produce a binary executable. +ifeq ($(DEBUG), true) ## If DEBUG is true, build with debugging symbols + go build $(GCFLAGS_DEBUG) -o bin/bff ./cmd +else go build -o bin/bff ./cmd +endif .PHONY: run run: fmt vet envtest ## Runs the project. diff --git a/clients/ui/bff/README.md b/clients/ui/bff/README.md index 426807dae2..70c45a40ba 100644 --- a/clients/ui/bff/README.md +++ b/clients/ui/bff/README.md @@ -6,7 +6,7 @@ The Kubeflow Model Registry UI BFF is the _backend for frontend_ (BFF) used by t ### Dependencies -- Go >= 1.23.5 +- Go >= 1.24.3 ### Running model registry & ml-metadata @@ -52,6 +52,7 @@ make run LOG_LEVEL=DEBUG ``` ## Running the linter locally + The BFF directory uses golangci-lint to combine multiple linters for a more comprehensive linting process. To install and run simply use: ```shell @@ -62,6 +63,7 @@ make lint For more information on configuring golangci-lint see the [documentation](https://golangci-lint.run/). ## Running the linter locally + The BFF directory uses golangci-lint to combine multiple linters for a more comprehensive linting process. To install and run simply use: ```shell @@ -98,15 +100,18 @@ See the [OpenAPI specification](../api/openapi/mod-arch.yaml) for a complete lis You will need to inject your requests with a `kubeflow-userid` header and namespace for authorization purposes. When running the service with the mocked Kubernetes client (MOCK_K8S_CLIENT=true), the user `user@example.com` is preconfigured with the necessary RBAC permissions to perform these actions. + ``` -# GET /v1/healthcheck +# GET /v1/healthcheck curl -i "localhost:4000/healthcheck" -``` ``` -# GET /v1/user + +``` +# GET /v1/user curl -i -H "kubeflow-userid: user@example.com" "localhost:4000/api/v1/user" curl -i -H "Authorization: Bearer $TOKEN" "localhost:4000/api/v1/user" ``` + ``` # GET /v1/namespaces (only works when DEV_MODE=true) curl -i -H "kubeflow-userid: user@example.com" "localhost:4000/api/v1/namespaces" @@ -376,10 +381,10 @@ The mock Kubernetes environment is activated when the environment variable `MOCK The BFF supports two authentication modes, selectable via the --auth-method flag or AUTH_METHOD environment variable (default: internal): - `internal`: Uses the credentials of the running backend. - - If running inside the cluster, it uses the pod’s service account. - - If running locally (e.g. for development), it uses the current user's active kubeconfig context. - - In this mode, user identity is passed via the kubeflow-userid and optionally kubeflow-groups headers. - - This is the default mode and works well with mock clients and local testing. + - If running inside the cluster, it uses the pod’s service account. + - If running locally (e.g. for development), it uses the current user's active kubeconfig context. + - In this mode, user identity is passed via the kubeflow-userid and optionally kubeflow-groups headers. + - This is the default mode and works well with mock clients and local testing. - `user_token`: Uses a user-provided Bearer token for authentication. - The token must be passed in the `Authorization` header using the Bearer schema (e.g., `Authorization: Bearer `). - This method works with OIDC-authenticated flows and frontend proxies that preserve standard Bearer tokens. @@ -388,18 +393,21 @@ The BFF supports two authentication modes, selectable via the --auth-method flag Authorization is performed using Kubernetes access reviews, validating whether the user (or their groups) can perform certain actions. There are two review mechanisms depending on the authentication mode: + - Internal mode (auth-method=internal): -Uses SubjectAccessReview (SAR) to check whether the impersonated user (from kubeflow-userid and kubeflow-groups headers) has the required permissions. + Uses SubjectAccessReview (SAR) to check whether the impersonated user (from kubeflow-userid and kubeflow-groups headers) has the required permissions. - User token mode (auth-method=user_token): Uses SelfSubjectAccessReview (SSAR), leveraging the Bearer token provided in the `Authorization` header to check the current user's permissions directly. ##### Authorization logic -* Access to Model Registry List (/v1/model_registry): - - Checks for get and list on services in the target namespace. - - If the user (or groups, in internal mode) has permission, access is granted. -* Access to Specific Model Registry Endpoints (/v1/model_registry/{model_registry_id}/...): - - Checks for get on the specific service (identified by model_registry_id) in the namespace. - - If authorized, access is granted. +- Access to Model Registry List (/v1/model_registry): + + - Checks for get and list on services in the target namespace. + - If the user (or groups, in internal mode) has permission, access is granted. + +- Access to Specific Model Registry Endpoints (/v1/model_registry/{model_registry_id}/...): + - Checks for get on the specific service (identified by model_registry_id) in the namespace. + - If authorized, access is granted. ##### Overriding Token Header and Prefix @@ -408,18 +416,19 @@ By default, the BFF expects the token to be passed in the standard Authorization ```shell Authorization: Bearer ``` + If you're integrating with a proxy or tool that uses a custom header (e.g., X-Forwarded-Access-Token without a prefix), you can override this behavior using environment variables or Makefile arguments. ```shell make run AUTH_METHOD=user_token AUTH_TOKEN_HEADER=X-Forwarded-Access-Token AUTH_TOKEN_PREFIX="" ``` + This will configure the BFF to extract the raw token from the following header: ```shell X-Forwarded-Access-Token: ``` - #### 5. How do I allow CORS requests from other origins When serving the UI directly from the BFF there is no need for any CORS headers to be served, by default they are turned off for security reasons. diff --git a/clients/ui/bff/go.mod b/clients/ui/bff/go.mod index b377d70800..6f75e260f6 100644 --- a/clients/ui/bff/go.mod +++ b/clients/ui/bff/go.mod @@ -1,70 +1,68 @@ module github.com/kubeflow/model-registry/ui/bff -go 1.23.5 +go 1.24.3 require ( github.com/brianvoe/gofakeit/v7 v7.1.2 github.com/google/uuid v1.6.0 github.com/julienschmidt/httprouter v1.3.0 - github.com/kubeflow/model-registry v0.2.14 + github.com/kubeflow/model-registry v0.2.17 github.com/onsi/ginkgo/v2 v2.23.4 github.com/onsi/gomega v1.37.0 github.com/rs/cors v1.11.1 github.com/stretchr/testify v1.10.0 - k8s.io/api v0.32.3 - k8s.io/apimachinery v0.32.3 - k8s.io/client-go v0.32.3 - sigs.k8s.io/controller-runtime v0.19.1 + k8s.io/api v0.33.0 + k8s.io/apimachinery v0.33.0 + k8s.io/client-go v0.33.0 + sigs.k8s.io/controller-runtime v0.20.4 ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch/v5 v5.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/fxamacker/cbor/v2 v2.8.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/jsonpointer v0.21.1 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/x448/float16 v0.8.4 // indirect go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/net v0.38.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/net v0.39.0 // indirect + golang.org/x/oauth2 v0.29.0 // indirect golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.7.0 // indirect + golang.org/x/term v0.31.0 // indirect + golang.org/x/text v0.24.0 // indirect + golang.org/x/time v0.11.0 // indirect golang.org/x/tools v0.31.0 // indirect - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.31.0 // indirect + k8s.io/apiextensions-apiserver v0.32.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect + k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/clients/ui/bff/go.sum b/clients/ui/bff/go.sum index 98b639d9b4..299680d487 100644 --- a/clients/ui/bff/go.sum +++ b/clients/ui/bff/go.sum @@ -4,45 +4,38 @@ github.com/brianvoe/gofakeit/v7 v7.1.2 h1:vSKaVScNhWVpf1rlyEKSvO8zKZfuDtGqoIHT// github.com/brianvoe/gofakeit/v7 v7.1.2/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= -github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= +github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= +github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= +github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -55,17 +48,14 @@ github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4d github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubeflow/model-registry v0.2.14 h1:ZJmsWEvyecSRw91Irr2oLgyzCJKVJ0s+16ycxpZaEP0= -github.com/kubeflow/model-registry v0.2.14/go.mod h1:iUN9ariCxPzMlmR5dAzuk2N62SR0dmE534Vn3vdsmU8= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/kubeflow/model-registry v0.2.17 h1:5VSZ2g8Zu7nAbu6onuTlcdg3TjRadH73mkkYgkKpSEE= +github.com/kubeflow/model-registry v0.2.17/go.mod h1:cG1/kRUXo06uTJWp78qylPtB6Pd932M07vhawAqedt8= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -84,29 +74,24 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= +github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= +github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -119,23 +104,21 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= +golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -144,14 +127,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -162,10 +145,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= -gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= +gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -173,28 +156,30 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSP gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= -k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/api v0.33.0 h1:yTgZVn1XEe6opVpP1FylmNrIFWuDqe2H0V8CT5gxfIU= +k8s.io/api v0.33.0/go.mod h1:CTO61ECK/KU7haa3qq8sarQ0biLq2ju405IZAd9zsiM= +k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= +k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= +k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ= +k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.0 h1:UASR0sAYVUzs2kYuKn/ZakZlcs2bEHaizrrHUZg0G98= +k8s.io/client-go v0.33.0/go.mod h1:kGkd+l/gNGg8GYWAPr0xF1rRKvVWvzh9vmZAMXtaKOg= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.19.1 h1:Son+Q40+Be3QWb+niBXAg2vFiYWolDjjRfO8hn/cxOk= -sigs.k8s.io/controller-runtime v0.19.1/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e h1:KqK5c/ghOm8xkHYhlodbp6i6+r+ChV2vuAuVRdFbLro= +k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= +sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/clients/ui/bff/internal/api/errors.go b/clients/ui/bff/internal/api/errors.go index 275a814875..9c4b938191 100644 --- a/clients/ui/bff/internal/api/errors.go +++ b/clients/ui/bff/internal/api/errors.go @@ -3,9 +3,10 @@ package api import ( "encoding/json" "fmt" - "github.com/kubeflow/model-registry/ui/bff/internal/integrations/mrserver" "net/http" "strconv" + + "github.com/kubeflow/model-registry/ui/bff/internal/integrations/mrserver" ) type HTTPError struct { @@ -43,11 +44,14 @@ func (app *App) badRequestResponse(w http.ResponseWriter, r *http.Request, err e } func (app *App) forbiddenResponse(w http.ResponseWriter, r *http.Request, message string) { + // Log the detailed error message as a warning + app.logger.Warn("Access forbidden", "message", message, "method", r.Method, "uri", r.URL.RequestURI()) + httpError := &mrserver.HTTPError{ StatusCode: http.StatusForbidden, ErrorResponse: mrserver.ErrorResponse{ Code: strconv.Itoa(http.StatusForbidden), - Message: message, + Message: "Access forbidden", }, } app.errorResponse(w, r, httpError) diff --git a/clients/ui/bff/internal/api/middleware.go b/clients/ui/bff/internal/api/middleware.go index a7880fd912..d14415271b 100644 --- a/clients/ui/bff/internal/api/middleware.go +++ b/clients/ui/bff/internal/api/middleware.go @@ -3,13 +3,14 @@ package api import ( "context" "fmt" - "github.com/kubeflow/model-registry/ui/bff/internal/integrations/kubernetes" - "github.com/kubeflow/model-registry/ui/bff/internal/integrations/mrserver" "log/slog" "net/http" "runtime/debug" "strings" + "github.com/kubeflow/model-registry/ui/bff/internal/integrations/kubernetes" + "github.com/kubeflow/model-registry/ui/bff/internal/integrations/mrserver" + "github.com/google/uuid" "github.com/julienschmidt/httprouter" "github.com/kubeflow/model-registry/ui/bff/internal/constants" @@ -180,11 +181,11 @@ func (app *App) RequireListServiceAccessInNamespace(next func(http.ResponseWrite allowed, err := client.CanListServicesInNamespace(ctx, identity, namespace) if err != nil { - app.forbiddenResponse(w, r, fmt.Sprintf("failed to perform SAR: %v", err)) + app.forbiddenResponse(w, r, fmt.Sprintf("SAR or SelfSAR failed for namespace %s: %v", namespace, err)) return } if !allowed { - app.forbiddenResponse(w, r, "access denied") + app.forbiddenResponse(w, r, fmt.Sprintf("SAR or SelfSAR denied access to namespace %s", namespace)) return } @@ -228,11 +229,11 @@ func (app *App) RequireAccessToService(next func(http.ResponseWriter, *http.Requ allowed, err := client.CanAccessServiceInNamespace(r.Context(), identity, namespace, serviceName) if err != nil { - app.forbiddenResponse(w, r, "failed to perform SAR: %v") + app.forbiddenResponse(w, r, fmt.Sprintf("SAR or SelfSAR AccessReview failed for service %s in namespace %s: %v", serviceName, namespace, err)) return } if !allowed { - app.forbiddenResponse(w, r, "access denied") + app.forbiddenResponse(w, r, fmt.Sprintf("SAR or SelfSAR AccessReview denied access to service %s in namespace %s", serviceName, namespace)) return } diff --git a/clients/ui/frontend/package-lock.json b/clients/ui/frontend/package-lock.json index 363cb38da2..547d34076c 100644 --- a/clients/ui/frontend/package-lock.json +++ b/clients/ui/frontend/package-lock.json @@ -32,8 +32,8 @@ "@babel/preset-env": "^7.26.9", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.5", - "@cypress/code-coverage": "^3.13.12", - "@module-federation/enhanced": "^0.11.1", + "@cypress/code-coverage": "^3.14.1", + "@module-federation/enhanced": "^0.13.1", "@mui/icons-material": "^6.4.8", "@mui/material": "^6.1.7", "@mui/types": "^7.2.20", @@ -60,7 +60,7 @@ "cypress-high-resolution": "^1.0.0", "cypress-mochawesome-reporter": "^3.8.2", "cypress-multi-reporters": "^2.0.4", - "dotenv": "^16.4.7", + "dotenv": "^16.5.0", "dotenv-expand": "^5.1.0", "dotenv-webpack": "^6.0.0", "expect": "^29.7.0", @@ -70,7 +70,7 @@ "imagemin": "^9.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "junit-report-merger": "^7.0.0", + "junit-report-merger": "^7.0.1", "mini-css-extract-plugin": "^2.9.0", "postcss": "^8.4.49", "prettier": "^3.3.3", @@ -78,7 +78,7 @@ "raw-loader": "^4.0.2", "react-refresh": "^0.14.2", "regenerator-runtime": "^0.14.1", - "sass": "^1.83.0", + "sass": "^1.87.0", "sass-loader": "^13.2.0", "serve": "^14.2.4", "speed-measure-webpack-plugin": "^1.5.0", @@ -102,8 +102,8 @@ "node": ">=20.0.0" }, "optionalDependencies": { - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.31.1", + "@typescript-eslint/parser": "^8.31.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-node": "^0.3.7", @@ -113,8 +113,8 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-no-relative-import-paths": "^1.6.1", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-react": "^7.37.2", + "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0" } }, @@ -1998,9 +1998,9 @@ } }, "node_modules/@cypress/code-coverage": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.13.12.tgz", - "integrity": "sha512-JPNlzk9xgCXRIcFCGoSy0qx3FFcaJOGjGkRAPYewYWLukZbcFSjxfNuoK6IMkaJb+miWdzLV0tsAko9eQDNBiA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.14.1.tgz", + "integrity": "sha512-sob/cht1BxEXwr0XC5XZbHWoit0UJmk3se/otx305BmxN9Mc33lTD625O3PAfOBPxfS7LKTZLAtryG5dURL62Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2247,10 +2247,384 @@ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "license": "MIT", "optional": true, "dependencies": { @@ -3001,13 +3375,39 @@ "dev": true, "license": "MIT" }, + "node_modules/@modern-js/node-bundle-require": { + "version": "2.65.1", + "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.65.1.tgz", + "integrity": "sha512-XpEkciVEfDbkkLUI662ZFlI9tXsUQtLXk4NRJDBGosNnk9uL2XszmC8sKsdCSLK8AYuPW2w6MTVWuJsOR0EU8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@modern-js/utils": "2.65.1", + "@swc/helpers": "0.5.13", + "esbuild": "0.17.19" + } + }, + "node_modules/@modern-js/utils": { + "version": "2.65.1", + "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.65.1.tgz", + "integrity": "sha512-HrChf19F+6nALo5XPra8ycjhXGQfGi23+S7Y2FLfTKe8vaNnky8duT/XvRWpbS4pp3SQj8ryO8m/qWSsJ1Rogw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/helpers": "0.5.13", + "caniuse-lite": "^1.0.30001520", + "lodash": "^4.17.21", + "rslog": "^1.1.0" + } + }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.11.1.tgz", - "integrity": "sha512-SUoJE7dEQZVUwBGN+mcMxLyQcQT0RAOZfcjp6Jq3uS6dTtEmJiR4KKGAaNYBlaszBh/HxmiM1U+zE3G126O7tQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.13.1.tgz", + "integrity": "sha512-3RgGd8KcRw5vibnxWa1NUWwfb0tKwn8OvHeQ4GFKzMvDLm+QpCgQd9LeTEBP38wZgGXVtIJR3y5FPnufWswFKw==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.11.1", + "@module-federation/sdk": "0.13.1", "@types/semver": "7.5.8", "semver": "7.6.3" } @@ -3017,6 +3417,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3024,14 +3425,59 @@ "node": ">=10" } }, + "node_modules/@module-federation/cli": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.13.1.tgz", + "integrity": "sha512-ej7eZTVUiRMor37pkl2y3hbXwcaNvPgbZJVO+hb2c7cKBjWto7AndgR5qcKpcXXXlhbGwtnI+VrgldruKC+AqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@modern-js/node-bundle-require": "2.65.1", + "@module-federation/dts-plugin": "0.13.1", + "@module-federation/sdk": "0.13.1", + "chalk": "3.0.0", + "commander": "11.1.0" + }, + "bin": { + "mf": "bin/mf.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@module-federation/cli/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/cli/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/@module-federation/data-prefetch": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.11.1.tgz", - "integrity": "sha512-94CiNMHqFdaP93RzzEkMyAQcjXMdlSrsMd9R0htzW23keSnerWnmTcRfkvuzKSAR5cqYszGlrYH9CLyMl1T56A==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.13.1.tgz", + "integrity": "sha512-hj3R72rRyune4fb4V4OFmo1Rfa9T9u0so2Q4vt69frPc2NV2FPPJkIvHGs/geGTLOgt4nn7OH1/ukmR3wWvSuA==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.11.1", - "@module-federation/sdk": "0.11.1", + "@module-federation/runtime": "0.13.1", + "@module-federation/sdk": "0.13.1", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -3040,22 +3486,23 @@ } }, "node_modules/@module-federation/dts-plugin": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.11.1.tgz", - "integrity": "sha512-1fsnNb1dIYFoZ9Gk0gVXb/7+YDm0yWSBsVQvGLBOxMSaf1aF12mVi7MF9+l/ax4BgtgFvqVwekKssAbOXrjsig==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.13.1.tgz", + "integrity": "sha512-PQMs57h9s5pCkLWZ0IyDGCcac4VZ+GgJE40pAWrOQ+/AgTC+WFyAT16M7PsRENS57Qed4wWQwgfOjS9zmfxKJA==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.1", - "@module-federation/managers": "0.11.1", - "@module-federation/sdk": "0.11.1", - "@module-federation/third-party-dts-extractor": "0.11.1", + "@module-federation/error-codes": "0.13.1", + "@module-federation/managers": "0.13.1", + "@module-federation/sdk": "0.13.1", + "@module-federation/third-party-dts-extractor": "0.13.1", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "2.15.4", + "koa": "2.16.1", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -3077,6 +3524,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3086,24 +3534,30 @@ } }, "node_modules/@module-federation/enhanced": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.11.1.tgz", - "integrity": "sha512-B+2kWuzkwEZvpLxwiah2gxHov9Xw2fmXZKvMqBwDSGCOobTtdipAjAeG0AXm7mdEO1Xw/SkZgEDLYQxW27exjA==", - "dev": true, - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.11.1", - "@module-federation/data-prefetch": "0.11.1", - "@module-federation/dts-plugin": "0.11.1", - "@module-federation/error-codes": "0.11.1", - "@module-federation/inject-external-runtime-core-plugin": "0.11.1", - "@module-federation/managers": "0.11.1", - "@module-federation/manifest": "0.11.1", - "@module-federation/rspack": "0.11.1", - "@module-federation/runtime-tools": "0.11.1", - "@module-federation/sdk": "0.11.1", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.13.1.tgz", + "integrity": "sha512-jbbk68RnvNmusGGcXNXVDJAzJOFB/hV+RVV2wWNWmBOVkDZPiWj7aFb0cJAwc9EYZbPel3QzRitZJ73+SaH1IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.13.1", + "@module-federation/cli": "0.13.1", + "@module-federation/data-prefetch": "0.13.1", + "@module-federation/dts-plugin": "0.13.1", + "@module-federation/error-codes": "0.13.1", + "@module-federation/inject-external-runtime-core-plugin": "0.13.1", + "@module-federation/managers": "0.13.1", + "@module-federation/manifest": "0.13.1", + "@module-federation/rspack": "0.13.1", + "@module-federation/runtime-tools": "0.13.1", + "@module-federation/sdk": "0.13.1", "btoa": "^1.2.1", + "schema-utils": "^4.3.0", "upath": "2.0.1" }, + "bin": { + "mf": "bin/mf.js" + }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", "vue-tsc": ">=1.0.24", @@ -3122,40 +3576,44 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.11.1.tgz", - "integrity": "sha512-N1cs1qwrO8cU/OzfnBbr+3FaVbrJk6QEAsQ8H+YxGRrh/kHsR2BKpZCX79jTG27oDbz45FLjQ98YucMMXC24EA==", - "dev": true + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.1.tgz", + "integrity": "sha512-azgGDBnFRfqlivHOl96ZjlFUFlukESz2Rnnz/pINiSqoBBNjUE0fcAZP4X6jgrVITuEg90YkruZa7pW9I3m7Uw==", + "dev": true, + "license": "MIT" }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.11.1.tgz", - "integrity": "sha512-giayNxsx7XK86aIzydjtnn8UD8qYyBcVwmsFEEXXA02Jod36CGRFcd0eQ6TzgVEF7kE3iZkpHEKJBGontl32Qg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.13.1.tgz", + "integrity": "sha512-K+ltl2AqVqlsvEds1PffCMLDMlC5lvdkyMXOfcZO6u0O4dZlaTtZbT32NchY7kIEvEsj0wyYhX1i2DnsbHpUBw==", "dev": true, + "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.11.1" + "@module-federation/runtime-tools": "0.13.1" } }, "node_modules/@module-federation/managers": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.11.1.tgz", - "integrity": "sha512-qEgJE4qFfIaPVpGncsCvn5eqC6VJ8wT2jwPF2+27cpU5IqZwvfIBZlIjUkGEDPjUtbS10JdGKBfLFrcI+p9i5A==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.1.tgz", + "integrity": "sha512-vQMrqSFQxjSuGgByC2wcY7zUTmVfhzCyDpnCCq0PtaozK8DcgwsEMzrAT3dbg8ifGUmse/xiRIbTmS5leKK+UQ==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.11.1", + "@module-federation/sdk": "0.13.1", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/manifest": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.11.1.tgz", - "integrity": "sha512-y4zoS4QJMn6OVtY3Wkq3khtjVCU3J8Pnb1CbjM5xoJ7jy/qZhTnDJd194czoQgzx4MnP+BR5jshEQha9GCFPzg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.13.1.tgz", + "integrity": "sha512-XcuFtLycoR0jQj8op+w20V5n459blNBvGXe//AwkEppQERk8SM5kQgIPvOVbZ8zGx7tl/F2HGTDVZlhDiKzIew==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.11.1", - "@module-federation/managers": "0.11.1", - "@module-federation/sdk": "0.11.1", + "@module-federation/dts-plugin": "0.13.1", + "@module-federation/managers": "0.13.1", + "@module-federation/sdk": "0.13.1", "chalk": "3.0.0", "find-pkg": "2.0.0" } @@ -3165,6 +3623,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3174,18 +3633,19 @@ } }, "node_modules/@module-federation/rspack": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.11.1.tgz", - "integrity": "sha512-hhikMBb7qSWCKtoCPO1QLoJwu4BsZPAKs9nychLXakMPQEGByrnh/upVb1C2wep2C4Ax9sjuFT7zD/3CdHOmGg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.13.1.tgz", + "integrity": "sha512-+qz8sW99SYDULajjjn4rSNaI4rogEPVOZsBvT6y0PdfpMD/wZxvh5HlV0u7+5DgWEjgrdm0cJHBHChlIbV/CMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.11.1", - "@module-federation/dts-plugin": "0.11.1", - "@module-federation/inject-external-runtime-core-plugin": "0.11.1", - "@module-federation/managers": "0.11.1", - "@module-federation/manifest": "0.11.1", - "@module-federation/runtime-tools": "0.11.1", - "@module-federation/sdk": "0.11.1", + "@module-federation/bridge-react-webpack-plugin": "0.13.1", + "@module-federation/dts-plugin": "0.13.1", + "@module-federation/inject-external-runtime-core-plugin": "0.13.1", + "@module-federation/managers": "0.13.1", + "@module-federation/manifest": "0.13.1", + "@module-federation/runtime-tools": "0.13.1", + "@module-federation/sdk": "0.13.1", "btoa": "1.2.1" }, "peerDependencies": { @@ -3203,47 +3663,52 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.11.1.tgz", - "integrity": "sha512-yxxa/TRXaNggb34N+oL82J7r9+GZ3gYTCDyGibYqtsC5j7+9oB4tmc0UyhjrGMhg+fF8TAWFZjNKo7ZnyN9LcQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.13.1.tgz", + "integrity": "sha512-ZHnYvBquDm49LiHfv6fgagMo/cVJneijNJzfPh6S0CJrPS2Tay1bnTXzy8VA5sdIrESagYPaskKMGIj7YfnPug==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.1", - "@module-federation/runtime-core": "0.11.1", - "@module-federation/sdk": "0.11.1" + "@module-federation/error-codes": "0.13.1", + "@module-federation/runtime-core": "0.13.1", + "@module-federation/sdk": "0.13.1" } }, "node_modules/@module-federation/runtime-core": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.11.1.tgz", - "integrity": "sha512-6KxLfkCl05Ey69Xg/dsjf7fPit9qGXZ0lpwaG2agiCqC3JCDxYjT7tgGvnWhTXCcztb/ThpT+bHrRD4Kw8SMhA==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.13.1.tgz", + "integrity": "sha512-TfyKfkSAentKeuvSsAItk8s5tqQSMfIRTPN2e1aoaq/kFhE+7blps719csyWSX5Lg5Es7WXKMsXHy40UgtBtuw==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.1", - "@module-federation/sdk": "0.11.1" + "@module-federation/error-codes": "0.13.1", + "@module-federation/sdk": "0.13.1" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.11.1.tgz", - "integrity": "sha512-8UqMbHJSdkEvKlnlXpR/OjMA77bUbhtmv0I4UO+PA1zBga4y3/St6NOjD66NTINKeWEgsCt1aepXHspduXp33w==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.13.1.tgz", + "integrity": "sha512-GEF1pxqLc80osIMZmE8j9UKZSaTm2hX2lql8tgIH/O9yK4wnF06k6LL5Ah+wJt+oJv6Dj55ri/MoxMP4SXoPNA==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.11.1", - "@module-federation/webpack-bundler-runtime": "0.11.1" + "@module-federation/runtime": "0.13.1", + "@module-federation/webpack-bundler-runtime": "0.13.1" } }, "node_modules/@module-federation/sdk": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.11.1.tgz", - "integrity": "sha512-QS6zevdQYLCGF6NFf0LysMGARh+dZxMeoRKKDUW5PYi3XOk+tjJ7QsDKybfcBZBNgBJfIuwxh4Oei6WOFJEfRg==", - "dev": true + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.1.tgz", + "integrity": "sha512-bmf2FGQ0ymZuxYnw9bIUfhV3y6zDhaqgydEjbl4msObKMLGXZqhse2pTIIxBFpIxR1oONKX/y2FAolDCTlWKiw==", + "dev": true, + "license": "MIT" }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.11.1.tgz", - "integrity": "sha512-oyyelSLGFObM699p192Cuk/LxEDdzSOywDUXrzPa/qSKNFii5WartjQRc4QPMLnsQaGD7fQVTTiBkvVBcWUdyQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.13.1.tgz", + "integrity": "sha512-0kWSupoC0aTxFjJZE5TVPNsoZ9kBsZhkvRxFnUW2vDYLgtvgs2dIrDlNlIXYiS/MaQCNHGyvdNepbchKQiwFaw==", "dev": true, + "license": "MIT", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -3251,13 +3716,14 @@ } }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.11.1.tgz", - "integrity": "sha512-XlVegGyCBBLId8Jr6USjPOFYViQ0CCtoYjHpC8y1FOGtuXLGrvnEdFcl4XHlFlp3MY3Rxhr8QigrdZhYe5bRWg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.13.1.tgz", + "integrity": "sha512-QSuSIGa09S8mthbB1L6xERqrz+AzPlHR6D7RwAzssAc+IHf40U6NiTLPzUqp9mmKDhC5Tm0EISU0ZHNeJpnpBQ==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.11.1", - "@module-federation/sdk": "0.11.1" + "@module-federation/runtime": "0.13.1", + "@module-federation/sdk": "0.13.1" } }, "node_modules/@mui/core-downloads-tracker": { @@ -3997,16 +4463,16 @@ "integrity": "sha512-KyzbsQYXTCxTmwkLlN4GdmTCNlOKnPUpY389loaC4/B0wHNq8Vw4OMIsAPVi4RSSvTaSxitlPAwt3xBTjNIzFA==" }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", "license": "MIT", "optional": true, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { @@ -4611,6 +5077,16 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@swc/types": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", @@ -5192,7 +5668,8 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", @@ -5317,21 +5794,21 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", - "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.0.tgz", + "integrity": "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==", "license": "MIT", "optional": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/type-utils": "8.26.1", - "@typescript-eslint/utils": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/type-utils": "8.32.0", + "@typescript-eslint/utils": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5347,16 +5824,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", - "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.0.tgz", + "integrity": "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==", "license": "MIT", "optional": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/typescript-estree": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4" }, "engines": { @@ -5372,14 +5849,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.0.tgz", + "integrity": "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==", "license": "MIT", "optional": true, "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5390,16 +5867,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", - "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.0.tgz", + "integrity": "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==", "license": "MIT", "optional": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/utils": "8.26.1", + "@typescript-eslint/typescript-estree": "8.32.0", + "@typescript-eslint/utils": "8.32.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5414,9 +5891,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.0.tgz", + "integrity": "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==", "license": "MIT", "optional": true, "engines": { @@ -5428,20 +5905,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.0.tgz", + "integrity": "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==", "license": "MIT", "optional": true, "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5468,16 +5945,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.0.tgz", + "integrity": "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==", "license": "MIT", "optional": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/typescript-estree": "8.32.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5492,13 +5969,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.0.tgz", + "integrity": "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==", "license": "MIT", "optional": true, "dependencies": { - "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/types": "8.32.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -5815,6 +6292,7 @@ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" } @@ -6083,13 +6561,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -6197,16 +6675,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6233,19 +6711,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -6298,6 +6775,15 @@ "dev": true, "license": "MIT" }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6367,10 +6853,11 @@ } }, "node_modules/axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -6381,7 +6868,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/axobject-query": { "version": "4.1.0", @@ -6964,6 +7452,7 @@ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -7044,6 +7533,7 @@ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" @@ -7108,16 +7598,44 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -7778,6 +8296,7 @@ "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" @@ -7945,6 +8464,7 @@ "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dev": true, + "license": "MIT", "dependencies": { "luxon": "^3.2.1" }, @@ -8506,14 +9026,14 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8523,29 +9043,29 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -8561,6 +9081,7 @@ "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } @@ -8642,7 +9163,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-extend": { "version": "0.6.0", @@ -8778,7 +9300,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", @@ -9060,9 +9583,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -9112,6 +9635,20 @@ "webpack": "^1 || ^2 || ^3 || ^4 || ^5" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -9303,57 +9840,62 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -9363,13 +9905,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -9384,27 +9923,28 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", - "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -9418,9 +9958,9 @@ "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -9430,14 +9970,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9454,14 +9995,14 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -9477,6 +10018,44 @@ "dev": true, "license": "MIT" }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -9899,14 +10478,14 @@ "optional": true }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", + "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", "license": "MIT", "optional": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -9917,7 +10496,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -9930,29 +10509,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", - "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "license": "MIT", "optional": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.1.0", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { @@ -10275,6 +10854,7 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -10785,6 +11365,7 @@ "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve-dir": "^1.0.1" }, @@ -10797,6 +11378,7 @@ "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", "dev": true, + "license": "MIT", "dependencies": { "find-file-up": "^2.0.1" }, @@ -10906,12 +11488,18 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { @@ -11207,15 +11795,17 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -11254,16 +11844,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -11282,6 +11877,19 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -11299,14 +11907,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -11435,6 +12043,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -11449,6 +12058,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -11464,13 +12074,15 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -11525,12 +12137,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11573,10 +12185,13 @@ "license": "MIT" }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11604,10 +12219,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -11616,9 +12234,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -11711,6 +12329,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -11914,6 +12533,7 @@ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, + "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" @@ -11927,6 +12547,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11936,6 +12557,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -11952,6 +12574,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12017,9 +12640,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12395,14 +13018,14 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12429,13 +13052,14 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -12451,13 +13075,16 @@ "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "license": "MIT", - "optional": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12467,12 +13094,15 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12492,13 +13122,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12558,11 +13188,13 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -12573,12 +13205,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12614,13 +13247,15 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "license": "MIT", - "optional": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12650,7 +13285,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "devOptional": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -12749,19 +13383,6 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12793,12 +13414,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12864,13 +13486,15 @@ "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -12884,7 +13508,6 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" }, @@ -12893,12 +13516,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -12921,12 +13544,13 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12936,12 +13560,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12951,12 +13577,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -12990,7 +13616,6 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" }, @@ -12999,26 +13624,28 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "license": "MIT", - "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -13077,6 +13704,7 @@ "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "dev": true, + "license": "MIT", "peerDependencies": { "ws": "*" } @@ -13244,17 +13872,18 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "license": "MIT", "optional": true, "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -14474,13 +15103,13 @@ } }, "node_modules/junit-report-merger": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/junit-report-merger/-/junit-report-merger-7.0.0.tgz", - "integrity": "sha512-i7IYPpwVFpju+UKdxYIG9UTMb6NjfRGzWzE/lRExdEf4K3agqXtVBnJWhL9aMM2lNX7uWW/rhVidiDBsG4n5cw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/junit-report-merger/-/junit-report-merger-7.0.1.tgz", + "integrity": "sha512-jNmdXAu0zkpXB9xIVMRocVoMvMm38esLZogDI42pFwEgANFzOgy7QC6DNewGek8SAqmsGWCCfq/koTZkjZHVZA==", "dev": true, "license": "MIT", "dependencies": { - "commander": "~12.0.0", + "commander": "~12.1.0", "fast-glob": "~3.3.0", "xmlbuilder2": "3.1.1" }, @@ -14493,9 +15122,9 @@ } }, "node_modules/junit-report-merger/node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { @@ -14520,6 +15149,7 @@ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, + "license": "MIT", "dependencies": { "tsscmp": "1.0.6" }, @@ -14558,10 +15188,11 @@ } }, "node_modules/koa": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", - "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -14595,13 +15226,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/koa-convert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, + "license": "MIT", "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" @@ -14615,6 +15248,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -14624,6 +15258,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -14640,6 +15275,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -14649,6 +15285,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -14868,7 +15505,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -15014,6 +15652,7 @@ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -15029,7 +15668,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -15064,10 +15704,11 @@ } }, "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -15128,6 +15769,15 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -15841,6 +16491,7 @@ "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", "dev": true, + "license": "MIT", "dependencies": { "cron-parser": "^4.2.0", "long-timeout": "0.1.1", @@ -16387,9 +17038,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -16408,14 +17059,16 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -16426,15 +17079,16 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -16475,13 +17129,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -16658,6 +17313,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -16809,6 +17481,7 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -17097,9 +17770,9 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -17936,7 +18609,8 @@ "version": "9.4.2", "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -18270,19 +18944,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "license": "MIT", - "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -18546,6 +19220,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -18625,6 +19300,15 @@ "dev": true, "license": "MIT" }, + "node_modules/rslog": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.3.tgz", + "integrity": "sha512-antALPJaKBRPBU1X2q9t085K4htWDOOv/K1qhTUk7h0l1ePU/KbDqKJn19eKP0dk7PqMioeA0+fu3gyPXCsXxQ==", + "dev": true, + "engines": { + "node": ">=14.17.6" + } + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -18673,14 +19357,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -18711,15 +19396,31 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -18736,9 +19437,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", - "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", + "version": "1.87.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.87.0.tgz", + "integrity": "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==", "dev": true, "license": "MIT", "dependencies": { @@ -19273,6 +19974,20 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -19350,15 +20065,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -19437,7 +20206,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/source-map": { "version": "0.5.7", @@ -19694,6 +20464,7 @@ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, + "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -19708,6 +20479,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -19722,6 +20494,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -19731,6 +20504,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -19797,24 +20571,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -19853,15 +20628,18 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -19871,15 +20649,19 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -20196,20 +20978,20 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", + "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", "license": "MIT", "optional": true, "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.3", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tabbable": { @@ -20642,9 +21424,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "license": "MIT", "optional": true, "engines": { @@ -20857,6 +21639,7 @@ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.x" } @@ -20937,30 +21720,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -20970,17 +21753,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -20990,17 +21774,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -21047,15 +21831,18 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21848,40 +22635,43 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "license": "MIT", - "optional": true, "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -21895,7 +22685,6 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "license": "MIT", - "optional": true, "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -21917,15 +22706,17 @@ "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -22279,6 +23070,7 @@ "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } diff --git a/clients/ui/frontend/package.json b/clients/ui/frontend/package.json index cf9e2e36a8..46202e0539 100644 --- a/clients/ui/frontend/package.json +++ b/clients/ui/frontend/package.json @@ -34,8 +34,8 @@ "@babel/preset-env": "^7.26.9", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.5", - "@cypress/code-coverage": "^3.13.12", - "@module-federation/enhanced": "^0.11.1", + "@cypress/code-coverage": "^3.14.1", + "@module-federation/enhanced": "^0.13.1", "@mui/icons-material": "^6.4.8", "@mui/material": "^6.1.7", "@mui/types": "^7.2.20", @@ -62,7 +62,7 @@ "cypress-high-resolution": "^1.0.0", "cypress-mochawesome-reporter": "^3.8.2", "cypress-multi-reporters": "^2.0.4", - "dotenv": "^16.4.7", + "dotenv": "^16.5.0", "dotenv-expand": "^5.1.0", "dotenv-webpack": "^6.0.0", "expect": "^29.7.0", @@ -72,7 +72,7 @@ "imagemin": "^9.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "junit-report-merger": "^7.0.0", + "junit-report-merger": "^7.0.1", "mini-css-extract-plugin": "^2.9.0", "postcss": "^8.4.49", "prettier": "^3.3.3", @@ -80,7 +80,7 @@ "raw-loader": "^4.0.2", "react-refresh": "^0.14.2", "regenerator-runtime": "^0.14.1", - "sass": "^1.83.0", + "sass": "^1.87.0", "sass-loader": "^13.2.0", "serve": "^14.2.4", "speed-measure-webpack-plugin": "^1.5.0", @@ -121,8 +121,8 @@ "showdown": "^2.1.0" }, "optionalDependencies": { - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.31.1", + "@typescript-eslint/parser": "^8.31.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-node": "^0.3.7", @@ -132,8 +132,8 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-no-relative-import-paths": "^1.6.1", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-react": "^7.37.2", + "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0" }, "overrides": { diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/ModelRegistryCoreLoader.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/ModelRegistryCoreLoader.tsx index 958a9e4f2b..daa3e8004e 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/ModelRegistryCoreLoader.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/ModelRegistryCoreLoader.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { Navigate, Outlet, useParams } from 'react-router-dom'; -import { Bullseye, Alert, Divider } from '@patternfly/react-core'; +import { Bullseye, Alert, Divider, Stack, StackItem } from '@patternfly/react-core'; import ApplicationsPage from '~/shared/components/ApplicationsPage'; import { ModelRegistrySelectorContext } from '~/app/context/ModelRegistrySelectorContext'; import { ProjectObjectType, typedEmptyImage } from '~/shared/components/design/utils'; @@ -104,18 +104,19 @@ const ModelRegistryCoreLoader: React.FC = ({ return ( - ) : ( - 'Model Registry' - ) + } description={ - !isMUITheme ? ( - 'Select a model registry to view and manage your registered models. Model registries provide a structured and organized way to store, share, version, deploy, and track models.' - ) : ( - - ) + + + Select a model registry to view and manage your registered models. Model registries + provide a structured and organized way to store, share, version, deploy, and track + models. + + + + + } headerContent={ = ({ saveEditedProperty, }) => { const { key, value } = keyValuePair; - const { isMUITheme } = useThemeContext(); const [unsavedKey, setUnsavedKey] = React.useState(key); const [unsavedValue, setUnsavedValue] = React.useState(value); @@ -130,11 +128,7 @@ const ModelPropertiesTableRow: React.FC = ({ {isEditing ? ( <> - {isMUITheme ? ( - - ) : ( - propertyKeyInput - )} + {keyValidationError && ( @@ -150,11 +144,7 @@ const ModelPropertiesTableRow: React.FC = ({ {isEditing ? ( - isMUITheme ? ( - - ) : ( - propertyValueInput - ) + ) : ( = ({ ...pageProps }) => { const [registeredModels, modelsLoaded, modelsLoadError, refreshModels] = useRegisteredModels(); const [modelVersions, versionsLoaded, versionsLoadError, refreshVersions] = useModelVersions(); - const { isMUITheme } = useThemeContext(); const loaded = modelsLoaded && versionsLoaded; const loadError = modelsLoadError || versionsLoadError; @@ -38,18 +36,19 @@ const ModelRegistry: React.FC = ({ ...pageProps }) => { - ) : ( - 'Model Registry' - ) + } description={ - !isMUITheme ? ( - 'Select a model registry to view and manage your registered models. Model registries provide a structured and organized way to store, share, version, deploy, and track models.' - ) : ( - - ) + + + Select a model registry to view and manage your registered models. Model registries + provide a structured and organized way to store, share, version, deploy, and track + models. + + + + + } headerContent={ = ({ const filteredModelVersions = filterModelVersions(unfilteredModelVersions, search, searchType); const date = rm.lastUpdateTimeSinceEpoch && new Date(parseInt(rm.lastUpdateTimeSinceEpoch)); + const resetFilters = () => setSearch(''); + if (unfilteredModelVersions.length === 0) { if (isArchiveModel) { return ( @@ -129,7 +128,7 @@ const ModelVersionListView: React.FC = ({ setSearch('')} + clearFilters={resetFilters} modelVersions={sortModelVersionsByCreateTime(filteredModelVersions)} toolbarContent={ @@ -137,8 +136,8 @@ const ModelVersionListView: React.FC = ({ setSearch('')} - deleteLabelGroup={() => setSearch('')} + deleteLabel={resetFilters} + deleteLabelGroup={resetFilters} categoryName={searchType} > = ({ /> - {isMUITheme() ? ( - { - setSearch(searchValue); - }} - style={{ minWidth: '200px' }} - data-testid="model-versions-table-search" - aria-label="Search" - /> - } - field={`Find by ${searchType.toLowerCase()}`} - /> - ) : ( - { - setSearch(searchValue); - }} - onClear={() => setSearch('')} - style={{ minWidth: '200px' }} - data-testid="model-versions-table-search" - /> - )} + diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/ModelVersionsArchive/ModelVersionsArchiveListView.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/ModelVersionsArchive/ModelVersionsArchiveListView.tsx index 49246490f0..8277a24994 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/ModelVersionsArchive/ModelVersionsArchiveListView.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/ModelVersionsArchive/ModelVersionsArchiveListView.tsx @@ -1,7 +1,5 @@ import * as React from 'react'; import { - SearchInput, - TextInput, ToolbarContent, ToolbarFilter, ToolbarGroup, @@ -15,8 +13,7 @@ import SimpleSelect from '~/shared/components/SimpleSelect'; import { asEnumMember } from '~/shared/utilities/utils'; import { filterModelVersions } from '~/app/pages/modelRegistry/screens/utils'; import EmptyModelRegistryState from '~/app/pages/modelRegistry/screens/components/EmptyModelRegistryState'; -import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; -import { useThemeContext } from '~/app/ThemeContext'; +import ThemeAwareSearchInput from '~/app/pages/modelRegistry/screens/components/ThemeAwareSearchInput'; import ModelVersionsArchiveTable from './ModelVersionsArchiveTable'; type ModelVersionsArchiveListViewProps = { @@ -33,8 +30,6 @@ const ModelVersionsArchiveListView: React.FC const searchTypes = [SearchType.KEYWORD, SearchType.AUTHOR]; - const { isMUITheme } = useThemeContext(); - const filteredModelVersions = filterModelVersions(unfilteredmodelVersions, search, searchType); if (unfilteredmodelVersions.length === 0) { @@ -48,10 +43,12 @@ const ModelVersionsArchiveListView: React.FC ); } + const resetFilters = () => setSearch(''); + return ( setSearch('')} + clearFilters={resetFilters} modelVersions={filteredModelVersions} toolbarContent={ @@ -59,8 +56,8 @@ const ModelVersionsArchiveListView: React.FC setSearch('')} - deleteLabelGroup={() => setSearch('')} + deleteLabel={resetFilters} + deleteLabelGroup={resetFilters} categoryName="Keyword" > /> - {isMUITheme ? ( - { - setSearch(searchValue); - }} - style={{ minWidth: '200px' }} - data-testid="model-versions-archive-table-search" - aria-label="Search" - /> - } - field={`Find by ${searchType.toLowerCase()}`} - /> - ) : ( - { - setSearch(searchValue); - }} - onClear={() => setSearch('')} - style={{ minWidth: '200px' }} - data-testid="model-versions-archive-table-search" - /> - )} + diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/PrefilledModelRegistryField.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/PrefilledModelRegistryField.tsx index f7343f3b0c..d16cfcad0e 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/PrefilledModelRegistryField.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/PrefilledModelRegistryField.tsx @@ -1,22 +1,19 @@ import React from 'react'; import { FormGroup, TextInput } from '@patternfly/react-core'; import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; -import { useThemeContext } from '~/app/ThemeContext'; type PrefilledModelRegistryFieldProps = { mrName?: string; }; const PrefilledModelRegistryField: React.FC = ({ mrName }) => { - const { isMUITheme } = useThemeContext(); - const mrNameInput = ( ); return ( - {isMUITheme ? : mrNameInput} + ); }; diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisterModelDetailsFormSection.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisterModelDetailsFormSection.tsx index 12e8446a6b..e5f44dcf8c 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisterModelDetailsFormSection.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisterModelDetailsFormSection.tsx @@ -10,7 +10,6 @@ import React from 'react'; import FormSection from '~/shared/components/pf-overrides/FormSection'; import { UpdateObjectAtPropAndValue } from '~/shared/types'; import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; -import { useThemeContext } from '~/app/ThemeContext'; import { MR_CHARACTER_LIMIT } from './const'; import { RegisterModelFormData } from './useRegisterModelData'; @@ -26,8 +25,6 @@ const RegisterModelDetailsFormSection = ({ hasModelNameError, isModelNameDuplicate, }: RegisterModelDetailsFormSectionProp): React.ReactNode => { - const { isMUITheme } = useThemeContext(); - const modelNameInput = ( ({ description="Provide general details that apply to all versions of this model." > - {isMUITheme ? : modelNameInput} + {hasModelNameError && ( @@ -70,11 +67,7 @@ const RegisterModelDetailsFormSection = ({ )} - {isMUITheme ? ( - - ) : ( - modelDescriptionInput - )} + ); diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisteredModelSelector.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisteredModelSelector.tsx index 0c7fda3a00..ab2157f005 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisteredModelSelector.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegisteredModelSelector.tsx @@ -3,7 +3,6 @@ import { FormGroup, TextInput } from '@patternfly/react-core'; import { RegisteredModel } from '~/app/types'; import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; import TypeaheadSelect, { TypeaheadSelectOption } from '~/shared/components/TypeaheadSelect'; -import { useThemeContext } from '~/app/ThemeContext'; type RegisteredModelSelectorProps = { registeredModels: RegisteredModel[]; @@ -18,7 +17,6 @@ const RegisteredModelSelector: React.FC = ({ setRegisteredModelId, isDisabled, }) => { - const { isMUITheme } = useThemeContext(); const options: TypeaheadSelectOption[] = React.useMemo( () => registeredModels.map(({ name, id }) => ({ @@ -49,11 +47,7 @@ const RegisteredModelSelector: React.FC = ({ */ return ( - {isMUITheme ? ( - - ) : ( - modelNameInput - )} + ); } diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegistrationCommonFormSections.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegistrationCommonFormSections.tsx index 8b1b02bb64..188a9b9807 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegistrationCommonFormSections.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisterModel/RegistrationCommonFormSections.tsx @@ -17,7 +17,6 @@ import { UpdateObjectAtPropAndValue } from '~/shared/types'; import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; import FormSection from '~/shared/components/pf-overrides/FormSection'; import { ModelVersion } from '~/app/types'; -import { useThemeContext } from '~/app/ThemeContext'; import { ModelLocationType, RegistrationCommonFormData } from './useRegisterModelData'; import { isNameValid } from './utils'; import { MR_CHARACTER_LIMIT } from './const'; @@ -41,8 +40,6 @@ const RegistrationCommonFormSections = ({ // const [isAutofillModalOpen, setAutofillModalOpen] = React.useState(false); const isVersionNameValid = isNameValid(formData.versionName); - const { isMUITheme } = useThemeContext(); - // const connectionDataMap: Record< // string, // keyof Pick< @@ -185,11 +182,7 @@ const RegistrationCommonFormSections = ({ } > - {isMUITheme ? ( - - ) : ( - versionNameInput - )} + {latestVersion && ( @@ -206,28 +199,16 @@ const RegistrationCommonFormSections = ({ - {isMUITheme ? ( - - ) : ( - versionDescriptionInput - )} + - {isMUITheme ? ( - - ) : ( - sourceModelFormatInput - )} + - {isMUITheme ? ( - - ) : ( - sourceModelFormatVersionInput - )} + ({ isRequired fieldId="location-endpoint" > - {isMUITheme ? ( - - ) : ( - endpointInput - )} + - {isMUITheme ? : bucketInput} + - {isMUITheme ? : regionInput} + ({ isRequired fieldId="location-path" > - {isMUITheme ? : pathInput} + Enter a path to a model or folder. This path cannot point to a root folder. @@ -304,7 +281,7 @@ const RegistrationCommonFormSections = ({ {modelLocationType === ModelLocationType.URI && ( <> - {isMUITheme ? : uriInput} + )} diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModels/RegisteredModelListView.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModels/RegisteredModelListView.tsx index 521a810b22..4d664d66b5 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModels/RegisteredModelListView.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModels/RegisteredModelListView.tsx @@ -1,11 +1,5 @@ import * as React from 'react'; -import { - SearchInput, - TextInput, - ToolbarFilter, - ToolbarGroup, - ToolbarItem, -} from '@patternfly/react-core'; +import { ToolbarFilter, ToolbarGroup, ToolbarItem } from '@patternfly/react-core'; import { FilterIcon } from '@patternfly/react-icons'; import { useNavigate } from 'react-router-dom'; import { ModelVersion, RegisteredModel } from '~/app/types'; @@ -18,11 +12,10 @@ import { registerModelUrl, } from '~/app/pages/modelRegistry/screens/routeUtils'; import EmptyModelRegistryState from '~/app/pages/modelRegistry/screens/components/EmptyModelRegistryState'; -import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; import { filterRegisteredModels } from '~/app/pages/modelRegistry/screens/utils'; import { asEnumMember } from '~/shared/utilities/utils'; import { filterArchiveModels, filterLiveModels } from '~/app/utils'; -import { useThemeContext } from '~/app/ThemeContext'; +import ThemeAwareSearchInput from '~/app/pages/modelRegistry/screens/components/ThemeAwareSearchInput'; import RegisteredModelTable from './RegisteredModelTable'; import RegisteredModelsTableToolbar from './RegisteredModelsTableToolbar'; @@ -44,7 +37,6 @@ const RegisteredModelListView: React.FC = ({ const unfilteredRegisteredModels = filterLiveModels(registeredModels); const archiveRegisteredModels = filterArchiveModels(registeredModels); const searchTypes = React.useMemo(() => [SearchType.KEYWORD, SearchType.OWNER], []); - const { isMUITheme } = useThemeContext(); if (unfilteredRegisteredModels.length === 0) { return ( @@ -109,35 +101,16 @@ const RegisteredModelListView: React.FC = ({ /> - {isMUITheme ? ( - { - setSearch(searchValue); - }} - style={{ minWidth: '200px' }} - data-testid="registered-model-table-search" - aria-label="Search" - /> - } - field={`Find by ${searchType.toLowerCase()}`} - /> - ) : ( - { - setSearch(searchValue); - }} - onClear={resetFilters} - style={{ minWidth: '200px' }} - data-testid="registered-model-table-search" - /> - )} + ); diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModelsArchive/RegisteredModelsArchiveListView.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModelsArchive/RegisteredModelsArchiveListView.tsx index e65967d1ee..c47e5f25b7 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModelsArchive/RegisteredModelsArchiveListView.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/RegisteredModelsArchive/RegisteredModelsArchiveListView.tsx @@ -1,7 +1,5 @@ import * as React from 'react'; import { - SearchInput, - TextInput, ToolbarContent, ToolbarFilter, ToolbarGroup, @@ -15,8 +13,7 @@ import { filterRegisteredModels } from '~/app/pages/modelRegistry/screens/utils' import EmptyModelRegistryState from '~/app/pages/modelRegistry/screens/components/EmptyModelRegistryState'; import SimpleSelect from '~/shared/components/SimpleSelect'; import { asEnumMember } from '~/shared/utilities/utils'; -import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; -import { useThemeContext } from '~/app/ThemeContext'; +import ThemeAwareSearchInput from '~/app/pages/modelRegistry/screens/components/ThemeAwareSearchInput'; import RegisteredModelsArchiveTable from './RegisteredModelsArchiveTable'; type RegisteredModelsArchiveListViewProps = { @@ -33,8 +30,6 @@ const RegisteredModelsArchiveListView: React.FC(SearchType.KEYWORD); const [search, setSearch] = React.useState(''); - const { isMUITheme } = useThemeContext(); - const searchTypes = [SearchType.KEYWORD, SearchType.OWNER]; const filteredRegisteredModels = filterRegisteredModels( unfilteredRegisteredModels, @@ -55,10 +50,12 @@ const RegisteredModelsArchiveListView: React.FC setSearch(''); + return ( setSearch('')} + clearFilters={resetFilters} registeredModels={filteredRegisteredModels} toolbarContent={ @@ -66,8 +63,8 @@ const RegisteredModelsArchiveListView: React.FC setSearch('')} - deleteLabelGroup={() => setSearch('')} + deleteLabel={resetFilters} + deleteLabelGroup={resetFilters} categoryName="Keyword" > - {isMUITheme ? ( - { - setSearch(searchValue); - }} - style={{ minWidth: '200px' }} - data-testid="registered-models-archive-table-search" - aria-label="Search" - /> - } - field={`Find by ${searchType.toLowerCase()}`} - /> - ) : ( - { - setSearch(searchValue); - }} - onClear={() => setSearch('')} - style={{ minWidth: '200px' }} - data-testid="registered-models-archive-table-search" - /> - )} + diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/FormFieldset.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/FormFieldset.tsx index 8869aef304..6b51d1a326 100644 --- a/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/FormFieldset.tsx +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/FormFieldset.tsx @@ -1,4 +1,5 @@ import React, { ReactNode } from 'react'; +import { useThemeContext } from '~/app/ThemeContext'; interface FormFieldsetProps { component: ReactNode; @@ -6,17 +7,25 @@ interface FormFieldsetProps { className?: string; } -const FormFieldset: React.FC = ({ component, field, className }) => ( -
- {component} - -
-); +const FormFieldset: React.FC = ({ component, field, className }) => { + const { isMUITheme } = useThemeContext(); + + if (!isMUITheme) { + return <>{component}; + } + + return ( +
+ {component} + +
+ ); +}; export default FormFieldset; diff --git a/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/ThemeAwareSearchInput.tsx b/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/ThemeAwareSearchInput.tsx new file mode 100644 index 0000000000..30cdd73081 --- /dev/null +++ b/clients/ui/frontend/src/app/pages/modelRegistry/screens/components/ThemeAwareSearchInput.tsx @@ -0,0 +1,70 @@ +import * as React from 'react'; +import { SearchInput, SearchInputProps, TextInput } from '@patternfly/react-core'; +import { useThemeContext } from '~/app/ThemeContext'; +import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; + +type ThemeAwareSearchInputProps = Omit & { + onChange: (value: string) => void; // Simplified onChange signature + onClear?: () => void; // Simplified optional onClear signature + fieldLabel?: string; // Additional prop for MUI FormFieldset label + 'data-testid'?: string; +}; + +const ThemeAwareSearchInput: React.FC = ({ + value, + onChange, + onClear, + fieldLabel, + placeholder, + isDisabled, + className, + style, + 'aria-label': ariaLabel = 'Search', + 'data-testid': dataTestId, + ...rest +}) => { + const { isMUITheme } = useThemeContext(); + + if (isMUITheme) { + // Render MUI version using TextInput + FormFieldset + return ( + onChange(newValue)} // Adapt signature + isDisabled={isDisabled} + aria-label={ariaLabel} + data-testid={dataTestId} + style={style} + /> + } + /> + ); + } + + // Render PF version using SearchInput + return ( + onChange(newValue)} // Adapt signature + onClear={(event) => { + event.stopPropagation(); + onChange(''); + onClear?.(); // Adapt signature + }} + /> + ); +}; + +export default ThemeAwareSearchInput; diff --git a/clients/ui/frontend/src/app/pages/settings/ModelRegistryCreateModal.tsx b/clients/ui/frontend/src/app/pages/settings/ModelRegistryCreateModal.tsx index e8b153865c..df65442a06 100644 --- a/clients/ui/frontend/src/app/pages/settings/ModelRegistryCreateModal.tsx +++ b/clients/ui/frontend/src/app/pages/settings/ModelRegistryCreateModal.tsx @@ -6,16 +6,16 @@ import { HelperText, HelperTextItem, TextInput, + Alert, } from '@patternfly/react-core'; import { Modal } from '@patternfly/react-core/deprecated'; import { useNavigate } from 'react-router'; import ModelRegistryCreateModalFooter from '~/app/pages/settings/ModelRegistryCreateModalFooter'; -import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; import FormSection from '~/shared/components/pf-overrides/FormSection'; import ModelRegistryDatabasePassword from '~/app/pages/settings/ModelRegistryDatabasePassword'; import K8sNameDescriptionField from '~/concepts/k8s/K8sNameDescriptionField/K8sNameDescriptionField'; -import { useThemeContext } from '~/app/ThemeContext'; +import ThemeAwareFormGroupWrapper from './components/ThemeAwareFormGroupWrapper'; type CreateModalProps = { onClose: () => void; @@ -28,7 +28,6 @@ const CreateModal: React.FC = ({ // refresh, // modelRegistry, }) => { - const { isMUITheme } = useThemeContext(); const [error, setError] = React.useState(); const [host, setHost] = React.useState(''); @@ -36,7 +35,6 @@ const CreateModal: React.FC = ({ const [username, setUsername] = React.useState(''); const [password, setPassword] = React.useState(''); const [database, setDatabase] = React.useState(''); - // const [addSecureDB, setAddSecureDB] = React.useState(false); const [isHostTouched, setIsHostTouched] = React.useState(false); const [isPortTouched, setIsPortTouched] = React.useState(false); const [isUsernameTouched, setIsUsernameTouched] = React.useState(false); @@ -47,9 +45,7 @@ const CreateModal: React.FC = ({ const navigate = useNavigate(); const onBeforeClose = () => { - // setIsSubmitting(false); setError(undefined); - setHost(''); setPort(''); setUsername(''); @@ -67,17 +63,11 @@ const CreateModal: React.FC = ({ const hasContent = (value: string): boolean => !!value.trim().length; const canSubmit = () => - // TODO: implement once we have the endpoint - // !isSubmitting && - // isValidK8sName(nameDesc.k8sName.value || translateDisplayNameForK8s(nameDesc.name)) - // && hasContent(host) && hasContent(password) && hasContent(port) && hasContent(username) && hasContent(database); - // && - // (!addSecureDB || (secureDBInfo.isValid && !configSecretsError)) const onSubmit = () => { navigate(`/model-registry-settings`); @@ -93,7 +83,6 @@ const CreateModal: React.FC = ({ value={host} onBlur={() => setIsHostTouched(true)} onChange={(_e, value) => setHost(value)} - validated={isHostTouched && !hasContent(host) ? 'error' : 'default'} /> ); @@ -105,20 +94,6 @@ const CreateModal: React.FC = ({
); - const hostFormGroup = ( - <> - - - - {hostHelperText} - - ); - const portInput = ( = ({ value={port} onBlur={() => setIsPortTouched(true)} onChange={(_e, value) => setPort(value)} - validated={isPortTouched && !hasContent(port) ? 'error' : 'default'} /> ); @@ -140,20 +114,6 @@ const CreateModal: React.FC = ({ ); - const portFormGroup = ( - <> - - - - {portHelperText} - - ); - const userNameInput = ( = ({ value={username} onBlur={() => setIsUsernameTouched(true)} onChange={(_e, value) => setUsername(value)} - validated={isUsernameTouched && !hasContent(username) ? 'error' : 'default'} /> ); @@ -175,20 +134,6 @@ const CreateModal: React.FC = ({ ); - const usernameFormGroup = ( - <> - - - - {usernameHelperText} - - ); - const passwordInput = ( = ({ isPasswordTouched={isPasswordTouched} setIsPasswordTouched={setIsPasswordTouched} showPassword={showPassword} - // editRegistry={mr} /> ); @@ -208,20 +152,6 @@ const CreateModal: React.FC = ({ ); - const passwordFormGroup = ( - <> - - - - {passwordHelperText} - - ); - const databaseInput = ( = ({ value={database} onBlur={() => setIsDatabaseTouched(true)} onChange={(_e, value) => setDatabase(value)} - validated={isDatabaseTouched && !hasContent(database) ? 'error' : 'default'} /> ); @@ -243,20 +172,6 @@ const CreateModal: React.FC = ({ ); - const databaseFormGroup = ( - <> - - - - {databaseHelperText} - - ); - return ( = ({ onCancel={onBeforeClose} onSubmit={onSubmit} submitLabel="Create" - // isSubmitLoading={isSubmitting} isSubmitDisabled={!canSubmit()} error={error} alertTitle={`Error ${'creating'} model registry`} @@ -293,93 +207,59 @@ const CreateModal: React.FC = ({ title="Connect to external MySQL database" description="This external database is where model data is stored." > - {isMUITheme ? ( - hostFormGroup - ) : ( - <> - - {hostInput} - {hostHelperText} - - - )} - {isMUITheme ? ( - portFormGroup - ) : ( - <> - - {portInput} - {portHelperText} - - - )} - {isMUITheme ? ( - usernameFormGroup - ) : ( - <> - - {userNameInput} - {usernameHelperText} - - - )} - {isMUITheme ? ( - passwordFormGroup - ) : ( - <> - - {passwordInput} - {passwordHelperText} - - - )} - {isMUITheme ? ( - databaseFormGroup - ) : ( - <> - - {databaseInput} - {databaseFormGroup} - - - )} - {/* {secureDbEnabled && ( - <> - - setAddSecureDB(value)} - id="add-secure-db" - data-testid="add-secure-db-mr-checkbox" - name="add-secure-db" - /> - - {addSecureDB && - (!configSecretsLoaded && !configSecretsError ? ( - - ) : configSecretsLoaded ? ( - - ) : ( - - {configSecretsError?.message} - - ))} - - )} */} + + {hostInput} + + + + {portInput} + + + + {userNameInput} + + + + {passwordInput} + + + + {databaseInput} + + + {/* ... Optional TLS section ... */}
+ + {error && ( + + + + )} ); diff --git a/clients/ui/frontend/src/app/pages/settings/ModelRegistrySettings.tsx b/clients/ui/frontend/src/app/pages/settings/ModelRegistrySettings.tsx index 3ca709a20f..db2b913fe9 100644 --- a/clients/ui/frontend/src/app/pages/settings/ModelRegistrySettings.tsx +++ b/clients/ui/frontend/src/app/pages/settings/ModelRegistrySettings.tsx @@ -1,5 +1,12 @@ import React from 'react'; -import { Divider, EmptyState, EmptyStateBody, EmptyStateVariant } from '@patternfly/react-core'; +import { + Divider, + EmptyState, + EmptyStateBody, + EmptyStateVariant, + Stack, + StackItem, +} from '@patternfly/react-core'; import { PlusCircleIcon } from '@patternfly/react-icons'; import ApplicationsPage from '~/shared/components/ApplicationsPage'; import useModelRegistries from '~/app/hooks/useModelRegistries'; @@ -7,7 +14,6 @@ import useQueryParamNamespaces from '~/shared/hooks/useQueryParamNamespaces'; import TitleWithIcon from '~/shared/components/design/TitleWithIcon'; import { ProjectObjectType } from '~/shared/components/design/utils'; // import { ModelRegistrySelectorContext } from '~/app/context/ModelRegistrySelectorContext'; -import { useThemeContext } from '~/app/ThemeContext'; import ModelRegistriesTable from './ModelRegistriesTable'; import CreateModal from './ModelRegistryCreateModal'; @@ -19,7 +25,6 @@ const ModelRegistrySettings: React.FC = () => { loadError, // refreshModelRegistries ] = useModelRegistries(queryParams); - const { isMUITheme } = useThemeContext(); const [createModalOpen, setCreateModalOpen] = React.useState(false); // TODO: [Midstream] Implement this when adding logic for rules review // const { refreshRulesReview } = React.useContext(ModelRegistrySelectorContext); @@ -36,21 +41,20 @@ const ModelRegistrySettings: React.FC = () => { <> - ) : ( - 'Model Registry Settings' - ) + } description={ - !isMUITheme ? ( - 'Manage model registry settings for all users in your organization.' - ) : ( - - ) + + + Manage model registry settings for all users in your organization. + + + + + } loaded={loaded} loadError={loadError} diff --git a/clients/ui/frontend/src/app/pages/settings/components/ThemeAwareFormGroupWrapper.tsx b/clients/ui/frontend/src/app/pages/settings/components/ThemeAwareFormGroupWrapper.tsx new file mode 100644 index 0000000000..4345c9bf58 --- /dev/null +++ b/clients/ui/frontend/src/app/pages/settings/components/ThemeAwareFormGroupWrapper.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import { FormGroup } from '@patternfly/react-core'; +import { useThemeContext } from '~/app/ThemeContext'; +import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; + +// Props required by this wrapper component +type ThemeAwareFormGroupWrapperProps = { + children: React.ReactNode; // The input component + label: string; + fieldId: string; + isRequired?: boolean; + helperTextNode?: React.ReactNode; // The pre-rendered HelperText component or null + className?: string; // Optional className for the outer FormGroup +}; + +const ThemeAwareFormGroupWrapper: React.FC = ({ + children, + label, + fieldId, + isRequired, + helperTextNode, + className, +}) => { + const { isMUITheme } = useThemeContext(); + const hasError = !!helperTextNode; // Determine error state based on helper text presence + + if (isMUITheme) { + // For MUI theme, render FormGroup -> FormFieldset -> Input + // Helper text is rendered *after* the FormGroup wrapper + return ( + <> + + + + {helperTextNode} + + ); + } + + // For PF theme, render standard FormGroup + return ( + <> + + {children} + {helperTextNode} + + + ); +}; + +export default ThemeAwareFormGroupWrapper; diff --git a/clients/ui/frontend/src/shared/components/EditableTextDescriptionListGroup.tsx b/clients/ui/frontend/src/shared/components/EditableTextDescriptionListGroup.tsx index 3fba50421e..584e9465b7 100644 --- a/clients/ui/frontend/src/shared/components/EditableTextDescriptionListGroup.tsx +++ b/clients/ui/frontend/src/shared/components/EditableTextDescriptionListGroup.tsx @@ -4,7 +4,6 @@ import DashboardDescriptionListGroup, { DashboardDescriptionListGroupProps, } from '~/shared/components/DashboardDescriptionListGroup'; import FormFieldset from '~/app/pages/modelRegistry/screens/components/FormFieldset'; -import { useThemeContext } from '~/app/ThemeContext'; type EditableTextDescriptionListGroupProps = Pick< DashboardDescriptionListGroupProps, @@ -30,7 +29,6 @@ const EditableTextDescriptionListGroup: React.FC : editableTextArea - } + contentWhenEditing={} onEditClick={() => { setUnsavedValue(value); setIsEditing(true); diff --git a/clients/ui/frontend/src/shared/style/MUI-theme.scss b/clients/ui/frontend/src/shared/style/MUI-theme.scss index 007e1d328e..f191191114 100644 --- a/clients/ui/frontend/src/shared/style/MUI-theme.scss +++ b/clients/ui/frontend/src/shared/style/MUI-theme.scss @@ -462,7 +462,7 @@ display: none; } -.pf-v6-c-helper-text__item.pf-m-error { +.mui-theme .pf-v6-c-helper-text__item.pf-m-error { --pf-v6-c-helper-text__item-text--Color: var(--mui-palette-error-main); --pf-v6-c-helper-text__item-text--FontWeight: var(--mui-helper-text__item--FontWeight); margin-left: 14px; diff --git a/go.mod b/go.mod index 661708f46d..72a2b69e59 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/go-chi/chi/v5 v5.2.1 github.com/go-chi/cors v1.2.1 github.com/go-logr/logr v1.4.2 - github.com/golang/glog v1.2.4 + github.com/golang/glog v1.2.5 github.com/kserve/kserve v0.15.0 github.com/onsi/ginkgo v1.16.5 github.com/onsi/ginkgo/v2 v2.23.4 @@ -22,6 +22,7 @@ require ( k8s.io/api v0.32.3 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 + knative.dev/pkg v0.0.0-20250117084104-c43477f0052b sigs.k8s.io/controller-runtime v0.20.4 ) @@ -135,7 +136,6 @@ require ( k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e // indirect knative.dev/networking v0.0.0-20250117155906-67d1c274ba6a // indirect - knative.dev/pkg v0.0.0-20250117084104-c43477f0052b // indirect knative.dev/serving v0.44.0 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect diff --git a/go.sum b/go.sum index 47cb024aea..9205e05177 100644 --- a/go.sum +++ b/go.sum @@ -161,8 +161,8 @@ github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlnd github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= -github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I= +github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= diff --git a/internal/converter/generated/mlmd_openapi_converter.gen.go b/internal/converter/generated/mlmd_openapi_converter.gen.go index b58c32bfb6..11ea754799 100644 --- a/internal/converter/generated/mlmd_openapi_converter.gen.go +++ b/internal/converter/generated/mlmd_openapi_converter.gen.go @@ -26,11 +26,6 @@ func (c *MLMDToOpenAPIConverterImpl) ConvertDocArtifact(source *proto.Artifact) xstring := *(*source).ExternalId openapiDocArtifact.ExternalId = &xstring } - if (*source).Uri != nil { - xstring2 := *(*source).Uri - openapiDocArtifact.Uri = &xstring2 - } - openapiDocArtifact.State = converter.MapMLMDArtifactState((*source).State) openapiDocArtifact.Name = converter.MapNameFromOwned((*source).Name) openapiDocArtifact.Id = converter.Int64ToString((*source).Id) openapiDocArtifact.CreateTimeSinceEpoch = converter.Int64ToString((*source).CreateTimeSinceEpoch) @@ -40,6 +35,11 @@ func (c *MLMDToOpenAPIConverterImpl) ConvertDocArtifact(source *proto.Artifact) return nil, fmt.Errorf("error setting field ArtifactType: %w", err) } openapiDocArtifact.ArtifactType = pString + if (*source).Uri != nil { + xstring2 := *(*source).Uri + openapiDocArtifact.Uri = &xstring2 + } + openapiDocArtifact.State = converter.MapMLMDArtifactState((*source).State) pOpenapiDocArtifact = &openapiDocArtifact } return pOpenapiDocArtifact, nil @@ -85,11 +85,6 @@ func (c *MLMDToOpenAPIConverterImpl) ConvertModelArtifact(source *proto.Artifact xstring := *(*source).ExternalId openapiModelArtifact.ExternalId = &xstring } - if (*source).Uri != nil { - xstring2 := *(*source).Uri - openapiModelArtifact.Uri = &xstring2 - } - openapiModelArtifact.State = converter.MapMLMDArtifactState((*source).State) openapiModelArtifact.Name = converter.MapNameFromOwned((*source).Name) openapiModelArtifact.Id = converter.Int64ToString((*source).Id) openapiModelArtifact.CreateTimeSinceEpoch = converter.Int64ToString((*source).CreateTimeSinceEpoch) @@ -109,6 +104,11 @@ func (c *MLMDToOpenAPIConverterImpl) ConvertModelArtifact(source *proto.Artifact openapiModelArtifact.ModelSourceGroup = converter.MapModelArtifactModelSourceGroup((*source).Properties) openapiModelArtifact.ModelSourceId = converter.MapModelArtifactModelSourceId((*source).Properties) openapiModelArtifact.ModelSourceName = converter.MapModelArtifactModelSourceName((*source).Properties) + if (*source).Uri != nil { + xstring2 := *(*source).Uri + openapiModelArtifact.Uri = &xstring2 + } + openapiModelArtifact.State = converter.MapMLMDArtifactState((*source).State) pOpenapiModelArtifact = &openapiModelArtifact } return pOpenapiModelArtifact, nil @@ -172,7 +172,6 @@ func (c *MLMDToOpenAPIConverterImpl) ConvertServeModel(source *proto.Execution) var pOpenapiServeModel *openapi.ServeModel if source != nil { var openapiServeModel openapi.ServeModel - openapiServeModel.LastKnownState = converter.MapMLMDServeModelLastKnownState((*source).LastKnownState) mapStringOpenapiMetadataValue, err := converter.MapMLMDCustomProperties((*source).CustomProperties) if err != nil { return nil, fmt.Errorf("error setting field CustomProperties: %w", err) @@ -187,6 +186,7 @@ func (c *MLMDToOpenAPIConverterImpl) ConvertServeModel(source *proto.Execution) openapiServeModel.Id = converter.Int64ToString((*source).Id) openapiServeModel.CreateTimeSinceEpoch = converter.Int64ToString((*source).CreateTimeSinceEpoch) openapiServeModel.LastUpdateTimeSinceEpoch = converter.Int64ToString((*source).LastUpdateTimeSinceEpoch) + openapiServeModel.LastKnownState = converter.MapMLMDServeModelLastKnownState((*source).LastKnownState) openapiServeModel.ModelVersionId = converter.MapPropertyModelVersionIdAsValue((*source).Properties) pOpenapiServeModel = &openapiServeModel } diff --git a/internal/converter/generated/openapi_converter.gen.go b/internal/converter/generated/openapi_converter.gen.go index ed94216c8d..86f29b61ba 100644 --- a/internal/converter/generated/openapi_converter.gen.go +++ b/internal/converter/generated/openapi_converter.gen.go @@ -69,9 +69,13 @@ func (c *OpenAPIConverterImpl) ConvertDocArtifactCreate(source *openapi.DocArtif xstring2 := *(*source).ExternalId openapiDocArtifact.ExternalId = &xstring2 } + if (*source).Name != nil { + xstring3 := *(*source).Name + openapiDocArtifact.Name = &xstring3 + } if (*source).Uri != nil { - xstring3 := *(*source).Uri - openapiDocArtifact.Uri = &xstring3 + xstring4 := *(*source).Uri + openapiDocArtifact.Uri = &xstring4 } if (*source).State != nil { openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*(*source).State) @@ -80,10 +84,6 @@ func (c *OpenAPIConverterImpl) ConvertDocArtifactCreate(source *openapi.DocArtif } openapiDocArtifact.State = &openapiArtifactState } - if (*source).Name != nil { - xstring4 := *(*source).Name - openapiDocArtifact.Name = &xstring4 - } pOpenapiDocArtifact = &openapiDocArtifact } return pOpenapiDocArtifact, nil @@ -235,60 +235,60 @@ func (c *OpenAPIConverterImpl) ConvertModelArtifactCreate(source *openapi.ModelA xstring2 := *(*source).ExternalId openapiModelArtifact.ExternalId = &xstring2 } - if (*source).Uri != nil { - xstring3 := *(*source).Uri - openapiModelArtifact.Uri = &xstring3 - } - if (*source).State != nil { - openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*(*source).State) - if err != nil { - return nil, fmt.Errorf("error setting field State: %w", err) - } - openapiModelArtifact.State = &openapiArtifactState - } if (*source).Name != nil { - xstring4 := *(*source).Name - openapiModelArtifact.Name = &xstring4 + xstring3 := *(*source).Name + openapiModelArtifact.Name = &xstring3 } if (*source).ModelFormatName != nil { - xstring5 := *(*source).ModelFormatName - openapiModelArtifact.ModelFormatName = &xstring5 + xstring4 := *(*source).ModelFormatName + openapiModelArtifact.ModelFormatName = &xstring4 } if (*source).StorageKey != nil { - xstring6 := *(*source).StorageKey - openapiModelArtifact.StorageKey = &xstring6 + xstring5 := *(*source).StorageKey + openapiModelArtifact.StorageKey = &xstring5 } if (*source).StoragePath != nil { - xstring7 := *(*source).StoragePath - openapiModelArtifact.StoragePath = &xstring7 + xstring6 := *(*source).StoragePath + openapiModelArtifact.StoragePath = &xstring6 } if (*source).ModelFormatVersion != nil { - xstring8 := *(*source).ModelFormatVersion - openapiModelArtifact.ModelFormatVersion = &xstring8 + xstring7 := *(*source).ModelFormatVersion + openapiModelArtifact.ModelFormatVersion = &xstring7 } if (*source).ServiceAccountName != nil { - xstring9 := *(*source).ServiceAccountName - openapiModelArtifact.ServiceAccountName = &xstring9 + xstring8 := *(*source).ServiceAccountName + openapiModelArtifact.ServiceAccountName = &xstring8 } if (*source).ModelSourceKind != nil { - xstring10 := *(*source).ModelSourceKind - openapiModelArtifact.ModelSourceKind = &xstring10 + xstring9 := *(*source).ModelSourceKind + openapiModelArtifact.ModelSourceKind = &xstring9 } if (*source).ModelSourceClass != nil { - xstring11 := *(*source).ModelSourceClass - openapiModelArtifact.ModelSourceClass = &xstring11 + xstring10 := *(*source).ModelSourceClass + openapiModelArtifact.ModelSourceClass = &xstring10 } if (*source).ModelSourceGroup != nil { - xstring12 := *(*source).ModelSourceGroup - openapiModelArtifact.ModelSourceGroup = &xstring12 + xstring11 := *(*source).ModelSourceGroup + openapiModelArtifact.ModelSourceGroup = &xstring11 } if (*source).ModelSourceId != nil { - xstring13 := *(*source).ModelSourceId - openapiModelArtifact.ModelSourceId = &xstring13 + xstring12 := *(*source).ModelSourceId + openapiModelArtifact.ModelSourceId = &xstring12 } if (*source).ModelSourceName != nil { - xstring14 := *(*source).ModelSourceName - openapiModelArtifact.ModelSourceName = &xstring14 + xstring13 := *(*source).ModelSourceName + openapiModelArtifact.ModelSourceName = &xstring13 + } + if (*source).Uri != nil { + xstring14 := *(*source).Uri + openapiModelArtifact.Uri = &xstring14 + } + if (*source).State != nil { + openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*(*source).State) + if err != nil { + return nil, fmt.Errorf("error setting field State: %w", err) + } + openapiModelArtifact.State = &openapiArtifactState } pOpenapiModelArtifact = &openapiModelArtifact } @@ -316,56 +316,56 @@ func (c *OpenAPIConverterImpl) ConvertModelArtifactUpdate(source *openapi.ModelA xstring2 := *(*source).ExternalId openapiModelArtifact.ExternalId = &xstring2 } - if (*source).Uri != nil { - xstring3 := *(*source).Uri - openapiModelArtifact.Uri = &xstring3 - } - if (*source).State != nil { - openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*(*source).State) - if err != nil { - return nil, fmt.Errorf("error setting field State: %w", err) - } - openapiModelArtifact.State = &openapiArtifactState - } if (*source).ModelFormatName != nil { - xstring4 := *(*source).ModelFormatName - openapiModelArtifact.ModelFormatName = &xstring4 + xstring3 := *(*source).ModelFormatName + openapiModelArtifact.ModelFormatName = &xstring3 } if (*source).StorageKey != nil { - xstring5 := *(*source).StorageKey - openapiModelArtifact.StorageKey = &xstring5 + xstring4 := *(*source).StorageKey + openapiModelArtifact.StorageKey = &xstring4 } if (*source).StoragePath != nil { - xstring6 := *(*source).StoragePath - openapiModelArtifact.StoragePath = &xstring6 + xstring5 := *(*source).StoragePath + openapiModelArtifact.StoragePath = &xstring5 } if (*source).ModelFormatVersion != nil { - xstring7 := *(*source).ModelFormatVersion - openapiModelArtifact.ModelFormatVersion = &xstring7 + xstring6 := *(*source).ModelFormatVersion + openapiModelArtifact.ModelFormatVersion = &xstring6 } if (*source).ServiceAccountName != nil { - xstring8 := *(*source).ServiceAccountName - openapiModelArtifact.ServiceAccountName = &xstring8 + xstring7 := *(*source).ServiceAccountName + openapiModelArtifact.ServiceAccountName = &xstring7 } if (*source).ModelSourceKind != nil { - xstring9 := *(*source).ModelSourceKind - openapiModelArtifact.ModelSourceKind = &xstring9 + xstring8 := *(*source).ModelSourceKind + openapiModelArtifact.ModelSourceKind = &xstring8 } if (*source).ModelSourceClass != nil { - xstring10 := *(*source).ModelSourceClass - openapiModelArtifact.ModelSourceClass = &xstring10 + xstring9 := *(*source).ModelSourceClass + openapiModelArtifact.ModelSourceClass = &xstring9 } if (*source).ModelSourceGroup != nil { - xstring11 := *(*source).ModelSourceGroup - openapiModelArtifact.ModelSourceGroup = &xstring11 + xstring10 := *(*source).ModelSourceGroup + openapiModelArtifact.ModelSourceGroup = &xstring10 } if (*source).ModelSourceId != nil { - xstring12 := *(*source).ModelSourceId - openapiModelArtifact.ModelSourceId = &xstring12 + xstring11 := *(*source).ModelSourceId + openapiModelArtifact.ModelSourceId = &xstring11 } if (*source).ModelSourceName != nil { - xstring13 := *(*source).ModelSourceName - openapiModelArtifact.ModelSourceName = &xstring13 + xstring12 := *(*source).ModelSourceName + openapiModelArtifact.ModelSourceName = &xstring12 + } + if (*source).Uri != nil { + xstring13 := *(*source).Uri + openapiModelArtifact.Uri = &xstring13 + } + if (*source).State != nil { + openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*(*source).State) + if err != nil { + return nil, fmt.Errorf("error setting field State: %w", err) + } + openapiModelArtifact.State = &openapiArtifactState } pOpenapiModelArtifact = &openapiModelArtifact } @@ -526,13 +526,6 @@ func (c *OpenAPIConverterImpl) ConvertServeModelCreate(source *openapi.ServeMode var pOpenapiServeModel *openapi.ServeModel if source != nil { var openapiServeModel openapi.ServeModel - if (*source).LastKnownState != nil { - openapiExecutionState, err := c.openapiExecutionStateToOpenapiExecutionState(*(*source).LastKnownState) - if err != nil { - return nil, fmt.Errorf("error setting field LastKnownState: %w", err) - } - openapiServeModel.LastKnownState = &openapiExecutionState - } if (*source).CustomProperties != nil { var mapStringOpenapiMetadataValue map[string]openapi.MetadataValue if (*(*source).CustomProperties) != nil { @@ -555,6 +548,13 @@ func (c *OpenAPIConverterImpl) ConvertServeModelCreate(source *openapi.ServeMode xstring3 := *(*source).Name openapiServeModel.Name = &xstring3 } + if (*source).LastKnownState != nil { + openapiExecutionState, err := c.openapiExecutionStateToOpenapiExecutionState(*(*source).LastKnownState) + if err != nil { + return nil, fmt.Errorf("error setting field LastKnownState: %w", err) + } + openapiServeModel.LastKnownState = &openapiExecutionState + } openapiServeModel.ModelVersionId = (*source).ModelVersionId pOpenapiServeModel = &openapiServeModel } @@ -564,13 +564,6 @@ func (c *OpenAPIConverterImpl) ConvertServeModelUpdate(source *openapi.ServeMode var pOpenapiServeModel *openapi.ServeModel if source != nil { var openapiServeModel openapi.ServeModel - if (*source).LastKnownState != nil { - openapiExecutionState, err := c.openapiExecutionStateToOpenapiExecutionState(*(*source).LastKnownState) - if err != nil { - return nil, fmt.Errorf("error setting field LastKnownState: %w", err) - } - openapiServeModel.LastKnownState = &openapiExecutionState - } if (*source).CustomProperties != nil { var mapStringOpenapiMetadataValue map[string]openapi.MetadataValue if (*(*source).CustomProperties) != nil { @@ -589,6 +582,13 @@ func (c *OpenAPIConverterImpl) ConvertServeModelUpdate(source *openapi.ServeMode xstring2 := *(*source).ExternalId openapiServeModel.ExternalId = &xstring2 } + if (*source).LastKnownState != nil { + openapiExecutionState, err := c.openapiExecutionStateToOpenapiExecutionState(*(*source).LastKnownState) + if err != nil { + return nil, fmt.Errorf("error setting field LastKnownState: %w", err) + } + openapiServeModel.LastKnownState = &openapiExecutionState + } pOpenapiServeModel = &openapiServeModel } return pOpenapiServeModel, nil diff --git a/internal/converter/generated/openapi_reconciler.gen.go b/internal/converter/generated/openapi_reconciler.gen.go index 6ef3311e9d..088c71aa42 100644 --- a/internal/converter/generated/openapi_reconciler.gen.go +++ b/internal/converter/generated/openapi_reconciler.gen.go @@ -159,102 +159,102 @@ func (c *OpenAPIReconcilerImpl) UpdateExistingModelArtifact(source converter.Ope } var pString3 *string if source.Update != nil { - pString3 = source.Update.Uri + pString3 = source.Update.ModelFormatName } if pString3 != nil { xstring3 := *pString3 - openapiModelArtifact.Uri = &xstring3 - } - var pOpenapiArtifactState *openapi.ArtifactState - if source.Update != nil { - pOpenapiArtifactState = source.Update.State - } - if pOpenapiArtifactState != nil { - openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*pOpenapiArtifactState) - if err != nil { - return openapiModelArtifact, fmt.Errorf("error setting field State: %w", err) - } - openapiModelArtifact.State = &openapiArtifactState + openapiModelArtifact.ModelFormatName = &xstring3 } var pString4 *string if source.Update != nil { - pString4 = source.Update.ModelFormatName + pString4 = source.Update.StorageKey } if pString4 != nil { xstring4 := *pString4 - openapiModelArtifact.ModelFormatName = &xstring4 + openapiModelArtifact.StorageKey = &xstring4 } var pString5 *string if source.Update != nil { - pString5 = source.Update.StorageKey + pString5 = source.Update.StoragePath } if pString5 != nil { xstring5 := *pString5 - openapiModelArtifact.StorageKey = &xstring5 + openapiModelArtifact.StoragePath = &xstring5 } var pString6 *string if source.Update != nil { - pString6 = source.Update.StoragePath + pString6 = source.Update.ModelFormatVersion } if pString6 != nil { xstring6 := *pString6 - openapiModelArtifact.StoragePath = &xstring6 + openapiModelArtifact.ModelFormatVersion = &xstring6 } var pString7 *string if source.Update != nil { - pString7 = source.Update.ModelFormatVersion + pString7 = source.Update.ServiceAccountName } if pString7 != nil { xstring7 := *pString7 - openapiModelArtifact.ModelFormatVersion = &xstring7 + openapiModelArtifact.ServiceAccountName = &xstring7 } var pString8 *string if source.Update != nil { - pString8 = source.Update.ServiceAccountName + pString8 = source.Update.ModelSourceKind } if pString8 != nil { xstring8 := *pString8 - openapiModelArtifact.ServiceAccountName = &xstring8 + openapiModelArtifact.ModelSourceKind = &xstring8 } var pString9 *string if source.Update != nil { - pString9 = source.Update.ModelSourceKind + pString9 = source.Update.ModelSourceClass } if pString9 != nil { xstring9 := *pString9 - openapiModelArtifact.ModelSourceKind = &xstring9 + openapiModelArtifact.ModelSourceClass = &xstring9 } var pString10 *string if source.Update != nil { - pString10 = source.Update.ModelSourceClass + pString10 = source.Update.ModelSourceGroup } if pString10 != nil { xstring10 := *pString10 - openapiModelArtifact.ModelSourceClass = &xstring10 + openapiModelArtifact.ModelSourceGroup = &xstring10 } var pString11 *string if source.Update != nil { - pString11 = source.Update.ModelSourceGroup + pString11 = source.Update.ModelSourceId } if pString11 != nil { xstring11 := *pString11 - openapiModelArtifact.ModelSourceGroup = &xstring11 + openapiModelArtifact.ModelSourceId = &xstring11 } var pString12 *string if source.Update != nil { - pString12 = source.Update.ModelSourceId + pString12 = source.Update.ModelSourceName } if pString12 != nil { xstring12 := *pString12 - openapiModelArtifact.ModelSourceId = &xstring12 + openapiModelArtifact.ModelSourceName = &xstring12 } var pString13 *string if source.Update != nil { - pString13 = source.Update.ModelSourceName + pString13 = source.Update.Uri } if pString13 != nil { xstring13 := *pString13 - openapiModelArtifact.ModelSourceName = &xstring13 + openapiModelArtifact.Uri = &xstring13 + } + var pOpenapiArtifactState *openapi.ArtifactState + if source.Update != nil { + pOpenapiArtifactState = source.Update.State + } + if pOpenapiArtifactState != nil { + openapiArtifactState, err := c.openapiArtifactStateToOpenapiArtifactState(*pOpenapiArtifactState) + if err != nil { + return openapiModelArtifact, fmt.Errorf("error setting field State: %w", err) + } + openapiModelArtifact.State = &openapiArtifactState } return openapiModelArtifact, nil } @@ -366,17 +366,6 @@ func (c *OpenAPIReconcilerImpl) UpdateExistingRegisteredModel(source converter.O } func (c *OpenAPIReconcilerImpl) UpdateExistingServeModel(source converter.OpenapiUpdateWrapper[openapi.ServeModel]) (openapi.ServeModel, error) { openapiServeModel := converter.InitWithExisting(source) - var pOpenapiExecutionState *openapi.ExecutionState - if source.Update != nil { - pOpenapiExecutionState = source.Update.LastKnownState - } - if pOpenapiExecutionState != nil { - openapiExecutionState, err := c.openapiExecutionStateToOpenapiExecutionState(*pOpenapiExecutionState) - if err != nil { - return openapiServeModel, fmt.Errorf("error setting field LastKnownState: %w", err) - } - openapiServeModel.LastKnownState = &openapiExecutionState - } var pMapStringOpenapiMetadataValue *map[string]openapi.MetadataValue if source.Update != nil { pMapStringOpenapiMetadataValue = source.Update.CustomProperties @@ -407,6 +396,17 @@ func (c *OpenAPIReconcilerImpl) UpdateExistingServeModel(source converter.Openap xstring2 := *pString2 openapiServeModel.ExternalId = &xstring2 } + var pOpenapiExecutionState *openapi.ExecutionState + if source.Update != nil { + pOpenapiExecutionState = source.Update.LastKnownState + } + if pOpenapiExecutionState != nil { + openapiExecutionState, err := c.openapiExecutionStateToOpenapiExecutionState(*pOpenapiExecutionState) + if err != nil { + return openapiServeModel, fmt.Errorf("error setting field LastKnownState: %w", err) + } + openapiServeModel.LastKnownState = &openapiExecutionState + } return openapiServeModel, nil } func (c *OpenAPIReconcilerImpl) UpdateExistingServingEnvironment(source converter.OpenapiUpdateWrapper[openapi.ServingEnvironment]) (openapi.ServingEnvironment, error) { diff --git a/internal/server/openapi/.openapi-generator/FILES b/internal/server/openapi/.openapi-generator/FILES index 3b916e2313..b7f294ba29 100644 --- a/internal/server/openapi/.openapi-generator/FILES +++ b/internal/server/openapi/.openapi-generator/FILES @@ -9,12 +9,6 @@ model_artifact_create.go model_artifact_list.go model_artifact_state.go model_artifact_update.go -model_base_artifact.go -model_base_artifact_create.go -model_base_artifact_update.go -model_base_execution.go -model_base_execution_create.go -model_base_execution_update.go model_base_resource.go model_base_resource_create.go model_base_resource_list.go diff --git a/internal/server/openapi/type_asserts.go b/internal/server/openapi/type_asserts.go index a3dc15d519..dba8faf3eb 100644 --- a/internal/server/openapi/type_asserts.go +++ b/internal/server/openapi/type_asserts.go @@ -83,66 +83,6 @@ func AssertArtifactUpdateRequired(obj model.ArtifactUpdate) error { return nil } -// AssertBaseArtifactConstraints checks if the values respects the defined constraints -func AssertBaseArtifactConstraints(obj model.BaseArtifact) error { - return nil -} - -// AssertBaseArtifactCreateConstraints checks if the values respects the defined constraints -func AssertBaseArtifactCreateConstraints(obj model.BaseArtifactCreate) error { - return nil -} - -// AssertBaseArtifactCreateRequired checks if the required fields are not zero-ed -func AssertBaseArtifactCreateRequired(obj model.BaseArtifactCreate) error { - return nil -} - -// AssertBaseArtifactRequired checks if the required fields are not zero-ed -func AssertBaseArtifactRequired(obj model.BaseArtifact) error { - return nil -} - -// AssertBaseArtifactUpdateConstraints checks if the values respects the defined constraints -func AssertBaseArtifactUpdateConstraints(obj model.BaseArtifactUpdate) error { - return nil -} - -// AssertBaseArtifactUpdateRequired checks if the required fields are not zero-ed -func AssertBaseArtifactUpdateRequired(obj model.BaseArtifactUpdate) error { - return nil -} - -// AssertBaseExecutionConstraints checks if the values respects the defined constraints -func AssertBaseExecutionConstraints(obj model.BaseExecution) error { - return nil -} - -// AssertBaseExecutionCreateConstraints checks if the values respects the defined constraints -func AssertBaseExecutionCreateConstraints(obj model.BaseExecutionCreate) error { - return nil -} - -// AssertBaseExecutionCreateRequired checks if the required fields are not zero-ed -func AssertBaseExecutionCreateRequired(obj model.BaseExecutionCreate) error { - return nil -} - -// AssertBaseExecutionRequired checks if the required fields are not zero-ed -func AssertBaseExecutionRequired(obj model.BaseExecution) error { - return nil -} - -// AssertBaseExecutionUpdateConstraints checks if the values respects the defined constraints -func AssertBaseExecutionUpdateConstraints(obj model.BaseExecutionUpdate) error { - return nil -} - -// AssertBaseExecutionUpdateRequired checks if the required fields are not zero-ed -func AssertBaseExecutionUpdateRequired(obj model.BaseExecutionUpdate) error { - return nil -} - // AssertBaseResourceConstraints checks if the values respects the defined constraints func AssertBaseResourceConstraints(obj model.BaseResource) error { return nil diff --git a/manifests/kustomize/README.md b/manifests/kustomize/README.md index 6aab1c2931..65d478754a 100644 --- a/manifests/kustomize/README.md +++ b/manifests/kustomize/README.md @@ -11,26 +11,34 @@ This is the full installation guide, for a quick install in an existing Kubeflow These instructions assume that you've installed Kubeflow from the [manifests](https://github.com/kubeflow/manifests/), if you're using a distribution consult its documentation instead. -Kubeflow Central Dashboard uses [Profiles](https://www.kubeflow.org/docs/components/central-dash/profiles/) to handle user namespaces and permissions. By default, the manifests deploy the Model Registry instance in the `kubeflow` namespace, to install a compatible version of Model Registry for Kubeflow, you should deploy a separate instance of Model Registry in the profile's namespace. For that just run: +Kubeflow Central Dashboard uses [profiles](https://www.kubeflow.org/docs/components/central-dash/profiles/) to handle user namespaces and permissions. You will need to deploy Model Registry into a profile namespace. + +> **🛈 Note:** If you're not sure of the profile name, you can find it in the name space drop-down on the Kubeflow Dashboard. + +The commands in this section assume that you've defined an environment variable with the target profile namespace: ```sh PROFILE_NAME= -for DIR in options/istio overlays/db ; do (cd $DIR; kustomize edit set namespace $PROFILE_NAME; kubectl apply -k .); done ``` -> **⚠️ Warning:** If you're not sure of the profile name, you can find it in the name space drop-down on the Kubeflow Dashboard. +Deploy Model Registry: -Check everything is up and running: +```sh +kubectl apply -k overlays/db -n $PROFILE_NAME +kubectl apply -k options/istio -n $PROFILE_NAME +``` + +Check that everything is up and running: ```bash -kubectl wait --for=condition=available-n ${PROFILE_NAME} deployment/model-registry-deployment --timeout=2m -kubectl logs -n ${PROFILE_NAME} deployment/model-registry-deployment +kubectl wait --for=condition=available-n $PROFILE_NAME deployment/model-registry-deployment --timeout=2m +kubectl logs -n $PROFILE_NAME deployment/model-registry-deployment ``` Now, to install the Model Registry UI as a Kubeflow component, you need first to deploy the Model Registry UI: ```bash -kubectl apply -k options/ui/overlays/istio -n kubeflow +kubectl apply -k options/ui/overlays/istio ``` And then to make it accessible through Kubeflow Central Dashboard, you need to edit the `centraldashboard-config` ConfigMap to add the Model Registry UI link to the Central Dashboard by running the following command: @@ -69,25 +77,25 @@ To uninstall the Kubeflow Model Registry run: ```bash # Uninstall Model Registry Instance PROFILE_NAME= -for DIR in options/istio overlays/db ; do (cd $DIR; kustomize edit set namespace $PROFILE_NAME; kubectl delete -k .); done +kubectl delete -k overlays/db -n $PROFILE_NAME +kubectl delete -k options/istio -n $PROFILE_NAME # Uninstall Model Registry UI -kubectl delete -k options/ui/overlays/istio -n kubeflow +kubectl delete -k options/ui/overlays/istio ``` - ## Model Registry as a separate component Installation The following instructions will summarize how to deploy Model Registry as separate component in the context of a default Kubeflow >=1.9 installation. ```bash -kubectl apply -k overlays/db +kubectl apply -k overlays/db -n kubeflow ``` As the default Kubeflow installation provides an Istio mesh, apply the necessary manifests: ```bash -kubectl apply -k options/istio +kubectl apply -k options/istio -n kubeflow ``` Check everything is up and running: @@ -121,8 +129,8 @@ To uninstall the Kubeflow Model Registry run: ```bash # Delete istio options -kubectl delete -k options/istio +kubectl delete -k options/istio -n kubeflow # Delete model registry db and deployment -kubectl delete -k overlays/db +kubectl delete -k overlays/db -n kubeflow ``` diff --git a/manifests/kustomize/base/model-registry-deployment.yaml b/manifests/kustomize/base/model-registry-deployment.yaml index 81382e29e0..4adfb16ede 100644 --- a/manifests/kustomize/base/model-registry-deployment.yaml +++ b/manifests/kustomize/base/model-registry-deployment.yaml @@ -91,7 +91,7 @@ spec: args: ["--grpc_port=9090", "--mysql_config_database=$(MYSQL_DATABASE)", "--mysql_config_host=$(MYSQL_HOST)", - "--mysql_config_port=$(MYSQL_PORT)", + "--mysql_config_port=MYSQL_PORT_PLACEHOLDER", "--mysql_config_user=$(DBCONFIG_USER)", "--mysql_config_password=$(DBCONFIG_PASSWORD)", "--enable_database_upgrade=true" diff --git a/manifests/kustomize/options/istio/kustomization.yaml b/manifests/kustomize/options/istio/kustomization.yaml index 91263f9b24..029a6937ca 100644 --- a/manifests/kustomize/options/istio/kustomization.yaml +++ b/manifests/kustomize/options/istio/kustomization.yaml @@ -1,6 +1,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -namespace: kubeflow resources: - istio-authorization-policy.yaml diff --git a/manifests/kustomize/overlays/db/kustomization.yaml b/manifests/kustomize/overlays/db/kustomization.yaml index cf53e41695..0323d5b37c 100644 --- a/manifests/kustomize/overlays/db/kustomization.yaml +++ b/manifests/kustomize/overlays/db/kustomization.yaml @@ -1,6 +1,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -namespace: kubeflow resources: - model-registry-db-pvc.yaml @@ -8,8 +7,6 @@ resources: - model-registry-db-service.yaml - ../../base -patchesStrategicMerge: -- patches/model-registry-deployment.yaml configMapGenerator: - envs: @@ -28,18 +25,45 @@ images: newName: mysql newTag: 8.0.39 -vars: -- fieldref: +patches: +- path: patches/model-registry-deployment.yaml +replacements: +- source: fieldPath: metadata.name - name: MLMD_DB_HOST - objref: - apiVersion: v1 kind: Service name: model-registry-db -- name: MYSQL_PORT - objref: + version: v1 + targets: + - fieldPaths: + - spec.template.spec.containers.1.args.1 + options: + delimiter: = + index: 1 + select: + group: apps + kind: Deployment + name: model-registry-deployment + version: v1 +- source: + fieldPath: data.MYSQL_PORT kind: ConfigMap name: model-registry-db-parameters - apiVersion: v1 - fieldref: - fieldpath: data.MYSQL_PORT + version: v1 + targets: + - fieldPaths: + - spec.template.spec.containers.1.args.3 + options: + delimiter: = + index: 1 + select: + group: apps + kind: Deployment + name: model-registry-deployment + version: v1 + - fieldPaths: + - spec.template.metadata.annotations.[traffic.sidecar.istio.io/excludeOutboundPorts] + select: + group: apps + kind: Deployment + name: model-registry-deployment + version: v1 diff --git a/manifests/kustomize/overlays/db/patches/model-registry-deployment.yaml b/manifests/kustomize/overlays/db/patches/model-registry-deployment.yaml index b6eca64de9..0d61bf30fa 100644 --- a/manifests/kustomize/overlays/db/patches/model-registry-deployment.yaml +++ b/manifests/kustomize/overlays/db/patches/model-registry-deployment.yaml @@ -7,7 +7,7 @@ spec: metadata: annotations: # db doesn't use istio - traffic.sidecar.istio.io/excludeOutboundPorts: $(MYSQL_PORT) + traffic.sidecar.istio.io/excludeOutboundPorts: MYSQL_PORT_PLACEHOLDER spec: containers: - name: rest-container @@ -35,8 +35,8 @@ spec: - configMapRef: name: model-registry-configmap args: ["--grpc_port=$(MODEL_REGISTRY_GRPC_SERVICE_PORT)", - "--mysql_config_host=$(MLMD_DB_HOST)", + "--mysql_config_host=MLMD_DB_HOST_PLACEHOLDER", "--mysql_config_database=$(MYSQL_DATABASE)", - "--mysql_config_port=$(MYSQL_PORT)", + "--mysql_config_port=MYSQL_PORT_PLACEHOLDER", "--mysql_config_user=$(MYSQL_USER_NAME)", "--mysql_config_password=$(MYSQL_ROOT_PASSWORD)"] diff --git a/manifests/kustomize/overlays/postgres/kustomization.yaml b/manifests/kustomize/overlays/postgres/kustomization.yaml index 6a3822d8b0..0f81c89a43 100644 --- a/manifests/kustomize/overlays/postgres/kustomization.yaml +++ b/manifests/kustomize/overlays/postgres/kustomization.yaml @@ -1,25 +1,21 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -namespace: kubeflow -bases: -- ../../base resources: - model-registry-db-pvc.yaml - model-registry-db-deployment.yaml - model-registry-db-service.yaml +- ../../base -patchesStrategicMerge: -- patches/model-registry-deployment.yaml configMapGenerator: -- name: metadata-registry-db-parameters - envs: +- envs: - params.env + name: metadata-registry-db-parameters secretGenerator: -- name: metadata-registry-db-secrets - envs: +- envs: - secrets.env + name: metadata-registry-db-secrets generatorOptions: disableNameSuffixHash: true @@ -28,18 +24,45 @@ images: newName: postgres newTag: 14.7-alpine3.17 -vars: -- name: MLMD_DB_HOST - objref: +patches: +- path: patches/model-registry-deployment.yaml +replacements: +- source: + fieldPath: metadata.name kind: Service name: metadata-postgres-db - apiVersion: v1 - fieldref: - fieldpath: metadata.name -- name: POSTGRES_PORT - objref: + version: v1 + targets: + - fieldPaths: + - spec.template.spec.containers.0.args.2 + options: + delimiter: = + index: 1 + select: + group: apps + kind: Deployment + name: model-registry-deployment + version: v1 +- source: + fieldPath: data.POSTGRES_PORT kind: ConfigMap name: metadata-registry-db-parameters - apiVersion: v1 - fieldref: - fieldpath: data.POSTGRES_PORT + version: v1 + targets: + - fieldPaths: + - spec.template.metadata.annotations.[traffic.sidecar.istio.io/excludeOutboundPorts] + select: + group: apps + kind: Deployment + name: model-registry-deployment + version: v1 + - fieldPaths: + - spec.template.spec.containers.0.args.3 + options: + delimiter: = + index: 1 + select: + group: apps + kind: Deployment + name: model-registry-deployment + version: v1 diff --git a/manifests/kustomize/overlays/postgres/patches/model-registry-deployment.yaml b/manifests/kustomize/overlays/postgres/patches/model-registry-deployment.yaml index 9844feaaef..1dec4cd75a 100644 --- a/manifests/kustomize/overlays/postgres/patches/model-registry-deployment.yaml +++ b/manifests/kustomize/overlays/postgres/patches/model-registry-deployment.yaml @@ -7,7 +7,7 @@ spec: metadata: annotations: # db doesn't use istio - traffic.sidecar.istio.io/excludeOutboundPorts: $(POSTGRES_PORT) + traffic.sidecar.istio.io/excludeOutboundPorts: POSTGRES_PORT_PLACEHOLDER spec: containers: - name: grpc-container @@ -23,8 +23,8 @@ spec: name: model-registry-configmap args: ["--grpc_port=$(MODEL_REGISTRY_GRPC_SERVICE_PORT)", "--metadata_source_config_type=postgresql", - "--postgres_config_host=$(MLMD_DB_HOST)", - "--postgres_config_port=$(POSTGRES_PORT)", + "--postgres_config_host=MLMD_DB_HOST_PLACEHOLDER", + "--postgres_config_port=POSTGRES_PORT_PLACEHOLDER", "--postgres_config_dbname=$(POSTGRES_DBNAME)", "--postgres_config_user=$(POSTGRES_USER)", "--postgres_config_password=$(POSTGRES_PASSWORD)", diff --git a/pkg/inferenceservice-controller/controller.go b/pkg/inferenceservice-controller/controller.go index 60986a92d7..ae1779a436 100644 --- a/pkg/inferenceservice-controller/controller.go +++ b/pkg/inferenceservice-controller/controller.go @@ -166,6 +166,27 @@ func (r *InferenceServiceController) Reconcile(ctx context.Context, req ctrl.Req if err != nil { return ctrl.Result{}, fmt.Errorf("unable to find InferenceService with id %s in model registry: %w", mrIsvcId, err) } + + mrCurrentIvcUrl := "" + + if mrIs.CustomProperties != nil { + mrCurrentIvcUrl = (*mrIs.CustomProperties)["url"].MetadataStringValue.GetStringValue() + } + + urlAreDiff := r.checkURLDiff(isvc, mrCurrentIvcUrl) + if urlAreDiff { + err := r.updateMRInferenceService( + mrApiCtx, + log, + mrApi, + isvc, + mrIs, + ) + if err != nil { + return ctrl.Result{}, err + } + } + } else if okRegisteredModelId { // No corresponding InferenceService in model registry, create new one mrIs, err = r.createMRInferenceService(mrApiCtx, log, mrApi, isvc, *servingEnvironment.Id, registeredModelId, modelVersionId) @@ -225,6 +246,18 @@ func (r *InferenceServiceController) SetupWithManager(mgr ctrl.Manager) error { return builder.Complete(r) } +func (r *InferenceServiceController) checkURLDiff(isvc *kservev1beta1.InferenceService, mrIsvcUrl string) bool { + if mrIsvcUrl == "" && isvc.Status.URL == nil { + return false + } + + if isvc.Status.URL == nil { + return true + } + + return mrIsvcUrl != isvc.Status.URL.String() +} + func (r *InferenceServiceController) initModelRegistryService(ctx context.Context, log logr.Logger, name, namespace, url string) (*openapi.APIClient, error) { var err error @@ -334,19 +367,59 @@ func (r *InferenceServiceController) createMRInferenceService( if err != nil { log.Info("Creating new model registry InferenceService", "name", isName, "registeredModelId", registeredModelId, "modelVersionId", modelVersionId) - is, _, err = mr.ModelRegistryServiceAPI.CreateInferenceService(ctx).InferenceServiceCreate(openapi.InferenceServiceCreate{ + isCreate := openapi.InferenceServiceCreate{ DesiredState: openapi.INFERENCESERVICESTATE_DEPLOYED.Ptr(), ModelVersionId: modelVersionIdPtr, Name: &isName, RegisteredModelId: registeredModelId, Runtime: isvc.Spec.Predictor.Model.Runtime, ServingEnvironmentId: servingEnvironmentId, - }).Execute() + } + + if isvc.Status.URL != nil { + isCreate.CustomProperties = &map[string]openapi.MetadataValue{} + + (*isCreate.CustomProperties)["url"] = openapi.MetadataValue{ + MetadataStringValue: openapi.NewMetadataStringValue(isvc.Status.URL.String(), "MetadataStringValue"), + } + } + + is, _, err = mr.ModelRegistryServiceAPI.CreateInferenceService(ctx).InferenceServiceCreate(isCreate).Execute() } return is, err } +func (r *InferenceServiceController) updateMRInferenceService( + ctx context.Context, + log logr.Logger, + mr *openapi.APIClient, + isvc *kservev1beta1.InferenceService, + mrIsvc *openapi.InferenceService, +) error { + log.Info("Updating model registry InferenceService..") + + url := "" + + if isvc.Status.URL != nil { + url = isvc.Status.URL.String() + } + + if mrIsvc.CustomProperties == nil { + mrIsvc.CustomProperties = &map[string]openapi.MetadataValue{} + } + + (*mrIsvc.CustomProperties)["url"] = openapi.MetadataValue{ + MetadataStringValue: openapi.NewMetadataStringValue(url, "MetadataStringValue"), + } + + _, _, err := mr.ModelRegistryServiceAPI.UpdateInferenceService(ctx, *mrIsvc.Id).InferenceServiceUpdate(openapi.InferenceServiceUpdate{ + CustomProperties: mrIsvc.CustomProperties, + }).Execute() + + return err +} + func (r *InferenceServiceController) getOrCreateServingEnvironment(ctx context.Context, log logr.Logger, mr *openapi.APIClient, namespace string) (*openapi.ServingEnvironment, error) { servingEnvironment, _, err := mr.ModelRegistryServiceAPI.FindServingEnvironment(ctx).Name(namespace).Execute() if err != nil { diff --git a/pkg/inferenceservice-controller/controller_test.go b/pkg/inferenceservice-controller/controller_test.go index 7945971e84..c7d0ac7e0b 100644 --- a/pkg/inferenceservice-controller/controller_test.go +++ b/pkg/inferenceservice-controller/controller_test.go @@ -1,12 +1,16 @@ package inferenceservicecontroller_test import ( + "encoding/json" "fmt" + "io" "time" kservev1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1" + "github.com/kubeflow/model-registry/pkg/openapi" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "knative.dev/pkg/apis" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -237,4 +241,331 @@ var _ = Describe("InferenceService Controller", func() { }, 10*time.Second, 1*time.Second).Should(Succeed()) }) }) + + When("An InferenceService have a status.url defined", func() { + It("Should get reconciled in the model registry InferenceService resource", func() { + const InferenceServiceMissingNamePath = "./testdata/inferenceservices/inference-service-missing-name.yaml" + const ModelRegistrySVCPath = "./testdata/deploy/model-registry-svc.yaml" + const namespace = "url-reconcile" + const mrUrl = "http://model-registry.svc.cluster.local:8080" + + ns := &corev1.Namespace{} + + ns.SetName(namespace) + + if err := cli.Create(ctx, ns); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + mrSvc := &corev1.Service{} + Expect(ConvertFileToStructuredResource(ModelRegistrySVCPath, mrSvc)).To(Succeed()) + + mrSvc.SetNamespace(namespace) + + if err := cli.Create(ctx, mrSvc); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + inferenceService := &kservev1beta1.InferenceService{} + Expect(ConvertFileToStructuredResource(InferenceServiceMissingNamePath, inferenceService)).To(Succeed()) + + inferenceService.SetNamespace(namespace) + + inferenceService.Labels[namespaceLabel] = namespace + + if err := cli.Create(ctx, inferenceService); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + Eventually(func() error { + isvc := &kservev1beta1.InferenceService{} + err := cli.Get(ctx, types.NamespacedName{ + Name: inferenceService.Name, + Namespace: inferenceService.Namespace, + }, isvc) + if err != nil { + return err + } + + if isvc.Labels[inferenceServiceIDLabel] != "1" { + return fmt.Errorf("Label for InferenceServiceID is not set, got %s", isvc.Labels[inferenceServiceIDLabel]) + } + + return nil + }, 10*time.Second, 1*time.Second).Should(Succeed()) + + restIsvc := &openapi.InferenceService{} + + resp, err := mrMockServer.Client().Get(mrUrl + "/api/model_registry/v1alpha3/inference_services/1") + Expect(err).To(BeNil()) + + //nolint:errcheck + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + Expect(err).To(BeNil()) + + err = json.Unmarshal(body, &restIsvc) + Expect(err).To(BeNil()) + Expect(restIsvc.CustomProperties).To(BeNil()) + + url, err := apis.ParseURL("https://example.com") + Expect(err).To(BeNil()) + + err = cli.Get(ctx, types.NamespacedName{Name: inferenceService.Name, Namespace: inferenceService.Namespace}, inferenceService) + Expect(err).To(BeNil()) + + inferenceService.Status.URL = url + + if err := cli.Status().Update(ctx, inferenceService); err != nil { + Fail(err.Error()) + } + + Eventually(func() error { + resp, err := mrMockServer.Client().Get(mrUrl + "/api/model_registry/v1alpha3/inference_services/1") + Expect(err).To(BeNil()) + + //nolint:errcheck + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + Expect(err).To(BeNil()) + + err = json.Unmarshal(body, &restIsvc) + Expect(err).To(BeNil()) + + if restIsvc.CustomProperties == nil { + return fmt.Errorf("InferenceService URL is not set") + } + + if (*restIsvc.CustomProperties)["url"].MetadataStringValue.GetStringValue() != url.String() { + return fmt.Errorf("InferenceService URL is not set correctly, got %s, want %s", (*restIsvc.CustomProperties)["url"].MetadataStringValue.GetStringValue(), url.String()) + } + + return nil + }, 20*time.Second, 1*time.Second).Should(Succeed()) + }) + + It("Should not set the model registry InferenceService url if the status.url is nil", func() { + const InferenceServiceMissingNamePath = "./testdata/inferenceservices/inference-service-missing-name.yaml" + const ModelRegistrySVCPath = "./testdata/deploy/model-registry-svc.yaml" + const namespace = "url-reconcile-empty-status-url" + const mrUrl = "http://model-registry.svc.cluster.local:8080" + + ns := &corev1.Namespace{} + + ns.SetName(namespace) + + if err := cli.Create(ctx, ns); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + mrSvc := &corev1.Service{} + Expect(ConvertFileToStructuredResource(ModelRegistrySVCPath, mrSvc)).To(Succeed()) + + mrSvc.SetNamespace(namespace) + + if err := cli.Create(ctx, mrSvc); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + inferenceService := &kservev1beta1.InferenceService{} + Expect(ConvertFileToStructuredResource(InferenceServiceMissingNamePath, inferenceService)).To(Succeed()) + + inferenceService.SetNamespace(namespace) + + inferenceService.Labels[namespaceLabel] = namespace + + if err := cli.Create(ctx, inferenceService); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + Eventually(func() error { + isvc := &kservev1beta1.InferenceService{} + err := cli.Get(ctx, types.NamespacedName{ + Name: inferenceService.Name, + Namespace: inferenceService.Namespace, + }, isvc) + if err != nil { + return err + } + + if isvc.Labels[inferenceServiceIDLabel] != "1" { + return fmt.Errorf("Label for InferenceServiceID is not set, got %s", isvc.Labels[inferenceServiceIDLabel]) + } + + return nil + }, 10*time.Second, 1*time.Second).Should(Succeed()) + + restIsvc := &openapi.InferenceService{} + + err := cli.Get(ctx, types.NamespacedName{Name: inferenceService.Name, Namespace: inferenceService.Namespace}, inferenceService) + Expect(err).To(BeNil()) + + inferenceService.Status.URL = nil + + if err := cli.Status().Update(ctx, inferenceService); err != nil { + Fail(err.Error()) + } + + Eventually(func() error { + resp, err := mrMockServer.Client().Get(mrUrl + "/api/model_registry/v1alpha3/inference_services/1") + Expect(err).To(BeNil()) + + //nolint:errcheck + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + Expect(err).To(BeNil()) + + err = json.Unmarshal(body, &restIsvc) + Expect(err).To(BeNil()) + + if restIsvc.CustomProperties != nil { + return fmt.Errorf("InferenceService URL should not be set") + } + + return nil + }, 20*time.Second, 1*time.Second).Should(Succeed()) + }) + + It("Should update the model registry InferenceService url if the status.url is updated", func() { + const InferenceServiceMissingNamePath = "./testdata/inferenceservices/inference-service-missing-name.yaml" + const ModelRegistrySVCPath = "./testdata/deploy/model-registry-svc.yaml" + const namespace = "url-reconcile-update-status-url" + const mrUrl = "http://model-registry.svc.cluster.local:8080" + + ns := &corev1.Namespace{} + + ns.SetName(namespace) + + if err := cli.Create(ctx, ns); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + mrSvc := &corev1.Service{} + Expect(ConvertFileToStructuredResource(ModelRegistrySVCPath, mrSvc)).To(Succeed()) + + mrSvc.SetNamespace(namespace) + + if err := cli.Create(ctx, mrSvc); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + inferenceService := &kservev1beta1.InferenceService{} + Expect(ConvertFileToStructuredResource(InferenceServiceMissingNamePath, inferenceService)).To(Succeed()) + + inferenceService.SetNamespace(namespace) + + inferenceService.Labels[namespaceLabel] = namespace + + if err := cli.Create(ctx, inferenceService); err != nil && !errors.IsAlreadyExists(err) { + Fail(err.Error()) + } + + Eventually(func() error { + isvc := &kservev1beta1.InferenceService{} + err := cli.Get(ctx, types.NamespacedName{ + Name: inferenceService.Name, + Namespace: inferenceService.Namespace, + }, isvc) + if err != nil { + return err + } + + if isvc.Labels[inferenceServiceIDLabel] != "1" { + return fmt.Errorf("Label for InferenceServiceID is not set, got %s", isvc.Labels[inferenceServiceIDLabel]) + } + + return nil + }, 10*time.Second, 1*time.Second).Should(Succeed()) + + restIsvc := &openapi.InferenceService{} + + resp, err := mrMockServer.Client().Get(mrUrl + "/api/model_registry/v1alpha3/inference_services/1") + Expect(err).To(BeNil()) + + //nolint:errcheck + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + Expect(err).To(BeNil()) + + err = json.Unmarshal(body, &restIsvc) + Expect(err).To(BeNil()) + Expect(restIsvc.CustomProperties).To(BeNil()) + + url, err := apis.ParseURL("https://example.com") + Expect(err).To(BeNil()) + + err = cli.Get(ctx, types.NamespacedName{Name: inferenceService.Name, Namespace: inferenceService.Namespace}, inferenceService) + Expect(err).To(BeNil()) + + inferenceService.Status.URL = url + + if err := cli.Status().Update(ctx, inferenceService); err != nil { + Fail(err.Error()) + } + + Eventually(func() error { + resp, err := mrMockServer.Client().Get(mrUrl + "/api/model_registry/v1alpha3/inference_services/1") + Expect(err).To(BeNil()) + + //nolint:errcheck + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + Expect(err).To(BeNil()) + + err = json.Unmarshal(body, &restIsvc) + Expect(err).To(BeNil()) + + if restIsvc.CustomProperties == nil { + return fmt.Errorf("InferenceService URL is not set") + } + + if (*restIsvc.CustomProperties)["url"].MetadataStringValue.GetStringValue() != url.String() { + return fmt.Errorf("InferenceService URL is not set correctly, got %s, want %s", (*restIsvc.CustomProperties)["url"].MetadataStringValue.GetStringValue(), url.String()) + } + + return nil + }, 20*time.Second, 1*time.Second).Should(Succeed()) + + url, err = apis.ParseURL("https://example-updated.com") + Expect(err).To(BeNil()) + + err = cli.Get(ctx, types.NamespacedName{Name: inferenceService.Name, Namespace: inferenceService.Namespace}, inferenceService) + Expect(err).To(BeNil()) + + inferenceService.Status.URL = url + + if err := cli.Status().Update(ctx, inferenceService); err != nil { + Fail(err.Error()) + } + + Eventually(func() error { + resp, err := mrMockServer.Client().Get(mrUrl + "/api/model_registry/v1alpha3/inference_services/1") + Expect(err).To(BeNil()) + + //nolint:errcheck + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + Expect(err).To(BeNil()) + + err = json.Unmarshal(body, &restIsvc) + Expect(err).To(BeNil()) + + if restIsvc.CustomProperties == nil { + return fmt.Errorf("InferenceService URL is not set") + } + + if (*restIsvc.CustomProperties)["url"].MetadataStringValue.GetStringValue() != url.String() { + return fmt.Errorf("InferenceService URL is not set correctly, got %s, want %s", (*restIsvc.CustomProperties)["url"].MetadataStringValue.GetStringValue(), url.String()) + } + + return nil + }, 20*time.Second, 1*time.Second).Should(Succeed()) + }) + }) }) diff --git a/pkg/inferenceservice-controller/suite_test.go b/pkg/inferenceservice-controller/suite_test.go index cf0798bb5f..1b40cd6b83 100644 --- a/pkg/inferenceservice-controller/suite_test.go +++ b/pkg/inferenceservice-controller/suite_test.go @@ -2,6 +2,7 @@ package inferenceservicecontroller_test import ( "context" + "encoding/json" "fmt" "io" "net/http" @@ -15,6 +16,7 @@ import ( kservev1beta1 "github.com/kserve/kserve/pkg/apis/serving/v1beta1" inferenceservicecontroller "github.com/kubeflow/model-registry/pkg/inferenceservice-controller" + "github.com/kubeflow/model-registry/pkg/openapi" "go.uber.org/zap/zapcore" corev1 "k8s.io/api/core/v1" authv1 "k8s.io/api/rbac/v1" @@ -177,6 +179,9 @@ var _ = AfterSuite(func() { func ModelRegistryDefaultMockServer() *httptest.Server { handler := http.NewServeMux() + servingEnvironments := make(map[string]*openapi.ServingEnvironment) + inferenceServices := make(map[string]*openapi.InferenceService) + handler.HandleFunc("/api/model_registry/v1alpha3/serving_environments", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") @@ -187,14 +192,35 @@ func ModelRegistryDefaultMockServer() *httptest.Server { } if r.Method == http.MethodPost { + id := "1" + + senv := &openapi.ServingEnvironment{} + + senvJson, err := io.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } + + if err := json.Unmarshal(senvJson, &senv); err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } + + senv.Id = &id + + servingEnvironments[id] = senv + w.WriteHeader(http.StatusCreated) - res := `{ - "id": "1", - "name": "default" - }` + res, err := json.Marshal(senv) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } - _, err := w.Write([]byte(res)) + _, err = w.Write([]byte(res)) if err != nil { w.WriteHeader(http.StatusInternalServerError) } @@ -207,14 +233,66 @@ func ModelRegistryDefaultMockServer() *httptest.Server { handler.HandleFunc("/api/model_registry/v1alpha3/inference_services/1", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") + id := "1" + + if r.Method == http.MethodGet { + isvc, ok := inferenceServices[id] + if !ok { + w.WriteHeader(http.StatusNotFound) + + return + } + + res, err := json.Marshal(isvc) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } + + _, err = w.Write([]byte(res)) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } + + return + } + + if r.Method == http.MethodPatch { + isvc := &openapi.InferenceService{} + + isvcvJson, err := io.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } + + if err := json.Unmarshal(isvcvJson, &isvc); err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } + + isvc.Id = &id + + inferenceServices[id] = isvc - res := `{ - "id": "1" - }` + w.WriteHeader(http.StatusCreated) + + res, err := json.Marshal(isvc) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } + + _, err = w.Write([]byte(res)) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } - _, err := w.Write([]byte(res)) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) + return } }) @@ -228,13 +306,35 @@ func ModelRegistryDefaultMockServer() *httptest.Server { } if r.Method == http.MethodPost { + id := "1" + + isvc := &openapi.InferenceService{} + + isvcvJson, err := io.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } + + if err := json.Unmarshal(isvcvJson, &isvc); err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } + + isvc.Id = &id + + inferenceServices[id] = isvc + w.WriteHeader(http.StatusCreated) - res := `{ - "id": "1" - }` + res, err := json.Marshal(isvc) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + + return + } - _, err := w.Write([]byte(res)) + _, err = w.Write([]byte(res)) if err != nil { w.WriteHeader(http.StatusInternalServerError) } diff --git a/pkg/openapi/.openapi-generator/FILES b/pkg/openapi/.openapi-generator/FILES index 8a56f21b24..2532c997e9 100644 --- a/pkg/openapi/.openapi-generator/FILES +++ b/pkg/openapi/.openapi-generator/FILES @@ -6,12 +6,6 @@ model_artifact_create.go model_artifact_list.go model_artifact_state.go model_artifact_update.go -model_base_artifact.go -model_base_artifact_create.go -model_base_artifact_update.go -model_base_execution.go -model_base_execution_create.go -model_base_execution_update.go model_base_resource.go model_base_resource_create.go model_base_resource_list.go diff --git a/pkg/openapi/model_base_artifact.go b/pkg/openapi/model_base_artifact.go deleted file mode 100644 index c6bd888f12..0000000000 --- a/pkg/openapi/model_base_artifact.go +++ /dev/null @@ -1,424 +0,0 @@ -/* -Model Registry REST API - -REST API for Model Registry to create and manage ML model metadata - -API version: v1alpha3 -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the BaseArtifact type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &BaseArtifact{} - -// BaseArtifact struct for BaseArtifact -type BaseArtifact struct { - // User provided custom properties which are not defined by its type. - CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` - // An optional description about the resource. - Description *string `json:"description,omitempty"` - // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` - // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. - Name *string `json:"name,omitempty"` - // The unique server generated id of the resource. - Id *string `json:"id,omitempty"` - // Output only. Create time of the resource in millisecond since epoch. - CreateTimeSinceEpoch *string `json:"createTimeSinceEpoch,omitempty"` - // Output only. Last update time of the resource since epoch in millisecond since epoch. - LastUpdateTimeSinceEpoch *string `json:"lastUpdateTimeSinceEpoch,omitempty"` -} - -// NewBaseArtifact instantiates a new BaseArtifact object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewBaseArtifact() *BaseArtifact { - this := BaseArtifact{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state - return &this -} - -// NewBaseArtifactWithDefaults instantiates a new BaseArtifact object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewBaseArtifactWithDefaults() *BaseArtifact { - this := BaseArtifact{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state - return &this -} - -// GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. -func (o *BaseArtifact) GetCustomProperties() map[string]MetadataValue { - if o == nil || IsNil(o.CustomProperties) { - var ret map[string]MetadataValue - return ret - } - return *o.CustomProperties -} - -// GetCustomPropertiesOk returns a tuple with the CustomProperties field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetCustomPropertiesOk() (*map[string]MetadataValue, bool) { - if o == nil || IsNil(o.CustomProperties) { - return nil, false - } - return o.CustomProperties, true -} - -// HasCustomProperties returns a boolean if a field has been set. -func (o *BaseArtifact) HasCustomProperties() bool { - if o != nil && !IsNil(o.CustomProperties) { - return true - } - - return false -} - -// SetCustomProperties gets a reference to the given map[string]MetadataValue and assigns it to the CustomProperties field. -func (o *BaseArtifact) SetCustomProperties(v map[string]MetadataValue) { - o.CustomProperties = &v -} - -// GetDescription returns the Description field value if set, zero value otherwise. -func (o *BaseArtifact) GetDescription() string { - if o == nil || IsNil(o.Description) { - var ret string - return ret - } - return *o.Description -} - -// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.Description) { - return nil, false - } - return o.Description, true -} - -// HasDescription returns a boolean if a field has been set. -func (o *BaseArtifact) HasDescription() bool { - if o != nil && !IsNil(o.Description) { - return true - } - - return false -} - -// SetDescription gets a reference to the given string and assigns it to the Description field. -func (o *BaseArtifact) SetDescription(v string) { - o.Description = &v -} - -// GetExternalId returns the ExternalId field value if set, zero value otherwise. -func (o *BaseArtifact) GetExternalId() string { - if o == nil || IsNil(o.ExternalId) { - var ret string - return ret - } - return *o.ExternalId -} - -// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetExternalIdOk() (*string, bool) { - if o == nil || IsNil(o.ExternalId) { - return nil, false - } - return o.ExternalId, true -} - -// HasExternalId returns a boolean if a field has been set. -func (o *BaseArtifact) HasExternalId() bool { - if o != nil && !IsNil(o.ExternalId) { - return true - } - - return false -} - -// SetExternalId gets a reference to the given string and assigns it to the ExternalId field. -func (o *BaseArtifact) SetExternalId(v string) { - o.ExternalId = &v -} - -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *BaseArtifact) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *BaseArtifact) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *BaseArtifact) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *BaseArtifact) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *BaseArtifact) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *BaseArtifact) SetState(v ArtifactState) { - o.State = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *BaseArtifact) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *BaseArtifact) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *BaseArtifact) SetName(v string) { - o.Name = &v -} - -// GetId returns the Id field value if set, zero value otherwise. -func (o *BaseArtifact) GetId() string { - if o == nil || IsNil(o.Id) { - var ret string - return ret - } - return *o.Id -} - -// GetIdOk returns a tuple with the Id field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetIdOk() (*string, bool) { - if o == nil || IsNil(o.Id) { - return nil, false - } - return o.Id, true -} - -// HasId returns a boolean if a field has been set. -func (o *BaseArtifact) HasId() bool { - if o != nil && !IsNil(o.Id) { - return true - } - - return false -} - -// SetId gets a reference to the given string and assigns it to the Id field. -func (o *BaseArtifact) SetId(v string) { - o.Id = &v -} - -// GetCreateTimeSinceEpoch returns the CreateTimeSinceEpoch field value if set, zero value otherwise. -func (o *BaseArtifact) GetCreateTimeSinceEpoch() string { - if o == nil || IsNil(o.CreateTimeSinceEpoch) { - var ret string - return ret - } - return *o.CreateTimeSinceEpoch -} - -// GetCreateTimeSinceEpochOk returns a tuple with the CreateTimeSinceEpoch field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetCreateTimeSinceEpochOk() (*string, bool) { - if o == nil || IsNil(o.CreateTimeSinceEpoch) { - return nil, false - } - return o.CreateTimeSinceEpoch, true -} - -// HasCreateTimeSinceEpoch returns a boolean if a field has been set. -func (o *BaseArtifact) HasCreateTimeSinceEpoch() bool { - if o != nil && !IsNil(o.CreateTimeSinceEpoch) { - return true - } - - return false -} - -// SetCreateTimeSinceEpoch gets a reference to the given string and assigns it to the CreateTimeSinceEpoch field. -func (o *BaseArtifact) SetCreateTimeSinceEpoch(v string) { - o.CreateTimeSinceEpoch = &v -} - -// GetLastUpdateTimeSinceEpoch returns the LastUpdateTimeSinceEpoch field value if set, zero value otherwise. -func (o *BaseArtifact) GetLastUpdateTimeSinceEpoch() string { - if o == nil || IsNil(o.LastUpdateTimeSinceEpoch) { - var ret string - return ret - } - return *o.LastUpdateTimeSinceEpoch -} - -// GetLastUpdateTimeSinceEpochOk returns a tuple with the LastUpdateTimeSinceEpoch field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifact) GetLastUpdateTimeSinceEpochOk() (*string, bool) { - if o == nil || IsNil(o.LastUpdateTimeSinceEpoch) { - return nil, false - } - return o.LastUpdateTimeSinceEpoch, true -} - -// HasLastUpdateTimeSinceEpoch returns a boolean if a field has been set. -func (o *BaseArtifact) HasLastUpdateTimeSinceEpoch() bool { - if o != nil && !IsNil(o.LastUpdateTimeSinceEpoch) { - return true - } - - return false -} - -// SetLastUpdateTimeSinceEpoch gets a reference to the given string and assigns it to the LastUpdateTimeSinceEpoch field. -func (o *BaseArtifact) SetLastUpdateTimeSinceEpoch(v string) { - o.LastUpdateTimeSinceEpoch = &v -} - -func (o BaseArtifact) MarshalJSON() ([]byte, error) { - toSerialize, err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o BaseArtifact) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.CustomProperties) { - toSerialize["customProperties"] = o.CustomProperties - } - if !IsNil(o.Description) { - toSerialize["description"] = o.Description - } - if !IsNil(o.ExternalId) { - toSerialize["externalId"] = o.ExternalId - } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.Id) { - toSerialize["id"] = o.Id - } - if !IsNil(o.CreateTimeSinceEpoch) { - toSerialize["createTimeSinceEpoch"] = o.CreateTimeSinceEpoch - } - if !IsNil(o.LastUpdateTimeSinceEpoch) { - toSerialize["lastUpdateTimeSinceEpoch"] = o.LastUpdateTimeSinceEpoch - } - return toSerialize, nil -} - -type NullableBaseArtifact struct { - value *BaseArtifact - isSet bool -} - -func (v NullableBaseArtifact) Get() *BaseArtifact { - return v.value -} - -func (v *NullableBaseArtifact) Set(val *BaseArtifact) { - v.value = val - v.isSet = true -} - -func (v NullableBaseArtifact) IsSet() bool { - return v.isSet -} - -func (v *NullableBaseArtifact) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBaseArtifact(val *BaseArtifact) *NullableBaseArtifact { - return &NullableBaseArtifact{value: val, isSet: true} -} - -func (v NullableBaseArtifact) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBaseArtifact) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} diff --git a/pkg/openapi/model_base_artifact_create.go b/pkg/openapi/model_base_artifact_create.go deleted file mode 100644 index 75e99cfacc..0000000000 --- a/pkg/openapi/model_base_artifact_create.go +++ /dev/null @@ -1,313 +0,0 @@ -/* -Model Registry REST API - -REST API for Model Registry to create and manage ML model metadata - -API version: v1alpha3 -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the BaseArtifactCreate type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &BaseArtifactCreate{} - -// BaseArtifactCreate struct for BaseArtifactCreate -type BaseArtifactCreate struct { - // User provided custom properties which are not defined by its type. - CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` - // An optional description about the resource. - Description *string `json:"description,omitempty"` - // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` - // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. - Name *string `json:"name,omitempty"` -} - -// NewBaseArtifactCreate instantiates a new BaseArtifactCreate object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewBaseArtifactCreate() *BaseArtifactCreate { - this := BaseArtifactCreate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state - return &this -} - -// NewBaseArtifactCreateWithDefaults instantiates a new BaseArtifactCreate object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewBaseArtifactCreateWithDefaults() *BaseArtifactCreate { - this := BaseArtifactCreate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state - return &this -} - -// GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. -func (o *BaseArtifactCreate) GetCustomProperties() map[string]MetadataValue { - if o == nil || IsNil(o.CustomProperties) { - var ret map[string]MetadataValue - return ret - } - return *o.CustomProperties -} - -// GetCustomPropertiesOk returns a tuple with the CustomProperties field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactCreate) GetCustomPropertiesOk() (*map[string]MetadataValue, bool) { - if o == nil || IsNil(o.CustomProperties) { - return nil, false - } - return o.CustomProperties, true -} - -// HasCustomProperties returns a boolean if a field has been set. -func (o *BaseArtifactCreate) HasCustomProperties() bool { - if o != nil && !IsNil(o.CustomProperties) { - return true - } - - return false -} - -// SetCustomProperties gets a reference to the given map[string]MetadataValue and assigns it to the CustomProperties field. -func (o *BaseArtifactCreate) SetCustomProperties(v map[string]MetadataValue) { - o.CustomProperties = &v -} - -// GetDescription returns the Description field value if set, zero value otherwise. -func (o *BaseArtifactCreate) GetDescription() string { - if o == nil || IsNil(o.Description) { - var ret string - return ret - } - return *o.Description -} - -// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactCreate) GetDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.Description) { - return nil, false - } - return o.Description, true -} - -// HasDescription returns a boolean if a field has been set. -func (o *BaseArtifactCreate) HasDescription() bool { - if o != nil && !IsNil(o.Description) { - return true - } - - return false -} - -// SetDescription gets a reference to the given string and assigns it to the Description field. -func (o *BaseArtifactCreate) SetDescription(v string) { - o.Description = &v -} - -// GetExternalId returns the ExternalId field value if set, zero value otherwise. -func (o *BaseArtifactCreate) GetExternalId() string { - if o == nil || IsNil(o.ExternalId) { - var ret string - return ret - } - return *o.ExternalId -} - -// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactCreate) GetExternalIdOk() (*string, bool) { - if o == nil || IsNil(o.ExternalId) { - return nil, false - } - return o.ExternalId, true -} - -// HasExternalId returns a boolean if a field has been set. -func (o *BaseArtifactCreate) HasExternalId() bool { - if o != nil && !IsNil(o.ExternalId) { - return true - } - - return false -} - -// SetExternalId gets a reference to the given string and assigns it to the ExternalId field. -func (o *BaseArtifactCreate) SetExternalId(v string) { - o.ExternalId = &v -} - -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *BaseArtifactCreate) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactCreate) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *BaseArtifactCreate) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *BaseArtifactCreate) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *BaseArtifactCreate) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactCreate) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *BaseArtifactCreate) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *BaseArtifactCreate) SetState(v ArtifactState) { - o.State = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *BaseArtifactCreate) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactCreate) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *BaseArtifactCreate) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *BaseArtifactCreate) SetName(v string) { - o.Name = &v -} - -func (o BaseArtifactCreate) MarshalJSON() ([]byte, error) { - toSerialize, err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o BaseArtifactCreate) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.CustomProperties) { - toSerialize["customProperties"] = o.CustomProperties - } - if !IsNil(o.Description) { - toSerialize["description"] = o.Description - } - if !IsNil(o.ExternalId) { - toSerialize["externalId"] = o.ExternalId - } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - return toSerialize, nil -} - -type NullableBaseArtifactCreate struct { - value *BaseArtifactCreate - isSet bool -} - -func (v NullableBaseArtifactCreate) Get() *BaseArtifactCreate { - return v.value -} - -func (v *NullableBaseArtifactCreate) Set(val *BaseArtifactCreate) { - v.value = val - v.isSet = true -} - -func (v NullableBaseArtifactCreate) IsSet() bool { - return v.isSet -} - -func (v *NullableBaseArtifactCreate) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBaseArtifactCreate(val *BaseArtifactCreate) *NullableBaseArtifactCreate { - return &NullableBaseArtifactCreate{value: val, isSet: true} -} - -func (v NullableBaseArtifactCreate) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBaseArtifactCreate) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} diff --git a/pkg/openapi/model_base_artifact_update.go b/pkg/openapi/model_base_artifact_update.go deleted file mode 100644 index 2042402bc9..0000000000 --- a/pkg/openapi/model_base_artifact_update.go +++ /dev/null @@ -1,276 +0,0 @@ -/* -Model Registry REST API - -REST API for Model Registry to create and manage ML model metadata - -API version: v1alpha3 -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the BaseArtifactUpdate type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &BaseArtifactUpdate{} - -// BaseArtifactUpdate struct for BaseArtifactUpdate -type BaseArtifactUpdate struct { - // User provided custom properties which are not defined by its type. - CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` - // An optional description about the resource. - Description *string `json:"description,omitempty"` - // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` -} - -// NewBaseArtifactUpdate instantiates a new BaseArtifactUpdate object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewBaseArtifactUpdate() *BaseArtifactUpdate { - this := BaseArtifactUpdate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state - return &this -} - -// NewBaseArtifactUpdateWithDefaults instantiates a new BaseArtifactUpdate object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewBaseArtifactUpdateWithDefaults() *BaseArtifactUpdate { - this := BaseArtifactUpdate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state - return &this -} - -// GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. -func (o *BaseArtifactUpdate) GetCustomProperties() map[string]MetadataValue { - if o == nil || IsNil(o.CustomProperties) { - var ret map[string]MetadataValue - return ret - } - return *o.CustomProperties -} - -// GetCustomPropertiesOk returns a tuple with the CustomProperties field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactUpdate) GetCustomPropertiesOk() (*map[string]MetadataValue, bool) { - if o == nil || IsNil(o.CustomProperties) { - return nil, false - } - return o.CustomProperties, true -} - -// HasCustomProperties returns a boolean if a field has been set. -func (o *BaseArtifactUpdate) HasCustomProperties() bool { - if o != nil && !IsNil(o.CustomProperties) { - return true - } - - return false -} - -// SetCustomProperties gets a reference to the given map[string]MetadataValue and assigns it to the CustomProperties field. -func (o *BaseArtifactUpdate) SetCustomProperties(v map[string]MetadataValue) { - o.CustomProperties = &v -} - -// GetDescription returns the Description field value if set, zero value otherwise. -func (o *BaseArtifactUpdate) GetDescription() string { - if o == nil || IsNil(o.Description) { - var ret string - return ret - } - return *o.Description -} - -// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactUpdate) GetDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.Description) { - return nil, false - } - return o.Description, true -} - -// HasDescription returns a boolean if a field has been set. -func (o *BaseArtifactUpdate) HasDescription() bool { - if o != nil && !IsNil(o.Description) { - return true - } - - return false -} - -// SetDescription gets a reference to the given string and assigns it to the Description field. -func (o *BaseArtifactUpdate) SetDescription(v string) { - o.Description = &v -} - -// GetExternalId returns the ExternalId field value if set, zero value otherwise. -func (o *BaseArtifactUpdate) GetExternalId() string { - if o == nil || IsNil(o.ExternalId) { - var ret string - return ret - } - return *o.ExternalId -} - -// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactUpdate) GetExternalIdOk() (*string, bool) { - if o == nil || IsNil(o.ExternalId) { - return nil, false - } - return o.ExternalId, true -} - -// HasExternalId returns a boolean if a field has been set. -func (o *BaseArtifactUpdate) HasExternalId() bool { - if o != nil && !IsNil(o.ExternalId) { - return true - } - - return false -} - -// SetExternalId gets a reference to the given string and assigns it to the ExternalId field. -func (o *BaseArtifactUpdate) SetExternalId(v string) { - o.ExternalId = &v -} - -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *BaseArtifactUpdate) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactUpdate) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *BaseArtifactUpdate) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *BaseArtifactUpdate) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *BaseArtifactUpdate) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseArtifactUpdate) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *BaseArtifactUpdate) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *BaseArtifactUpdate) SetState(v ArtifactState) { - o.State = &v -} - -func (o BaseArtifactUpdate) MarshalJSON() ([]byte, error) { - toSerialize, err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o BaseArtifactUpdate) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.CustomProperties) { - toSerialize["customProperties"] = o.CustomProperties - } - if !IsNil(o.Description) { - toSerialize["description"] = o.Description - } - if !IsNil(o.ExternalId) { - toSerialize["externalId"] = o.ExternalId - } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } - return toSerialize, nil -} - -type NullableBaseArtifactUpdate struct { - value *BaseArtifactUpdate - isSet bool -} - -func (v NullableBaseArtifactUpdate) Get() *BaseArtifactUpdate { - return v.value -} - -func (v *NullableBaseArtifactUpdate) Set(val *BaseArtifactUpdate) { - v.value = val - v.isSet = true -} - -func (v NullableBaseArtifactUpdate) IsSet() bool { - return v.isSet -} - -func (v *NullableBaseArtifactUpdate) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBaseArtifactUpdate(val *BaseArtifactUpdate) *NullableBaseArtifactUpdate { - return &NullableBaseArtifactUpdate{value: val, isSet: true} -} - -func (v NullableBaseArtifactUpdate) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBaseArtifactUpdate) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} diff --git a/pkg/openapi/model_base_execution.go b/pkg/openapi/model_base_execution.go deleted file mode 100644 index b491dbb5a7..0000000000 --- a/pkg/openapi/model_base_execution.go +++ /dev/null @@ -1,387 +0,0 @@ -/* -Model Registry REST API - -REST API for Model Registry to create and manage ML model metadata - -API version: v1alpha3 -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the BaseExecution type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &BaseExecution{} - -// BaseExecution struct for BaseExecution -type BaseExecution struct { - LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` - // User provided custom properties which are not defined by its type. - CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` - // An optional description about the resource. - Description *string `json:"description,omitempty"` - // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. - Name *string `json:"name,omitempty"` - // The unique server generated id of the resource. - Id *string `json:"id,omitempty"` - // Output only. Create time of the resource in millisecond since epoch. - CreateTimeSinceEpoch *string `json:"createTimeSinceEpoch,omitempty"` - // Output only. Last update time of the resource since epoch in millisecond since epoch. - LastUpdateTimeSinceEpoch *string `json:"lastUpdateTimeSinceEpoch,omitempty"` -} - -// NewBaseExecution instantiates a new BaseExecution object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewBaseExecution() *BaseExecution { - this := BaseExecution{} - var lastKnownState ExecutionState = EXECUTIONSTATE_UNKNOWN - this.LastKnownState = &lastKnownState - return &this -} - -// NewBaseExecutionWithDefaults instantiates a new BaseExecution object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewBaseExecutionWithDefaults() *BaseExecution { - this := BaseExecution{} - var lastKnownState ExecutionState = EXECUTIONSTATE_UNKNOWN - this.LastKnownState = &lastKnownState - return &this -} - -// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. -func (o *BaseExecution) GetLastKnownState() ExecutionState { - if o == nil || IsNil(o.LastKnownState) { - var ret ExecutionState - return ret - } - return *o.LastKnownState -} - -// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetLastKnownStateOk() (*ExecutionState, bool) { - if o == nil || IsNil(o.LastKnownState) { - return nil, false - } - return o.LastKnownState, true -} - -// HasLastKnownState returns a boolean if a field has been set. -func (o *BaseExecution) HasLastKnownState() bool { - if o != nil && !IsNil(o.LastKnownState) { - return true - } - - return false -} - -// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. -func (o *BaseExecution) SetLastKnownState(v ExecutionState) { - o.LastKnownState = &v -} - -// GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. -func (o *BaseExecution) GetCustomProperties() map[string]MetadataValue { - if o == nil || IsNil(o.CustomProperties) { - var ret map[string]MetadataValue - return ret - } - return *o.CustomProperties -} - -// GetCustomPropertiesOk returns a tuple with the CustomProperties field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetCustomPropertiesOk() (*map[string]MetadataValue, bool) { - if o == nil || IsNil(o.CustomProperties) { - return nil, false - } - return o.CustomProperties, true -} - -// HasCustomProperties returns a boolean if a field has been set. -func (o *BaseExecution) HasCustomProperties() bool { - if o != nil && !IsNil(o.CustomProperties) { - return true - } - - return false -} - -// SetCustomProperties gets a reference to the given map[string]MetadataValue and assigns it to the CustomProperties field. -func (o *BaseExecution) SetCustomProperties(v map[string]MetadataValue) { - o.CustomProperties = &v -} - -// GetDescription returns the Description field value if set, zero value otherwise. -func (o *BaseExecution) GetDescription() string { - if o == nil || IsNil(o.Description) { - var ret string - return ret - } - return *o.Description -} - -// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.Description) { - return nil, false - } - return o.Description, true -} - -// HasDescription returns a boolean if a field has been set. -func (o *BaseExecution) HasDescription() bool { - if o != nil && !IsNil(o.Description) { - return true - } - - return false -} - -// SetDescription gets a reference to the given string and assigns it to the Description field. -func (o *BaseExecution) SetDescription(v string) { - o.Description = &v -} - -// GetExternalId returns the ExternalId field value if set, zero value otherwise. -func (o *BaseExecution) GetExternalId() string { - if o == nil || IsNil(o.ExternalId) { - var ret string - return ret - } - return *o.ExternalId -} - -// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetExternalIdOk() (*string, bool) { - if o == nil || IsNil(o.ExternalId) { - return nil, false - } - return o.ExternalId, true -} - -// HasExternalId returns a boolean if a field has been set. -func (o *BaseExecution) HasExternalId() bool { - if o != nil && !IsNil(o.ExternalId) { - return true - } - - return false -} - -// SetExternalId gets a reference to the given string and assigns it to the ExternalId field. -func (o *BaseExecution) SetExternalId(v string) { - o.ExternalId = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *BaseExecution) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *BaseExecution) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *BaseExecution) SetName(v string) { - o.Name = &v -} - -// GetId returns the Id field value if set, zero value otherwise. -func (o *BaseExecution) GetId() string { - if o == nil || IsNil(o.Id) { - var ret string - return ret - } - return *o.Id -} - -// GetIdOk returns a tuple with the Id field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetIdOk() (*string, bool) { - if o == nil || IsNil(o.Id) { - return nil, false - } - return o.Id, true -} - -// HasId returns a boolean if a field has been set. -func (o *BaseExecution) HasId() bool { - if o != nil && !IsNil(o.Id) { - return true - } - - return false -} - -// SetId gets a reference to the given string and assigns it to the Id field. -func (o *BaseExecution) SetId(v string) { - o.Id = &v -} - -// GetCreateTimeSinceEpoch returns the CreateTimeSinceEpoch field value if set, zero value otherwise. -func (o *BaseExecution) GetCreateTimeSinceEpoch() string { - if o == nil || IsNil(o.CreateTimeSinceEpoch) { - var ret string - return ret - } - return *o.CreateTimeSinceEpoch -} - -// GetCreateTimeSinceEpochOk returns a tuple with the CreateTimeSinceEpoch field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetCreateTimeSinceEpochOk() (*string, bool) { - if o == nil || IsNil(o.CreateTimeSinceEpoch) { - return nil, false - } - return o.CreateTimeSinceEpoch, true -} - -// HasCreateTimeSinceEpoch returns a boolean if a field has been set. -func (o *BaseExecution) HasCreateTimeSinceEpoch() bool { - if o != nil && !IsNil(o.CreateTimeSinceEpoch) { - return true - } - - return false -} - -// SetCreateTimeSinceEpoch gets a reference to the given string and assigns it to the CreateTimeSinceEpoch field. -func (o *BaseExecution) SetCreateTimeSinceEpoch(v string) { - o.CreateTimeSinceEpoch = &v -} - -// GetLastUpdateTimeSinceEpoch returns the LastUpdateTimeSinceEpoch field value if set, zero value otherwise. -func (o *BaseExecution) GetLastUpdateTimeSinceEpoch() string { - if o == nil || IsNil(o.LastUpdateTimeSinceEpoch) { - var ret string - return ret - } - return *o.LastUpdateTimeSinceEpoch -} - -// GetLastUpdateTimeSinceEpochOk returns a tuple with the LastUpdateTimeSinceEpoch field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecution) GetLastUpdateTimeSinceEpochOk() (*string, bool) { - if o == nil || IsNil(o.LastUpdateTimeSinceEpoch) { - return nil, false - } - return o.LastUpdateTimeSinceEpoch, true -} - -// HasLastUpdateTimeSinceEpoch returns a boolean if a field has been set. -func (o *BaseExecution) HasLastUpdateTimeSinceEpoch() bool { - if o != nil && !IsNil(o.LastUpdateTimeSinceEpoch) { - return true - } - - return false -} - -// SetLastUpdateTimeSinceEpoch gets a reference to the given string and assigns it to the LastUpdateTimeSinceEpoch field. -func (o *BaseExecution) SetLastUpdateTimeSinceEpoch(v string) { - o.LastUpdateTimeSinceEpoch = &v -} - -func (o BaseExecution) MarshalJSON() ([]byte, error) { - toSerialize, err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o BaseExecution) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.LastKnownState) { - toSerialize["lastKnownState"] = o.LastKnownState - } - if !IsNil(o.CustomProperties) { - toSerialize["customProperties"] = o.CustomProperties - } - if !IsNil(o.Description) { - toSerialize["description"] = o.Description - } - if !IsNil(o.ExternalId) { - toSerialize["externalId"] = o.ExternalId - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - if !IsNil(o.Id) { - toSerialize["id"] = o.Id - } - if !IsNil(o.CreateTimeSinceEpoch) { - toSerialize["createTimeSinceEpoch"] = o.CreateTimeSinceEpoch - } - if !IsNil(o.LastUpdateTimeSinceEpoch) { - toSerialize["lastUpdateTimeSinceEpoch"] = o.LastUpdateTimeSinceEpoch - } - return toSerialize, nil -} - -type NullableBaseExecution struct { - value *BaseExecution - isSet bool -} - -func (v NullableBaseExecution) Get() *BaseExecution { - return v.value -} - -func (v *NullableBaseExecution) Set(val *BaseExecution) { - v.value = val - v.isSet = true -} - -func (v NullableBaseExecution) IsSet() bool { - return v.isSet -} - -func (v *NullableBaseExecution) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBaseExecution(val *BaseExecution) *NullableBaseExecution { - return &NullableBaseExecution{value: val, isSet: true} -} - -func (v NullableBaseExecution) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBaseExecution) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} diff --git a/pkg/openapi/model_base_execution_create.go b/pkg/openapi/model_base_execution_create.go deleted file mode 100644 index e2f8d40593..0000000000 --- a/pkg/openapi/model_base_execution_create.go +++ /dev/null @@ -1,276 +0,0 @@ -/* -Model Registry REST API - -REST API for Model Registry to create and manage ML model metadata - -API version: v1alpha3 -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the BaseExecutionCreate type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &BaseExecutionCreate{} - -// BaseExecutionCreate struct for BaseExecutionCreate -type BaseExecutionCreate struct { - LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` - // User provided custom properties which are not defined by its type. - CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` - // An optional description about the resource. - Description *string `json:"description,omitempty"` - // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. - Name *string `json:"name,omitempty"` -} - -// NewBaseExecutionCreate instantiates a new BaseExecutionCreate object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewBaseExecutionCreate() *BaseExecutionCreate { - this := BaseExecutionCreate{} - var lastKnownState ExecutionState = EXECUTIONSTATE_UNKNOWN - this.LastKnownState = &lastKnownState - return &this -} - -// NewBaseExecutionCreateWithDefaults instantiates a new BaseExecutionCreate object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewBaseExecutionCreateWithDefaults() *BaseExecutionCreate { - this := BaseExecutionCreate{} - var lastKnownState ExecutionState = EXECUTIONSTATE_UNKNOWN - this.LastKnownState = &lastKnownState - return &this -} - -// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. -func (o *BaseExecutionCreate) GetLastKnownState() ExecutionState { - if o == nil || IsNil(o.LastKnownState) { - var ret ExecutionState - return ret - } - return *o.LastKnownState -} - -// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionCreate) GetLastKnownStateOk() (*ExecutionState, bool) { - if o == nil || IsNil(o.LastKnownState) { - return nil, false - } - return o.LastKnownState, true -} - -// HasLastKnownState returns a boolean if a field has been set. -func (o *BaseExecutionCreate) HasLastKnownState() bool { - if o != nil && !IsNil(o.LastKnownState) { - return true - } - - return false -} - -// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. -func (o *BaseExecutionCreate) SetLastKnownState(v ExecutionState) { - o.LastKnownState = &v -} - -// GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. -func (o *BaseExecutionCreate) GetCustomProperties() map[string]MetadataValue { - if o == nil || IsNil(o.CustomProperties) { - var ret map[string]MetadataValue - return ret - } - return *o.CustomProperties -} - -// GetCustomPropertiesOk returns a tuple with the CustomProperties field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionCreate) GetCustomPropertiesOk() (*map[string]MetadataValue, bool) { - if o == nil || IsNil(o.CustomProperties) { - return nil, false - } - return o.CustomProperties, true -} - -// HasCustomProperties returns a boolean if a field has been set. -func (o *BaseExecutionCreate) HasCustomProperties() bool { - if o != nil && !IsNil(o.CustomProperties) { - return true - } - - return false -} - -// SetCustomProperties gets a reference to the given map[string]MetadataValue and assigns it to the CustomProperties field. -func (o *BaseExecutionCreate) SetCustomProperties(v map[string]MetadataValue) { - o.CustomProperties = &v -} - -// GetDescription returns the Description field value if set, zero value otherwise. -func (o *BaseExecutionCreate) GetDescription() string { - if o == nil || IsNil(o.Description) { - var ret string - return ret - } - return *o.Description -} - -// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionCreate) GetDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.Description) { - return nil, false - } - return o.Description, true -} - -// HasDescription returns a boolean if a field has been set. -func (o *BaseExecutionCreate) HasDescription() bool { - if o != nil && !IsNil(o.Description) { - return true - } - - return false -} - -// SetDescription gets a reference to the given string and assigns it to the Description field. -func (o *BaseExecutionCreate) SetDescription(v string) { - o.Description = &v -} - -// GetExternalId returns the ExternalId field value if set, zero value otherwise. -func (o *BaseExecutionCreate) GetExternalId() string { - if o == nil || IsNil(o.ExternalId) { - var ret string - return ret - } - return *o.ExternalId -} - -// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionCreate) GetExternalIdOk() (*string, bool) { - if o == nil || IsNil(o.ExternalId) { - return nil, false - } - return o.ExternalId, true -} - -// HasExternalId returns a boolean if a field has been set. -func (o *BaseExecutionCreate) HasExternalId() bool { - if o != nil && !IsNil(o.ExternalId) { - return true - } - - return false -} - -// SetExternalId gets a reference to the given string and assigns it to the ExternalId field. -func (o *BaseExecutionCreate) SetExternalId(v string) { - o.ExternalId = &v -} - -// GetName returns the Name field value if set, zero value otherwise. -func (o *BaseExecutionCreate) GetName() string { - if o == nil || IsNil(o.Name) { - var ret string - return ret - } - return *o.Name -} - -// GetNameOk returns a tuple with the Name field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionCreate) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { - return nil, false - } - return o.Name, true -} - -// HasName returns a boolean if a field has been set. -func (o *BaseExecutionCreate) HasName() bool { - if o != nil && !IsNil(o.Name) { - return true - } - - return false -} - -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *BaseExecutionCreate) SetName(v string) { - o.Name = &v -} - -func (o BaseExecutionCreate) MarshalJSON() ([]byte, error) { - toSerialize, err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o BaseExecutionCreate) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.LastKnownState) { - toSerialize["lastKnownState"] = o.LastKnownState - } - if !IsNil(o.CustomProperties) { - toSerialize["customProperties"] = o.CustomProperties - } - if !IsNil(o.Description) { - toSerialize["description"] = o.Description - } - if !IsNil(o.ExternalId) { - toSerialize["externalId"] = o.ExternalId - } - if !IsNil(o.Name) { - toSerialize["name"] = o.Name - } - return toSerialize, nil -} - -type NullableBaseExecutionCreate struct { - value *BaseExecutionCreate - isSet bool -} - -func (v NullableBaseExecutionCreate) Get() *BaseExecutionCreate { - return v.value -} - -func (v *NullableBaseExecutionCreate) Set(val *BaseExecutionCreate) { - v.value = val - v.isSet = true -} - -func (v NullableBaseExecutionCreate) IsSet() bool { - return v.isSet -} - -func (v *NullableBaseExecutionCreate) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBaseExecutionCreate(val *BaseExecutionCreate) *NullableBaseExecutionCreate { - return &NullableBaseExecutionCreate{value: val, isSet: true} -} - -func (v NullableBaseExecutionCreate) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBaseExecutionCreate) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} diff --git a/pkg/openapi/model_base_execution_update.go b/pkg/openapi/model_base_execution_update.go deleted file mode 100644 index aab74c8ed3..0000000000 --- a/pkg/openapi/model_base_execution_update.go +++ /dev/null @@ -1,239 +0,0 @@ -/* -Model Registry REST API - -REST API for Model Registry to create and manage ML model metadata - -API version: v1alpha3 -*/ - -// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. - -package openapi - -import ( - "encoding/json" -) - -// checks if the BaseExecutionUpdate type satisfies the MappedNullable interface at compile time -var _ MappedNullable = &BaseExecutionUpdate{} - -// BaseExecutionUpdate struct for BaseExecutionUpdate -type BaseExecutionUpdate struct { - // User provided custom properties which are not defined by its type. - CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` - // An optional description about the resource. - Description *string `json:"description,omitempty"` - // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` -} - -// NewBaseExecutionUpdate instantiates a new BaseExecutionUpdate object -// This constructor will assign default values to properties that have it defined, -// and makes sure properties required by API are set, but the set of arguments -// will change when the set of required properties is changed -func NewBaseExecutionUpdate() *BaseExecutionUpdate { - this := BaseExecutionUpdate{} - var lastKnownState ExecutionState = EXECUTIONSTATE_UNKNOWN - this.LastKnownState = &lastKnownState - return &this -} - -// NewBaseExecutionUpdateWithDefaults instantiates a new BaseExecutionUpdate object -// This constructor will only assign default values to properties that have it defined, -// but it doesn't guarantee that properties required by API are set -func NewBaseExecutionUpdateWithDefaults() *BaseExecutionUpdate { - this := BaseExecutionUpdate{} - var lastKnownState ExecutionState = EXECUTIONSTATE_UNKNOWN - this.LastKnownState = &lastKnownState - return &this -} - -// GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. -func (o *BaseExecutionUpdate) GetCustomProperties() map[string]MetadataValue { - if o == nil || IsNil(o.CustomProperties) { - var ret map[string]MetadataValue - return ret - } - return *o.CustomProperties -} - -// GetCustomPropertiesOk returns a tuple with the CustomProperties field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionUpdate) GetCustomPropertiesOk() (*map[string]MetadataValue, bool) { - if o == nil || IsNil(o.CustomProperties) { - return nil, false - } - return o.CustomProperties, true -} - -// HasCustomProperties returns a boolean if a field has been set. -func (o *BaseExecutionUpdate) HasCustomProperties() bool { - if o != nil && !IsNil(o.CustomProperties) { - return true - } - - return false -} - -// SetCustomProperties gets a reference to the given map[string]MetadataValue and assigns it to the CustomProperties field. -func (o *BaseExecutionUpdate) SetCustomProperties(v map[string]MetadataValue) { - o.CustomProperties = &v -} - -// GetDescription returns the Description field value if set, zero value otherwise. -func (o *BaseExecutionUpdate) GetDescription() string { - if o == nil || IsNil(o.Description) { - var ret string - return ret - } - return *o.Description -} - -// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionUpdate) GetDescriptionOk() (*string, bool) { - if o == nil || IsNil(o.Description) { - return nil, false - } - return o.Description, true -} - -// HasDescription returns a boolean if a field has been set. -func (o *BaseExecutionUpdate) HasDescription() bool { - if o != nil && !IsNil(o.Description) { - return true - } - - return false -} - -// SetDescription gets a reference to the given string and assigns it to the Description field. -func (o *BaseExecutionUpdate) SetDescription(v string) { - o.Description = &v -} - -// GetExternalId returns the ExternalId field value if set, zero value otherwise. -func (o *BaseExecutionUpdate) GetExternalId() string { - if o == nil || IsNil(o.ExternalId) { - var ret string - return ret - } - return *o.ExternalId -} - -// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionUpdate) GetExternalIdOk() (*string, bool) { - if o == nil || IsNil(o.ExternalId) { - return nil, false - } - return o.ExternalId, true -} - -// HasExternalId returns a boolean if a field has been set. -func (o *BaseExecutionUpdate) HasExternalId() bool { - if o != nil && !IsNil(o.ExternalId) { - return true - } - - return false -} - -// SetExternalId gets a reference to the given string and assigns it to the ExternalId field. -func (o *BaseExecutionUpdate) SetExternalId(v string) { - o.ExternalId = &v -} - -// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. -func (o *BaseExecutionUpdate) GetLastKnownState() ExecutionState { - if o == nil || IsNil(o.LastKnownState) { - var ret ExecutionState - return ret - } - return *o.LastKnownState -} - -// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *BaseExecutionUpdate) GetLastKnownStateOk() (*ExecutionState, bool) { - if o == nil || IsNil(o.LastKnownState) { - return nil, false - } - return o.LastKnownState, true -} - -// HasLastKnownState returns a boolean if a field has been set. -func (o *BaseExecutionUpdate) HasLastKnownState() bool { - if o != nil && !IsNil(o.LastKnownState) { - return true - } - - return false -} - -// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. -func (o *BaseExecutionUpdate) SetLastKnownState(v ExecutionState) { - o.LastKnownState = &v -} - -func (o BaseExecutionUpdate) MarshalJSON() ([]byte, error) { - toSerialize, err := o.ToMap() - if err != nil { - return []byte{}, err - } - return json.Marshal(toSerialize) -} - -func (o BaseExecutionUpdate) ToMap() (map[string]interface{}, error) { - toSerialize := map[string]interface{}{} - if !IsNil(o.CustomProperties) { - toSerialize["customProperties"] = o.CustomProperties - } - if !IsNil(o.Description) { - toSerialize["description"] = o.Description - } - if !IsNil(o.ExternalId) { - toSerialize["externalId"] = o.ExternalId - } - if !IsNil(o.LastKnownState) { - toSerialize["lastKnownState"] = o.LastKnownState - } - return toSerialize, nil -} - -type NullableBaseExecutionUpdate struct { - value *BaseExecutionUpdate - isSet bool -} - -func (v NullableBaseExecutionUpdate) Get() *BaseExecutionUpdate { - return v.value -} - -func (v *NullableBaseExecutionUpdate) Set(val *BaseExecutionUpdate) { - v.value = val - v.isSet = true -} - -func (v NullableBaseExecutionUpdate) IsSet() bool { - return v.isSet -} - -func (v *NullableBaseExecutionUpdate) Unset() { - v.value = nil - v.isSet = false -} - -func NewNullableBaseExecutionUpdate(val *BaseExecutionUpdate) *NullableBaseExecutionUpdate { - return &NullableBaseExecutionUpdate{value: val, isSet: true} -} - -func (v NullableBaseExecutionUpdate) MarshalJSON() ([]byte, error) { - return json.Marshal(v.value) -} - -func (v *NullableBaseExecutionUpdate) UnmarshalJSON(src []byte) error { - v.isSet = true - return json.Unmarshal(src, &v.value) -} diff --git a/pkg/openapi/model_doc_artifact.go b/pkg/openapi/model_doc_artifact.go index cd8b058bde..4ef81fc108 100644 --- a/pkg/openapi/model_doc_artifact.go +++ b/pkg/openapi/model_doc_artifact.go @@ -25,9 +25,6 @@ type DocArtifact struct { Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. Name *string `json:"name,omitempty"` // The unique server generated id of the resource. @@ -37,6 +34,9 @@ type DocArtifact struct { // Output only. Last update time of the resource since epoch in millisecond since epoch. LastUpdateTimeSinceEpoch *string `json:"lastUpdateTimeSinceEpoch,omitempty"` ArtifactType *string `json:"artifactType,omitempty"` + // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. + Uri *string `json:"uri,omitempty"` + State *ArtifactState `json:"state,omitempty"` } // NewDocArtifact instantiates a new DocArtifact object @@ -45,10 +45,10 @@ type DocArtifact struct { // will change when the set of required properties is changed func NewDocArtifact() *DocArtifact { this := DocArtifact{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "doc-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -57,10 +57,10 @@ func NewDocArtifact() *DocArtifact { // but it doesn't guarantee that properties required by API are set func NewDocArtifactWithDefaults() *DocArtifact { this := DocArtifact{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "doc-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -160,70 +160,6 @@ func (o *DocArtifact) SetExternalId(v string) { o.ExternalId = &v } -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *DocArtifact) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *DocArtifact) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *DocArtifact) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *DocArtifact) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *DocArtifact) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *DocArtifact) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *DocArtifact) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *DocArtifact) SetState(v ArtifactState) { - o.State = &v -} - // GetName returns the Name field value if set, zero value otherwise. func (o *DocArtifact) GetName() string { if o == nil || IsNil(o.Name) { @@ -384,6 +320,70 @@ func (o *DocArtifact) SetArtifactType(v string) { o.ArtifactType = &v } +// GetUri returns the Uri field value if set, zero value otherwise. +func (o *DocArtifact) GetUri() string { + if o == nil || IsNil(o.Uri) { + var ret string + return ret + } + return *o.Uri +} + +// GetUriOk returns a tuple with the Uri field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *DocArtifact) GetUriOk() (*string, bool) { + if o == nil || IsNil(o.Uri) { + return nil, false + } + return o.Uri, true +} + +// HasUri returns a boolean if a field has been set. +func (o *DocArtifact) HasUri() bool { + if o != nil && !IsNil(o.Uri) { + return true + } + + return false +} + +// SetUri gets a reference to the given string and assigns it to the Uri field. +func (o *DocArtifact) SetUri(v string) { + o.Uri = &v +} + +// GetState returns the State field value if set, zero value otherwise. +func (o *DocArtifact) GetState() ArtifactState { + if o == nil || IsNil(o.State) { + var ret ArtifactState + return ret + } + return *o.State +} + +// GetStateOk returns a tuple with the State field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *DocArtifact) GetStateOk() (*ArtifactState, bool) { + if o == nil || IsNil(o.State) { + return nil, false + } + return o.State, true +} + +// HasState returns a boolean if a field has been set. +func (o *DocArtifact) HasState() bool { + if o != nil && !IsNil(o.State) { + return true + } + + return false +} + +// SetState gets a reference to the given ArtifactState and assigns it to the State field. +func (o *DocArtifact) SetState(v ArtifactState) { + o.State = &v +} + func (o DocArtifact) MarshalJSON() ([]byte, error) { toSerialize, err := o.ToMap() if err != nil { @@ -403,12 +403,6 @@ func (o DocArtifact) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } if !IsNil(o.Name) { toSerialize["name"] = o.Name } @@ -424,6 +418,12 @@ func (o DocArtifact) ToMap() (map[string]interface{}, error) { if !IsNil(o.ArtifactType) { toSerialize["artifactType"] = o.ArtifactType } + if !IsNil(o.Uri) { + toSerialize["uri"] = o.Uri + } + if !IsNil(o.State) { + toSerialize["state"] = o.State + } return toSerialize, nil } diff --git a/pkg/openapi/model_doc_artifact_create.go b/pkg/openapi/model_doc_artifact_create.go index b8e4761d49..920b680a3c 100644 --- a/pkg/openapi/model_doc_artifact_create.go +++ b/pkg/openapi/model_doc_artifact_create.go @@ -25,12 +25,12 @@ type DocArtifactCreate struct { Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. Name *string `json:"name,omitempty"` ArtifactType *string `json:"artifactType,omitempty"` + // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. + Uri *string `json:"uri,omitempty"` + State *ArtifactState `json:"state,omitempty"` } // NewDocArtifactCreate instantiates a new DocArtifactCreate object @@ -39,10 +39,10 @@ type DocArtifactCreate struct { // will change when the set of required properties is changed func NewDocArtifactCreate() *DocArtifactCreate { this := DocArtifactCreate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "doc-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -51,10 +51,10 @@ func NewDocArtifactCreate() *DocArtifactCreate { // but it doesn't guarantee that properties required by API are set func NewDocArtifactCreateWithDefaults() *DocArtifactCreate { this := DocArtifactCreate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "doc-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -154,132 +154,132 @@ func (o *DocArtifactCreate) SetExternalId(v string) { o.ExternalId = &v } -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *DocArtifactCreate) GetUri() string { - if o == nil || IsNil(o.Uri) { +// GetName returns the Name field value if set, zero value otherwise. +func (o *DocArtifactCreate) GetName() string { + if o == nil || IsNil(o.Name) { var ret string return ret } - return *o.Uri + return *o.Name } -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise +// GetNameOk returns a tuple with the Name field value if set, nil otherwise // and a boolean to check if the value has been set. -func (o *DocArtifactCreate) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { +func (o *DocArtifactCreate) GetNameOk() (*string, bool) { + if o == nil || IsNil(o.Name) { return nil, false } - return o.Uri, true + return o.Name, true } -// HasUri returns a boolean if a field has been set. -func (o *DocArtifactCreate) HasUri() bool { - if o != nil && !IsNil(o.Uri) { +// HasName returns a boolean if a field has been set. +func (o *DocArtifactCreate) HasName() bool { + if o != nil && !IsNil(o.Name) { return true } return false } -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *DocArtifactCreate) SetUri(v string) { - o.Uri = &v +// SetName gets a reference to the given string and assigns it to the Name field. +func (o *DocArtifactCreate) SetName(v string) { + o.Name = &v } -// GetState returns the State field value if set, zero value otherwise. -func (o *DocArtifactCreate) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState +// GetArtifactType returns the ArtifactType field value if set, zero value otherwise. +func (o *DocArtifactCreate) GetArtifactType() string { + if o == nil || IsNil(o.ArtifactType) { + var ret string return ret } - return *o.State + return *o.ArtifactType } -// GetStateOk returns a tuple with the State field value if set, nil otherwise +// GetArtifactTypeOk returns a tuple with the ArtifactType field value if set, nil otherwise // and a boolean to check if the value has been set. -func (o *DocArtifactCreate) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { +func (o *DocArtifactCreate) GetArtifactTypeOk() (*string, bool) { + if o == nil || IsNil(o.ArtifactType) { return nil, false } - return o.State, true + return o.ArtifactType, true } -// HasState returns a boolean if a field has been set. -func (o *DocArtifactCreate) HasState() bool { - if o != nil && !IsNil(o.State) { +// HasArtifactType returns a boolean if a field has been set. +func (o *DocArtifactCreate) HasArtifactType() bool { + if o != nil && !IsNil(o.ArtifactType) { return true } return false } -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *DocArtifactCreate) SetState(v ArtifactState) { - o.State = &v +// SetArtifactType gets a reference to the given string and assigns it to the ArtifactType field. +func (o *DocArtifactCreate) SetArtifactType(v string) { + o.ArtifactType = &v } -// GetName returns the Name field value if set, zero value otherwise. -func (o *DocArtifactCreate) GetName() string { - if o == nil || IsNil(o.Name) { +// GetUri returns the Uri field value if set, zero value otherwise. +func (o *DocArtifactCreate) GetUri() string { + if o == nil || IsNil(o.Uri) { var ret string return ret } - return *o.Name + return *o.Uri } -// GetNameOk returns a tuple with the Name field value if set, nil otherwise +// GetUriOk returns a tuple with the Uri field value if set, nil otherwise // and a boolean to check if the value has been set. -func (o *DocArtifactCreate) GetNameOk() (*string, bool) { - if o == nil || IsNil(o.Name) { +func (o *DocArtifactCreate) GetUriOk() (*string, bool) { + if o == nil || IsNil(o.Uri) { return nil, false } - return o.Name, true + return o.Uri, true } -// HasName returns a boolean if a field has been set. -func (o *DocArtifactCreate) HasName() bool { - if o != nil && !IsNil(o.Name) { +// HasUri returns a boolean if a field has been set. +func (o *DocArtifactCreate) HasUri() bool { + if o != nil && !IsNil(o.Uri) { return true } return false } -// SetName gets a reference to the given string and assigns it to the Name field. -func (o *DocArtifactCreate) SetName(v string) { - o.Name = &v +// SetUri gets a reference to the given string and assigns it to the Uri field. +func (o *DocArtifactCreate) SetUri(v string) { + o.Uri = &v } -// GetArtifactType returns the ArtifactType field value if set, zero value otherwise. -func (o *DocArtifactCreate) GetArtifactType() string { - if o == nil || IsNil(o.ArtifactType) { - var ret string +// GetState returns the State field value if set, zero value otherwise. +func (o *DocArtifactCreate) GetState() ArtifactState { + if o == nil || IsNil(o.State) { + var ret ArtifactState return ret } - return *o.ArtifactType + return *o.State } -// GetArtifactTypeOk returns a tuple with the ArtifactType field value if set, nil otherwise +// GetStateOk returns a tuple with the State field value if set, nil otherwise // and a boolean to check if the value has been set. -func (o *DocArtifactCreate) GetArtifactTypeOk() (*string, bool) { - if o == nil || IsNil(o.ArtifactType) { +func (o *DocArtifactCreate) GetStateOk() (*ArtifactState, bool) { + if o == nil || IsNil(o.State) { return nil, false } - return o.ArtifactType, true + return o.State, true } -// HasArtifactType returns a boolean if a field has been set. -func (o *DocArtifactCreate) HasArtifactType() bool { - if o != nil && !IsNil(o.ArtifactType) { +// HasState returns a boolean if a field has been set. +func (o *DocArtifactCreate) HasState() bool { + if o != nil && !IsNil(o.State) { return true } return false } -// SetArtifactType gets a reference to the given string and assigns it to the ArtifactType field. -func (o *DocArtifactCreate) SetArtifactType(v string) { - o.ArtifactType = &v +// SetState gets a reference to the given ArtifactState and assigns it to the State field. +func (o *DocArtifactCreate) SetState(v ArtifactState) { + o.State = &v } func (o DocArtifactCreate) MarshalJSON() ([]byte, error) { @@ -301,18 +301,18 @@ func (o DocArtifactCreate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } if !IsNil(o.Name) { toSerialize["name"] = o.Name } if !IsNil(o.ArtifactType) { toSerialize["artifactType"] = o.ArtifactType } + if !IsNil(o.Uri) { + toSerialize["uri"] = o.Uri + } + if !IsNil(o.State) { + toSerialize["state"] = o.State + } return toSerialize, nil } diff --git a/pkg/openapi/model_doc_artifact_update.go b/pkg/openapi/model_doc_artifact_update.go index 697e036bc9..2f4197a7a5 100644 --- a/pkg/openapi/model_doc_artifact_update.go +++ b/pkg/openapi/model_doc_artifact_update.go @@ -24,11 +24,11 @@ type DocArtifactUpdate struct { // An optional description about the resource. Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` + ExternalId *string `json:"externalId,omitempty"` + ArtifactType *string `json:"artifactType,omitempty"` // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` - ArtifactType *string `json:"artifactType,omitempty"` + Uri *string `json:"uri,omitempty"` + State *ArtifactState `json:"state,omitempty"` } // NewDocArtifactUpdate instantiates a new DocArtifactUpdate object @@ -37,10 +37,10 @@ type DocArtifactUpdate struct { // will change when the set of required properties is changed func NewDocArtifactUpdate() *DocArtifactUpdate { this := DocArtifactUpdate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "doc-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -49,10 +49,10 @@ func NewDocArtifactUpdate() *DocArtifactUpdate { // but it doesn't guarantee that properties required by API are set func NewDocArtifactUpdateWithDefaults() *DocArtifactUpdate { this := DocArtifactUpdate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "doc-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -152,6 +152,38 @@ func (o *DocArtifactUpdate) SetExternalId(v string) { o.ExternalId = &v } +// GetArtifactType returns the ArtifactType field value if set, zero value otherwise. +func (o *DocArtifactUpdate) GetArtifactType() string { + if o == nil || IsNil(o.ArtifactType) { + var ret string + return ret + } + return *o.ArtifactType +} + +// GetArtifactTypeOk returns a tuple with the ArtifactType field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *DocArtifactUpdate) GetArtifactTypeOk() (*string, bool) { + if o == nil || IsNil(o.ArtifactType) { + return nil, false + } + return o.ArtifactType, true +} + +// HasArtifactType returns a boolean if a field has been set. +func (o *DocArtifactUpdate) HasArtifactType() bool { + if o != nil && !IsNil(o.ArtifactType) { + return true + } + + return false +} + +// SetArtifactType gets a reference to the given string and assigns it to the ArtifactType field. +func (o *DocArtifactUpdate) SetArtifactType(v string) { + o.ArtifactType = &v +} + // GetUri returns the Uri field value if set, zero value otherwise. func (o *DocArtifactUpdate) GetUri() string { if o == nil || IsNil(o.Uri) { @@ -216,38 +248,6 @@ func (o *DocArtifactUpdate) SetState(v ArtifactState) { o.State = &v } -// GetArtifactType returns the ArtifactType field value if set, zero value otherwise. -func (o *DocArtifactUpdate) GetArtifactType() string { - if o == nil || IsNil(o.ArtifactType) { - var ret string - return ret - } - return *o.ArtifactType -} - -// GetArtifactTypeOk returns a tuple with the ArtifactType field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *DocArtifactUpdate) GetArtifactTypeOk() (*string, bool) { - if o == nil || IsNil(o.ArtifactType) { - return nil, false - } - return o.ArtifactType, true -} - -// HasArtifactType returns a boolean if a field has been set. -func (o *DocArtifactUpdate) HasArtifactType() bool { - if o != nil && !IsNil(o.ArtifactType) { - return true - } - - return false -} - -// SetArtifactType gets a reference to the given string and assigns it to the ArtifactType field. -func (o *DocArtifactUpdate) SetArtifactType(v string) { - o.ArtifactType = &v -} - func (o DocArtifactUpdate) MarshalJSON() ([]byte, error) { toSerialize, err := o.ToMap() if err != nil { @@ -267,15 +267,15 @@ func (o DocArtifactUpdate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } + if !IsNil(o.ArtifactType) { + toSerialize["artifactType"] = o.ArtifactType + } if !IsNil(o.Uri) { toSerialize["uri"] = o.Uri } if !IsNil(o.State) { toSerialize["state"] = o.State } - if !IsNil(o.ArtifactType) { - toSerialize["artifactType"] = o.ArtifactType - } return toSerialize, nil } diff --git a/pkg/openapi/model_model_artifact.go b/pkg/openapi/model_model_artifact.go index 614c0c7cb6..7c5b9178f0 100644 --- a/pkg/openapi/model_model_artifact.go +++ b/pkg/openapi/model_model_artifact.go @@ -25,9 +25,6 @@ type ModelArtifact struct { Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. Name *string `json:"name,omitempty"` // The unique server generated id of the resource. @@ -57,6 +54,9 @@ type ModelArtifact struct { ModelSourceId *string `json:"modelSourceId,omitempty"` // A human-readable name for the source model. E.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`. ModelSourceName *string `json:"modelSourceName,omitempty"` + // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. + Uri *string `json:"uri,omitempty"` + State *ArtifactState `json:"state,omitempty"` } // NewModelArtifact instantiates a new ModelArtifact object @@ -65,10 +65,10 @@ type ModelArtifact struct { // will change when the set of required properties is changed func NewModelArtifact() *ModelArtifact { this := ModelArtifact{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "model-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -77,10 +77,10 @@ func NewModelArtifact() *ModelArtifact { // but it doesn't guarantee that properties required by API are set func NewModelArtifactWithDefaults() *ModelArtifact { this := ModelArtifact{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "model-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -180,70 +180,6 @@ func (o *ModelArtifact) SetExternalId(v string) { o.ExternalId = &v } -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *ModelArtifact) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ModelArtifact) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *ModelArtifact) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *ModelArtifact) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *ModelArtifact) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ModelArtifact) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *ModelArtifact) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *ModelArtifact) SetState(v ArtifactState) { - o.State = &v -} - // GetName returns the Name field value if set, zero value otherwise. func (o *ModelArtifact) GetName() string { if o == nil || IsNil(o.Name) { @@ -724,6 +660,70 @@ func (o *ModelArtifact) SetModelSourceName(v string) { o.ModelSourceName = &v } +// GetUri returns the Uri field value if set, zero value otherwise. +func (o *ModelArtifact) GetUri() string { + if o == nil || IsNil(o.Uri) { + var ret string + return ret + } + return *o.Uri +} + +// GetUriOk returns a tuple with the Uri field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ModelArtifact) GetUriOk() (*string, bool) { + if o == nil || IsNil(o.Uri) { + return nil, false + } + return o.Uri, true +} + +// HasUri returns a boolean if a field has been set. +func (o *ModelArtifact) HasUri() bool { + if o != nil && !IsNil(o.Uri) { + return true + } + + return false +} + +// SetUri gets a reference to the given string and assigns it to the Uri field. +func (o *ModelArtifact) SetUri(v string) { + o.Uri = &v +} + +// GetState returns the State field value if set, zero value otherwise. +func (o *ModelArtifact) GetState() ArtifactState { + if o == nil || IsNil(o.State) { + var ret ArtifactState + return ret + } + return *o.State +} + +// GetStateOk returns a tuple with the State field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ModelArtifact) GetStateOk() (*ArtifactState, bool) { + if o == nil || IsNil(o.State) { + return nil, false + } + return o.State, true +} + +// HasState returns a boolean if a field has been set. +func (o *ModelArtifact) HasState() bool { + if o != nil && !IsNil(o.State) { + return true + } + + return false +} + +// SetState gets a reference to the given ArtifactState and assigns it to the State field. +func (o *ModelArtifact) SetState(v ArtifactState) { + o.State = &v +} + func (o ModelArtifact) MarshalJSON() ([]byte, error) { toSerialize, err := o.ToMap() if err != nil { @@ -743,12 +743,6 @@ func (o ModelArtifact) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } if !IsNil(o.Name) { toSerialize["name"] = o.Name } @@ -794,6 +788,12 @@ func (o ModelArtifact) ToMap() (map[string]interface{}, error) { if !IsNil(o.ModelSourceName) { toSerialize["modelSourceName"] = o.ModelSourceName } + if !IsNil(o.Uri) { + toSerialize["uri"] = o.Uri + } + if !IsNil(o.State) { + toSerialize["state"] = o.State + } return toSerialize, nil } diff --git a/pkg/openapi/model_model_artifact_create.go b/pkg/openapi/model_model_artifact_create.go index 821786fd3f..28c081fb30 100644 --- a/pkg/openapi/model_model_artifact_create.go +++ b/pkg/openapi/model_model_artifact_create.go @@ -26,9 +26,6 @@ type ModelArtifactCreate struct { Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. Name *string `json:"name,omitempty"` // Name of the model format. @@ -51,6 +48,9 @@ type ModelArtifactCreate struct { ModelSourceId *string `json:"modelSourceId,omitempty"` // A human-readable name for the source model. E.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`. ModelSourceName *string `json:"modelSourceName,omitempty"` + // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. + Uri *string `json:"uri,omitempty"` + State *ArtifactState `json:"state,omitempty"` } // NewModelArtifactCreate instantiates a new ModelArtifactCreate object @@ -59,10 +59,10 @@ type ModelArtifactCreate struct { // will change when the set of required properties is changed func NewModelArtifactCreate() *ModelArtifactCreate { this := ModelArtifactCreate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "model-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -206,70 +206,6 @@ func (o *ModelArtifactCreate) SetExternalId(v string) { o.ExternalId = &v } -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *ModelArtifactCreate) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ModelArtifactCreate) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *ModelArtifactCreate) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *ModelArtifactCreate) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *ModelArtifactCreate) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ModelArtifactCreate) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *ModelArtifactCreate) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *ModelArtifactCreate) SetState(v ArtifactState) { - o.State = &v -} - // GetName returns the Name field value if set, zero value otherwise. func (o *ModelArtifactCreate) GetName() string { if o == nil || IsNil(o.Name) { @@ -622,6 +558,70 @@ func (o *ModelArtifactCreate) SetModelSourceName(v string) { o.ModelSourceName = &v } +// GetUri returns the Uri field value if set, zero value otherwise. +func (o *ModelArtifactCreate) GetUri() string { + if o == nil || IsNil(o.Uri) { + var ret string + return ret + } + return *o.Uri +} + +// GetUriOk returns a tuple with the Uri field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ModelArtifactCreate) GetUriOk() (*string, bool) { + if o == nil || IsNil(o.Uri) { + return nil, false + } + return o.Uri, true +} + +// HasUri returns a boolean if a field has been set. +func (o *ModelArtifactCreate) HasUri() bool { + if o != nil && !IsNil(o.Uri) { + return true + } + + return false +} + +// SetUri gets a reference to the given string and assigns it to the Uri field. +func (o *ModelArtifactCreate) SetUri(v string) { + o.Uri = &v +} + +// GetState returns the State field value if set, zero value otherwise. +func (o *ModelArtifactCreate) GetState() ArtifactState { + if o == nil || IsNil(o.State) { + var ret ArtifactState + return ret + } + return *o.State +} + +// GetStateOk returns a tuple with the State field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ModelArtifactCreate) GetStateOk() (*ArtifactState, bool) { + if o == nil || IsNil(o.State) { + return nil, false + } + return o.State, true +} + +// HasState returns a boolean if a field has been set. +func (o *ModelArtifactCreate) HasState() bool { + if o != nil && !IsNil(o.State) { + return true + } + + return false +} + +// SetState gets a reference to the given ArtifactState and assigns it to the State field. +func (o *ModelArtifactCreate) SetState(v ArtifactState) { + o.State = &v +} + func (o ModelArtifactCreate) MarshalJSON() ([]byte, error) { toSerialize, err := o.ToMap() if err != nil { @@ -644,12 +644,6 @@ func (o ModelArtifactCreate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } if !IsNil(o.Name) { toSerialize["name"] = o.Name } @@ -683,6 +677,12 @@ func (o ModelArtifactCreate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ModelSourceName) { toSerialize["modelSourceName"] = o.ModelSourceName } + if !IsNil(o.Uri) { + toSerialize["uri"] = o.Uri + } + if !IsNil(o.State) { + toSerialize["state"] = o.State + } return toSerialize, nil } diff --git a/pkg/openapi/model_model_artifact_update.go b/pkg/openapi/model_model_artifact_update.go index 1a9e151077..09f92415cc 100644 --- a/pkg/openapi/model_model_artifact_update.go +++ b/pkg/openapi/model_model_artifact_update.go @@ -24,11 +24,8 @@ type ModelArtifactUpdate struct { // An optional description about the resource. Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` - // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. - Uri *string `json:"uri,omitempty"` - State *ArtifactState `json:"state,omitempty"` - ArtifactType *string `json:"artifactType,omitempty"` + ExternalId *string `json:"externalId,omitempty"` + ArtifactType *string `json:"artifactType,omitempty"` // Name of the model format. ModelFormatName *string `json:"modelFormatName,omitempty"` // Storage secret name. @@ -49,6 +46,9 @@ type ModelArtifactUpdate struct { ModelSourceId *string `json:"modelSourceId,omitempty"` // A human-readable name for the source model. E.g. `my-project/1`, `ibm-granite/granite-3.1-8b-base:2.1.2`. ModelSourceName *string `json:"modelSourceName,omitempty"` + // The uniform resource identifier of the physical artifact. May be empty if there is no physical artifact. + Uri *string `json:"uri,omitempty"` + State *ArtifactState `json:"state,omitempty"` } // NewModelArtifactUpdate instantiates a new ModelArtifactUpdate object @@ -57,10 +57,10 @@ type ModelArtifactUpdate struct { // will change when the set of required properties is changed func NewModelArtifactUpdate() *ModelArtifactUpdate { this := ModelArtifactUpdate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "model-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -69,10 +69,10 @@ func NewModelArtifactUpdate() *ModelArtifactUpdate { // but it doesn't guarantee that properties required by API are set func NewModelArtifactUpdateWithDefaults() *ModelArtifactUpdate { this := ModelArtifactUpdate{} - var state ArtifactState = ARTIFACTSTATE_UNKNOWN - this.State = &state var artifactType string = "model-artifact" this.ArtifactType = &artifactType + var state ArtifactState = ARTIFACTSTATE_UNKNOWN + this.State = &state return &this } @@ -172,70 +172,6 @@ func (o *ModelArtifactUpdate) SetExternalId(v string) { o.ExternalId = &v } -// GetUri returns the Uri field value if set, zero value otherwise. -func (o *ModelArtifactUpdate) GetUri() string { - if o == nil || IsNil(o.Uri) { - var ret string - return ret - } - return *o.Uri -} - -// GetUriOk returns a tuple with the Uri field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ModelArtifactUpdate) GetUriOk() (*string, bool) { - if o == nil || IsNil(o.Uri) { - return nil, false - } - return o.Uri, true -} - -// HasUri returns a boolean if a field has been set. -func (o *ModelArtifactUpdate) HasUri() bool { - if o != nil && !IsNil(o.Uri) { - return true - } - - return false -} - -// SetUri gets a reference to the given string and assigns it to the Uri field. -func (o *ModelArtifactUpdate) SetUri(v string) { - o.Uri = &v -} - -// GetState returns the State field value if set, zero value otherwise. -func (o *ModelArtifactUpdate) GetState() ArtifactState { - if o == nil || IsNil(o.State) { - var ret ArtifactState - return ret - } - return *o.State -} - -// GetStateOk returns a tuple with the State field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ModelArtifactUpdate) GetStateOk() (*ArtifactState, bool) { - if o == nil || IsNil(o.State) { - return nil, false - } - return o.State, true -} - -// HasState returns a boolean if a field has been set. -func (o *ModelArtifactUpdate) HasState() bool { - if o != nil && !IsNil(o.State) { - return true - } - - return false -} - -// SetState gets a reference to the given ArtifactState and assigns it to the State field. -func (o *ModelArtifactUpdate) SetState(v ArtifactState) { - o.State = &v -} - // GetArtifactType returns the ArtifactType field value if set, zero value otherwise. func (o *ModelArtifactUpdate) GetArtifactType() string { if o == nil || IsNil(o.ArtifactType) { @@ -588,6 +524,70 @@ func (o *ModelArtifactUpdate) SetModelSourceName(v string) { o.ModelSourceName = &v } +// GetUri returns the Uri field value if set, zero value otherwise. +func (o *ModelArtifactUpdate) GetUri() string { + if o == nil || IsNil(o.Uri) { + var ret string + return ret + } + return *o.Uri +} + +// GetUriOk returns a tuple with the Uri field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ModelArtifactUpdate) GetUriOk() (*string, bool) { + if o == nil || IsNil(o.Uri) { + return nil, false + } + return o.Uri, true +} + +// HasUri returns a boolean if a field has been set. +func (o *ModelArtifactUpdate) HasUri() bool { + if o != nil && !IsNil(o.Uri) { + return true + } + + return false +} + +// SetUri gets a reference to the given string and assigns it to the Uri field. +func (o *ModelArtifactUpdate) SetUri(v string) { + o.Uri = &v +} + +// GetState returns the State field value if set, zero value otherwise. +func (o *ModelArtifactUpdate) GetState() ArtifactState { + if o == nil || IsNil(o.State) { + var ret ArtifactState + return ret + } + return *o.State +} + +// GetStateOk returns a tuple with the State field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ModelArtifactUpdate) GetStateOk() (*ArtifactState, bool) { + if o == nil || IsNil(o.State) { + return nil, false + } + return o.State, true +} + +// HasState returns a boolean if a field has been set. +func (o *ModelArtifactUpdate) HasState() bool { + if o != nil && !IsNil(o.State) { + return true + } + + return false +} + +// SetState gets a reference to the given ArtifactState and assigns it to the State field. +func (o *ModelArtifactUpdate) SetState(v ArtifactState) { + o.State = &v +} + func (o ModelArtifactUpdate) MarshalJSON() ([]byte, error) { toSerialize, err := o.ToMap() if err != nil { @@ -607,12 +607,6 @@ func (o ModelArtifactUpdate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } - if !IsNil(o.Uri) { - toSerialize["uri"] = o.Uri - } - if !IsNil(o.State) { - toSerialize["state"] = o.State - } if !IsNil(o.ArtifactType) { toSerialize["artifactType"] = o.ArtifactType } @@ -646,6 +640,12 @@ func (o ModelArtifactUpdate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ModelSourceName) { toSerialize["modelSourceName"] = o.ModelSourceName } + if !IsNil(o.Uri) { + toSerialize["uri"] = o.Uri + } + if !IsNil(o.State) { + toSerialize["state"] = o.State + } return toSerialize, nil } diff --git a/pkg/openapi/model_serve_model.go b/pkg/openapi/model_serve_model.go index 2a5bed2492..30a3b5bed8 100644 --- a/pkg/openapi/model_serve_model.go +++ b/pkg/openapi/model_serve_model.go @@ -19,7 +19,6 @@ var _ MappedNullable = &ServeModel{} // ServeModel An ML model serving action. type ServeModel struct { - LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` // User provided custom properties which are not defined by its type. CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` // An optional description about the resource. @@ -33,7 +32,8 @@ type ServeModel struct { // Output only. Create time of the resource in millisecond since epoch. CreateTimeSinceEpoch *string `json:"createTimeSinceEpoch,omitempty"` // Output only. Last update time of the resource since epoch in millisecond since epoch. - LastUpdateTimeSinceEpoch *string `json:"lastUpdateTimeSinceEpoch,omitempty"` + LastUpdateTimeSinceEpoch *string `json:"lastUpdateTimeSinceEpoch,omitempty"` + LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` // ID of the `ModelVersion` that was served in `InferenceService`. ModelVersionId string `json:"modelVersionId"` } @@ -60,38 +60,6 @@ func NewServeModelWithDefaults() *ServeModel { return &this } -// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. -func (o *ServeModel) GetLastKnownState() ExecutionState { - if o == nil || IsNil(o.LastKnownState) { - var ret ExecutionState - return ret - } - return *o.LastKnownState -} - -// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ServeModel) GetLastKnownStateOk() (*ExecutionState, bool) { - if o == nil || IsNil(o.LastKnownState) { - return nil, false - } - return o.LastKnownState, true -} - -// HasLastKnownState returns a boolean if a field has been set. -func (o *ServeModel) HasLastKnownState() bool { - if o != nil && !IsNil(o.LastKnownState) { - return true - } - - return false -} - -// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. -func (o *ServeModel) SetLastKnownState(v ExecutionState) { - o.LastKnownState = &v -} - // GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. func (o *ServeModel) GetCustomProperties() map[string]MetadataValue { if o == nil || IsNil(o.CustomProperties) { @@ -316,6 +284,38 @@ func (o *ServeModel) SetLastUpdateTimeSinceEpoch(v string) { o.LastUpdateTimeSinceEpoch = &v } +// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. +func (o *ServeModel) GetLastKnownState() ExecutionState { + if o == nil || IsNil(o.LastKnownState) { + var ret ExecutionState + return ret + } + return *o.LastKnownState +} + +// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ServeModel) GetLastKnownStateOk() (*ExecutionState, bool) { + if o == nil || IsNil(o.LastKnownState) { + return nil, false + } + return o.LastKnownState, true +} + +// HasLastKnownState returns a boolean if a field has been set. +func (o *ServeModel) HasLastKnownState() bool { + if o != nil && !IsNil(o.LastKnownState) { + return true + } + + return false +} + +// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. +func (o *ServeModel) SetLastKnownState(v ExecutionState) { + o.LastKnownState = &v +} + // GetModelVersionId returns the ModelVersionId field value func (o *ServeModel) GetModelVersionId() string { if o == nil { @@ -350,9 +350,6 @@ func (o ServeModel) MarshalJSON() ([]byte, error) { func (o ServeModel) ToMap() (map[string]interface{}, error) { toSerialize := map[string]interface{}{} - if !IsNil(o.LastKnownState) { - toSerialize["lastKnownState"] = o.LastKnownState - } if !IsNil(o.CustomProperties) { toSerialize["customProperties"] = o.CustomProperties } @@ -374,6 +371,9 @@ func (o ServeModel) ToMap() (map[string]interface{}, error) { if !IsNil(o.LastUpdateTimeSinceEpoch) { toSerialize["lastUpdateTimeSinceEpoch"] = o.LastUpdateTimeSinceEpoch } + if !IsNil(o.LastKnownState) { + toSerialize["lastKnownState"] = o.LastKnownState + } toSerialize["modelVersionId"] = o.ModelVersionId return toSerialize, nil } diff --git a/pkg/openapi/model_serve_model_create.go b/pkg/openapi/model_serve_model_create.go index b4ea488096..00ea932e82 100644 --- a/pkg/openapi/model_serve_model_create.go +++ b/pkg/openapi/model_serve_model_create.go @@ -19,7 +19,6 @@ var _ MappedNullable = &ServeModelCreate{} // ServeModelCreate An ML model serving action. type ServeModelCreate struct { - LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` // User provided custom properties which are not defined by its type. CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` // An optional description about the resource. @@ -27,7 +26,8 @@ type ServeModelCreate struct { // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. ExternalId *string `json:"externalId,omitempty"` // The client provided name of the artifact. This field is optional. If set, it must be unique among all the artifacts of the same artifact type within a database instance and cannot be changed once set. - Name *string `json:"name,omitempty"` + Name *string `json:"name,omitempty"` + LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` // ID of the `ModelVersion` that was served in `InferenceService`. ModelVersionId string `json:"modelVersionId"` } @@ -54,38 +54,6 @@ func NewServeModelCreateWithDefaults() *ServeModelCreate { return &this } -// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. -func (o *ServeModelCreate) GetLastKnownState() ExecutionState { - if o == nil || IsNil(o.LastKnownState) { - var ret ExecutionState - return ret - } - return *o.LastKnownState -} - -// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ServeModelCreate) GetLastKnownStateOk() (*ExecutionState, bool) { - if o == nil || IsNil(o.LastKnownState) { - return nil, false - } - return o.LastKnownState, true -} - -// HasLastKnownState returns a boolean if a field has been set. -func (o *ServeModelCreate) HasLastKnownState() bool { - if o != nil && !IsNil(o.LastKnownState) { - return true - } - - return false -} - -// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. -func (o *ServeModelCreate) SetLastKnownState(v ExecutionState) { - o.LastKnownState = &v -} - // GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. func (o *ServeModelCreate) GetCustomProperties() map[string]MetadataValue { if o == nil || IsNil(o.CustomProperties) { @@ -214,6 +182,38 @@ func (o *ServeModelCreate) SetName(v string) { o.Name = &v } +// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. +func (o *ServeModelCreate) GetLastKnownState() ExecutionState { + if o == nil || IsNil(o.LastKnownState) { + var ret ExecutionState + return ret + } + return *o.LastKnownState +} + +// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ServeModelCreate) GetLastKnownStateOk() (*ExecutionState, bool) { + if o == nil || IsNil(o.LastKnownState) { + return nil, false + } + return o.LastKnownState, true +} + +// HasLastKnownState returns a boolean if a field has been set. +func (o *ServeModelCreate) HasLastKnownState() bool { + if o != nil && !IsNil(o.LastKnownState) { + return true + } + + return false +} + +// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. +func (o *ServeModelCreate) SetLastKnownState(v ExecutionState) { + o.LastKnownState = &v +} + // GetModelVersionId returns the ModelVersionId field value func (o *ServeModelCreate) GetModelVersionId() string { if o == nil { @@ -248,9 +248,6 @@ func (o ServeModelCreate) MarshalJSON() ([]byte, error) { func (o ServeModelCreate) ToMap() (map[string]interface{}, error) { toSerialize := map[string]interface{}{} - if !IsNil(o.LastKnownState) { - toSerialize["lastKnownState"] = o.LastKnownState - } if !IsNil(o.CustomProperties) { toSerialize["customProperties"] = o.CustomProperties } @@ -263,6 +260,9 @@ func (o ServeModelCreate) ToMap() (map[string]interface{}, error) { if !IsNil(o.Name) { toSerialize["name"] = o.Name } + if !IsNil(o.LastKnownState) { + toSerialize["lastKnownState"] = o.LastKnownState + } toSerialize["modelVersionId"] = o.ModelVersionId return toSerialize, nil } diff --git a/pkg/openapi/model_serve_model_update.go b/pkg/openapi/model_serve_model_update.go index f7d826aaaa..5e9a8a305e 100644 --- a/pkg/openapi/model_serve_model_update.go +++ b/pkg/openapi/model_serve_model_update.go @@ -19,13 +19,13 @@ var _ MappedNullable = &ServeModelUpdate{} // ServeModelUpdate An ML model serving action. type ServeModelUpdate struct { - LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` // User provided custom properties which are not defined by its type. CustomProperties *map[string]MetadataValue `json:"customProperties,omitempty"` // An optional description about the resource. Description *string `json:"description,omitempty"` // The external id that come from the clients’ system. This field is optional. If set, it must be unique among all resources within a database instance. - ExternalId *string `json:"externalId,omitempty"` + ExternalId *string `json:"externalId,omitempty"` + LastKnownState *ExecutionState `json:"lastKnownState,omitempty"` } // NewServeModelUpdate instantiates a new ServeModelUpdate object @@ -49,38 +49,6 @@ func NewServeModelUpdateWithDefaults() *ServeModelUpdate { return &this } -// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. -func (o *ServeModelUpdate) GetLastKnownState() ExecutionState { - if o == nil || IsNil(o.LastKnownState) { - var ret ExecutionState - return ret - } - return *o.LastKnownState -} - -// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise -// and a boolean to check if the value has been set. -func (o *ServeModelUpdate) GetLastKnownStateOk() (*ExecutionState, bool) { - if o == nil || IsNil(o.LastKnownState) { - return nil, false - } - return o.LastKnownState, true -} - -// HasLastKnownState returns a boolean if a field has been set. -func (o *ServeModelUpdate) HasLastKnownState() bool { - if o != nil && !IsNil(o.LastKnownState) { - return true - } - - return false -} - -// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. -func (o *ServeModelUpdate) SetLastKnownState(v ExecutionState) { - o.LastKnownState = &v -} - // GetCustomProperties returns the CustomProperties field value if set, zero value otherwise. func (o *ServeModelUpdate) GetCustomProperties() map[string]MetadataValue { if o == nil || IsNil(o.CustomProperties) { @@ -177,6 +145,38 @@ func (o *ServeModelUpdate) SetExternalId(v string) { o.ExternalId = &v } +// GetLastKnownState returns the LastKnownState field value if set, zero value otherwise. +func (o *ServeModelUpdate) GetLastKnownState() ExecutionState { + if o == nil || IsNil(o.LastKnownState) { + var ret ExecutionState + return ret + } + return *o.LastKnownState +} + +// GetLastKnownStateOk returns a tuple with the LastKnownState field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ServeModelUpdate) GetLastKnownStateOk() (*ExecutionState, bool) { + if o == nil || IsNil(o.LastKnownState) { + return nil, false + } + return o.LastKnownState, true +} + +// HasLastKnownState returns a boolean if a field has been set. +func (o *ServeModelUpdate) HasLastKnownState() bool { + if o != nil && !IsNil(o.LastKnownState) { + return true + } + + return false +} + +// SetLastKnownState gets a reference to the given ExecutionState and assigns it to the LastKnownState field. +func (o *ServeModelUpdate) SetLastKnownState(v ExecutionState) { + o.LastKnownState = &v +} + func (o ServeModelUpdate) MarshalJSON() ([]byte, error) { toSerialize, err := o.ToMap() if err != nil { @@ -187,9 +187,6 @@ func (o ServeModelUpdate) MarshalJSON() ([]byte, error) { func (o ServeModelUpdate) ToMap() (map[string]interface{}, error) { toSerialize := map[string]interface{}{} - if !IsNil(o.LastKnownState) { - toSerialize["lastKnownState"] = o.LastKnownState - } if !IsNil(o.CustomProperties) { toSerialize["customProperties"] = o.CustomProperties } @@ -199,6 +196,9 @@ func (o ServeModelUpdate) ToMap() (map[string]interface{}, error) { if !IsNil(o.ExternalId) { toSerialize["externalId"] = o.ExternalId } + if !IsNil(o.LastKnownState) { + toSerialize["lastKnownState"] = o.LastKnownState + } return toSerialize, nil } diff --git a/scripts/deploy_on_kind.sh b/scripts/deploy_on_kind.sh index cdb5a62c03..a8fec3c73e 100755 --- a/scripts/deploy_on_kind.sh +++ b/scripts/deploy_on_kind.sh @@ -35,14 +35,14 @@ else kubectl create namespace "$MR_NAMESPACE" fi -kubectl apply -k manifests/kustomize/overlays/db +kubectl apply -k manifests/kustomize/overlays/db -n "$MR_NAMESPACE" kubectl patch deployment -n "$MR_NAMESPACE" model-registry-deployment \ --patch '{"spec": {"template": {"spec": {"containers": [{"name": "rest-container", "image": "'$IMG'", "imagePullPolicy": "IfNotPresent"}]}}}}' if ! kubectl wait --for=condition=available -n "$MR_NAMESPACE" deployment/model-registry-db --timeout=5m ; then kubectl events -A - kubectl describe deployment/model-registry-db -n kubeflow - kubectl logs deployment/model-registry-db -n kubeflow + kubectl describe deployment/model-registry-db -n "$MR_NAMESPACE" + kubectl logs deployment/model-registry-db -n "$MR_NAMESPACE" exit 1 fi diff --git a/test/robot/UserStory.robot b/test/robot/UserStory.robot index c4dea1c12e..1fdf1a735b 100644 --- a/test/robot/UserStory.robot +++ b/test/robot/UserStory.robot @@ -100,6 +100,7 @@ As a MLOps engineer I would like to store an owner for the RegisteredModel And Should be equal ${r["owner"]} My owner As a MLOps engineer I want to track a Model from an S3 bucket Data Connection + # MIGRATED TO test_register_model_with_s3_data_connection in pytest ${data_connection_name} Set Variable aws-connection-my-data-connection ${s3_bucket} Set Variable my-bucket ${s3_path} Set Variable my-path