This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git
The following commit(s) were added to refs/heads/main by this push:
new 6155bc688 Fix #1888: replace the Go doc generator with a Maven mojo
(#3046)
6155bc688 is described below
commit 6155bc68856411cd6e8507e67171516589ffe051
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Sep 18 09:20:04 2026 +0200
Fix #1888: replace the Go doc generator with a Maven mojo (#3046)
* Fix #1888: replace the Go doc generator with a Maven mojo
First half of @claudio4j's request to move the script directory into the
Maven
plugin, so that changing a Kamelet no longer means running Maven and then a
separate Go toolchain.
The generator turned out to be much smaller than it looks. It writes
exactly one
file, docs/modules/ROOT/nav.adoc, listing an xref per Kamelet between two
generated-file markers; the per-Kamelet pages it once emitted were dropped
in
6b7d9d520. GenerateNavMojo does the same thing: reads the kamelets
directory,
sorts by file path, takes metadata.name from each and writes the same file.
The goal is bound to compile in camel-kamelets-bom, next to the existing
validate goal, so a normal build regenerates the navigation. The two
executions
now carry ids since there is more than one.
Jackson is used for the YAML, without declaring it in the plugin pom,
matching
what ValidateKameletsMojo already does. Pinning a version here would risk
drifting from the one Camel brings in.
Verified by generating with the Go tool, deleting the file, building, and
comparing: byte identical at 9078 bytes and 264 lines, and unchanged again
after
a full mvn clean install from the root, so the build is idempotent.
With the generator gone, main-push-regen.yaml no longer needs Go at all --
both
the setup-go step and the generator step are removed, since the two mvn
install
runs it already performs now produce nav.adoc themselves. README.md and
AGENTS.md
are updated to match.
The validator, the larger half of #1888, stays in Go for now and is
untouched.
Co-Authored-By: Claude Opus 5 <[email protected]>
* Fix #1888: drop the remaining references to the Go generator
Addresses @claudio4j's review.
The Makefile generate target still invoked the deleted code. Removing those
two
lines also fixes the path that followed them: the target used to cd into
script/generator and then reach back with cd ../../crds, so with the
generator
gone it now stays in crds and calls gen_crd_api.sh directly. A note records
that
nav.adoc comes from the Maven build instead.
Two descriptions of the script directory were also stale. AGENTS.md said Go
is
required for the script/ and crds/ generators and described script/ as the
Go
doc generator plus YAML validator; security-model.adoc listed script/ as Go
generator/validator. All three now say validator.
My earlier sweep missed these because it searched for the literal path
script/generator in Markdown and YAML only, which matches none of them: the
Makefile was not in the file types searched, and the two prose mentions
describe
the directory without naming the path.
Co-Authored-By: Claude Opus 5 <[email protected]>
---------
Co-authored-by: Claude Opus 5 <[email protected]>
---
.github/workflows/main-push-regen.yaml | 10 --
AGENTS.md | 13 ++-
Makefile | 5 +-
README.md | 9 +-
docs/modules/ROOT/pages/security-model.adoc | 2 +-
library/camel-kamelets-bom/pom.xml | 10 +-
.../kamelets/maven/plugin/GenerateNavMojo.java | 118 +++++++++++++++++++++
script/generator/README.md | 8 --
script/generator/generator.go | 105 ------------------
script/generator/go.mod | 31 ------
script/generator/go.sum | 96 -----------------
11 files changed, 139 insertions(+), 268 deletions(-)
diff --git a/.github/workflows/main-push-regen.yaml
b/.github/workflows/main-push-regen.yaml
index a6e6a34e7..e555ead87 100644
--- a/.github/workflows/main-push-regen.yaml
+++ b/.github/workflows/main-push-regen.yaml
@@ -47,20 +47,10 @@ jobs:
distribution: 'temurin'
java-version: 17
cache: 'maven'
- - name: Install Go
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e #
v7.0.0
- with:
- go-version: 1.25.x
- name: Build catalog 1st Run
run: ./mvnw clean install -DskipTests
- name: Build catalog 2nd Run
run: ./mvnw clean install
- - name: Run Generator
- run: |
- echo "Running Kamelet Generator..."
-
- cd script/generator
- go run . ../../kamelets/ ../../docs/modules/ROOT/
- name: Create Pull Request
uses:
peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 #
v8.1.1
with:
diff --git a/AGENTS.md b/AGENTS.md
index 62cbe9fe2..8f6ed8af7 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -11,8 +11,8 @@ Camel, Camel K, Camel Quarkus and Camel Spring Boot.
- Version: 4.20.0
- Camel: 4.20.0
- Java: 17+
-- Build: Maven (`mvn verify`); Go is required for the `script/` and `crds/`
- generators
+- Build: Maven (`mvn verify`); Go is required for the `script/` validator and
+ the `crds/` generator
- Issue tracker: GitHub — https://github.com/apache/camel-kamelets/issues
- Related repository: `apache/camel` (Camel core — the Kamelet **runtime**
lives there, not here)
@@ -99,8 +99,8 @@ relevant committers:
- After adding or modifying a Kamelet, **regenerate and commit** the generated
docs and validate, or CI will fail:
```bash
- cd script/generator && go run . ../../kamelets/ ../../docs/modules/ROOT/
- cd ../validator && go run . ../../kamelets/ # must report no ERRORS
+ ./mvnw clean install # also regenerates nav.adoc
+ cd script/validator && go run . ../../kamelets/ # must report no ERRORS
```
- `nav.adoc` and the per-Kamelet doc pages are **generated** — do not hand-edit
them.
@@ -290,7 +290,7 @@ camel-kamelets/
│ ├── camel-kamelets-crds/ # Fabric8-generated K8s CRD POJOs (Java)
│ └── kamelets-maven-plugin/ # build-time validation plugin
├── crds/ # Go CRD client generator (build/CI)
-├── script/ # Go doc generator + YAML validator (build/CI)
+├── script/ # Go YAML validator (build/CI)
├── templates/ # init .vm template + Pipe examples
├── tests/camel-kamelets-itest/ # Citrus integration tests
└── docs/modules/ROOT/ # Antora AsciiDoc (security-model.adoc lives
here)
@@ -301,8 +301,7 @@ camel-kamelets/
```bash
mvn verify # full build (from root)
mvn verify -Pcoverage # with coverage
-cd script/generator && go run . ../../kamelets/ ../../docs/modules/ROOT/ #
regen docs
-cd script/validator && go run . ../../kamelets/ #
validate
+cd script/validator && go run . ../../kamelets/ # validate (nav.adoc is
regenerated by the build)
```
## Kamelet Authoring Conventions
diff --git a/Makefile b/Makefile
index 860641232..e3d55f319 100644
--- a/Makefile
+++ b/Makefile
@@ -20,13 +20,12 @@ compile-crds:
cd crds && \
go build ./...
+# nav.adoc is generated by the Maven build, see the install target
generate:
cd crds && \
./gen_client.sh && \
./generate.sh && \
- cd ../script/generator && \
- go run . ../../kamelets/ ../../docs/modules/ROOT/ && \
- cd ../../crds && ./gen_crd/gen_crd_api.sh
+ ./gen_crd/gen_crd_api.sh
validate:
cd script/validator && \
diff --git a/README.md b/README.md
index 1ab138e2d..829ad4ec9 100644
--- a/README.md
+++ b/README.md
@@ -24,12 +24,9 @@ $ ./mvnw clean install
```
> [!IMPORTANT]
-> After adding or modifying a kamelet remember to generate:
-> ```bash
-> $ cd script/generator
-> $ go run . ../../kamelets/ ../../docs/modules/ROOT/
-> ```
-> and validate:
+> After adding or modifying a kamelet, `./mvnw clean install` regenerates the
+> Antora navigation for you, so there is nothing extra to run for the docs.
+> Still validate:
> ```bash
> $ cd script/validator
> $ go run . ../../kamelets/
diff --git a/docs/modules/ROOT/pages/security-model.adoc
b/docs/modules/ROOT/pages/security-model.adoc
index 540309241..2f7fdb794 100644
--- a/docs/modules/ROOT/pages/security-model.adoc
+++ b/docs/modules/ROOT/pages/security-model.adoc
@@ -163,7 +163,7 @@ first is the security-relevant product.
| Maven BOM (pom only) and the resource bundle that jars family 1.
| Only as the delivery vehicle for family 1
-| `script/` (Go generator/validator), `crds/` Go client generator,
+| `script/` (Go validator), `crds/` Go client generator,
`tests/camel-kamelets-itest` (Citrus), `templates/` (init `.vm` and Pipe
examples)
| CI, documentation generation, test and scaffolding code. Not shipped to a
diff --git a/library/camel-kamelets-bom/pom.xml
b/library/camel-kamelets-bom/pom.xml
index 2541cb1e5..547c3bf76 100644
--- a/library/camel-kamelets-bom/pom.xml
+++ b/library/camel-kamelets-bom/pom.xml
@@ -72,18 +72,26 @@
<build>
<plugins>
- <!-- Validate Kamelets -->
+ <!-- Validate Kamelets and regenerate the Antora nav -->
<plugin>
<groupId>org.apache.camel.kamelets</groupId>
<artifactId>kamelets-maven-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
+ <id>validate-kamelets</id>
<phase>compile</phase>
<goals>
<goal>validate</goal>
</goals>
</execution>
+ <execution>
+ <id>generate-nav</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>generate-nav</goal>
+ </goals>
+ </execution>
</executions>
</plugin>
diff --git
a/library/kamelets-maven-plugin/src/main/java/org/apache/camel/kamelets/maven/plugin/GenerateNavMojo.java
b/library/kamelets-maven-plugin/src/main/java/org/apache/camel/kamelets/maven/plugin/GenerateNavMojo.java
new file mode 100644
index 000000000..bbbdb81c9
--- /dev/null
+++
b/library/kamelets-maven-plugin/src/main/java/org/apache/camel/kamelets/maven/plugin/GenerateNavMojo.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.kamelets.maven.plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+/**
+ * Generates the Antora navigation file listing every Kamelet in the catalog.
+ *
+ * Replaces the Go generator that used to live in script/generator, so that
+ * changing a Kamelet only requires a Maven build.
+ */
+@Mojo(name = "generate-nav", defaultPhase = LifecyclePhase.COMPILE, threadSafe
= true)
+public class GenerateNavMojo extends AbstractMojo {
+
+ private static final String MARKER = "// THIS FILE IS AUTOMATICALLY
GENERATED: DO NOT EDIT";
+ private static final String SUFFIX = ".kamelet.yaml";
+
+ /**
+ * Directory holding the *.kamelet.yaml files.
+ */
+ @Parameter(property = "kamelets.dir", defaultValue =
"${project.basedir}/../../kamelets")
+ private File kameletsDir;
+
+ /**
+ * Antora module root; nav.adoc is written directly into it.
+ */
+ @Parameter(property = "kamelets.docs.dir", defaultValue =
"${project.basedir}/../../docs/modules/ROOT")
+ private File docsDir;
+
+ @Override
+ public void execute() throws MojoExecutionException {
+ List<String> names = listKameletNames();
+
+ StringBuilder content = new StringBuilder();
+ content.append(MARKER).append('\n');
+ for (String name : names) {
+ content.append("*
xref:").append(name).append(".adoc[]").append('\n');
+ }
+ content.append(MARKER).append('\n');
+
+ Path dest = docsDir.toPath().resolve("nav.adoc");
+ try {
+ Files.createDirectories(dest.getParent());
+ Files.writeString(dest, content.toString(),
StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ throw new MojoExecutionException("Cannot write file " + dest, e);
+ }
+ getLog().info(String.format("\"%s\" written (%d kamelets)", dest,
names.size()));
+ }
+
+ /**
+ * Kamelet names, taken from metadata.name and ordered by file path, which
is
+ * the order the generated file has always used.
+ */
+ private List<String> listKameletNames() throws MojoExecutionException {
+ File[] files = kameletsDir.listFiles(f -> f.isFile() &&
f.getName().endsWith(SUFFIX));
+ if (files == null) {
+ throw new MojoExecutionException("Cannot list dir " + kameletsDir);
+ }
+
+ List<File> sorted = new ArrayList<>(List.of(files));
+ sorted.sort(Comparator.comparing(File::getPath));
+
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ List<String> names = new ArrayList<>(sorted.size());
+ for (File file : sorted) {
+ names.add(readName(mapper, file));
+ }
+ return names;
+ }
+
+ @SuppressWarnings("unchecked")
+ private String readName(ObjectMapper mapper, File file) throws
MojoExecutionException {
+ try {
+ Map<String, Object> doc = mapper.readValue(file, Map.class);
+ Map<String, Object> metadata = (Map<String, Object>)
doc.get("metadata");
+ Object name = metadata != null ? metadata.get("name") : null;
+ if (name == null) {
+ throw new MojoExecutionException("No metadata.name in " +
file);
+ }
+ return name.toString();
+ } catch (IOException e) {
+ throw new MojoExecutionException("Cannot read file " + file, e);
+ }
+ }
+}
diff --git a/script/generator/README.md b/script/generator/README.md
deleted file mode 100644
index 61853fdd7..000000000
--- a/script/generator/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Website nav file Generator
-
-To generate the nav file for the website (you need `go`):
-
-```
-# From the script/generator directory
-go run . ../../kamelets/ ../../docs/modules/ROOT/
-```
diff --git a/script/generator/generator.go b/script/generator/generator.go
deleted file mode 100644
index 833a8f813..000000000
--- a/script/generator/generator.go
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "sort"
- "strings"
-
- camelapiv1 "github.com/apache/camel-kamelets/crds/pkg/apis/camel/v1"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/apimachinery/pkg/util/yaml"
-)
-
-func main() {
- if len(os.Args) != 3 {
- println("usage: generator kamelets-path doc-root")
- os.Exit(1)
- }
-
- projectBaseDir := os.Args[1]
- docBaseDir := os.Args[2]
-
- kamelets := listKamelets(projectBaseDir)
-
- links := make([]string, 0)
- for _, k := range kamelets {
- links = updateImageLink(k, links)
- }
-
- saveNav(links, docBaseDir)
-}
-
-func updateImageLink(k camelapiv1.Kamelet, links []string) []string {
- return append(links, fmt.Sprintf("* xref:%s.adoc[]", k.Name))
-}
-
-func saveNav(links []string, out string) {
- content := "// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT\n"
- for _, l := range links {
- content += l + "\n"
- }
- content += "// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT\n"
- dest := filepath.Join(out, "nav.adoc")
- if _, err := os.Stat(dest); err == nil {
- err = os.Remove(dest)
- handleGeneralError(fmt.Sprintf("cannot remove file %q", dest),
err)
- }
- err := os.WriteFile(dest, []byte(content), 0666)
- handleGeneralError(fmt.Sprintf("cannot write file %q", dest), err)
- fmt.Printf("%q written\n", dest)
-}
-
-func listKamelets(dir string) []camelapiv1.Kamelet {
- scheme := runtime.NewScheme()
- err := camelapiv1.AddToScheme(scheme)
- handleGeneralError("cannot to add camel APIs to scheme", err)
-
- kamelets := make([]camelapiv1.Kamelet, 0)
- files, err := os.ReadDir(dir)
- filesSorted := make([]string, 0)
- handleGeneralError(fmt.Sprintf("cannot list dir %q", dir), err)
- for _, fd := range files {
- if !fd.IsDir() && strings.HasSuffix(fd.Name(), ".kamelet.yaml")
{
- fullName := filepath.Join(dir, fd.Name())
- filesSorted = append(filesSorted, fullName)
- }
- }
- sort.Strings(filesSorted)
- for _, fileName := range filesSorted {
- yamlContent, err := os.ReadFile(fileName)
- handleGeneralError(fmt.Sprintf("cannot read file %q",
fileName), err)
- jsonContent, err := yaml.ToJSON(yamlContent)
- handleGeneralError(fmt.Sprintf("cannot convert yaml file %q
into json", fileName), err)
- var kamelet *camelapiv1.Kamelet
- err = yaml.Unmarshal(jsonContent, &kamelet)
- handleGeneralError(fmt.Sprintf("cannot unmarshal file %q into
Kamelet", fileName), err)
- kamelets = append(kamelets, *kamelet)
- }
- return kamelets
-}
-
-func handleGeneralError(desc string, err error) {
- if err != nil {
- fmt.Printf("%s: %+v\n", desc, err)
- os.Exit(2)
- }
-}
diff --git a/script/generator/go.mod b/script/generator/go.mod
deleted file mode 100644
index 53e8fb819..000000000
--- a/script/generator/go.mod
+++ /dev/null
@@ -1,31 +0,0 @@
-module github.com/apache/camel-kamelets/script/generator
-
-go 1.25.0
-
-require (
- github.com/apache/camel-kamelets/crds v0.0.0
- k8s.io/apimachinery v0.33.4
-)
-
-replace github.com/apache/camel-kamelets/crds => ../../crds
-
-require (
- github.com/fxamacker/cbor/v2 v2.8.0 // indirect
- github.com/go-logr/logr v1.4.3 // indirect
- github.com/gogo/protobuf v1.3.2 // indirect
- github.com/json-iterator/go v1.1.12 // indirect
- github.com/kr/text v0.2.0 // indirect
- github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd //
indirect
- github.com/modern-go/reflect2 v1.0.2 // indirect
- github.com/x448/float16 v0.8.4 // indirect
- golang.org/x/net v0.55.0 // indirect
- golang.org/x/text v0.37.0 // indirect
- gopkg.in/inf.v0 v0.9.1 // indirect
- k8s.io/api v0.33.4 // indirect
- k8s.io/klog/v2 v2.130.1 // 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.7.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
-)
diff --git a/script/generator/go.sum b/script/generator/go.sum
deleted file mode 100644
index b4135b39c..000000000
--- a/script/generator/go.sum
+++ /dev/null
@@ -1,96 +0,0 @@
-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/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.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
-github.com/go-logr/logr v1.4.3/go.mod
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/gogo/protobuf v1.3.2/go.mod
h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-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/json-iterator/go v1.1.12
h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
-github.com/json-iterator/go v1.1.12/go.mod
h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-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.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
-github.com/kr/pretty v0.3.1/go.mod
h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod
h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-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=
-github.com/modern-go/reflect2 v1.0.2
h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
-github.com/modern-go/reflect2 v1.0.2/go.mod
h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/pmezard/go-difflib v1.0.0/go.mod
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
-github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-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/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
-github.com/spf13/pflag v1.0.5/go.mod
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/stretchr/objx v0.1.0/go.mod
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.3.0/go.mod
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-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=
-github.com/x448/float16 v0.8.4/go.mod
h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/yuin/goldmark v1.1.27/go.mod
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-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/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.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
-golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
-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=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-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.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod
h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
-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=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod
h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-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=
-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=
-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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk=
-k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc=
-k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s=
-k8s.io/apimachinery v0.33.4/go.mod
h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
-k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-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/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.7.0
h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI=
-sigs.k8s.io/structured-merge-diff/v4 v4.7.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=