This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new e7ccedd4bac9 CAMEL-23226: Expand tab completion candidates in
camel-jbang commands
e7ccedd4bac9 is described below
commit e7ccedd4bac9bc38caebc89fb7b5e0802c65b479
Author: Guillaume Nodet <[email protected]>
AuthorDate: Mon Mar 23 11:13:24 2026 +0100
CAMEL-23226: Expand tab completion candidates in camel-jbang commands
- Add completionCandidates to options across 8 commands
- New shared classes: JavaVersionCompletionCandidates,
ProfileCompletionCandidates
- Per-command candidates for output formats (DependencyList,
CamelReceiveAction, Bind)
- Per-command candidates for format options (Explain, Harden,
TransformRoute)
- Add LoggingLevelCompletionCandidates to ExportBaseCommand
- Use ${COMPLETION-CANDIDATES} in descriptions for auto-generated help text
---
.../dsl/jbang/core/commands/DependencyList.java | 15 +++++++++-
.../camel/dsl/jbang/core/commands/Explain.java | 15 +++++++++-
.../dsl/jbang/core/commands/ExportBaseCommand.java | 13 +++++++--
.../camel/dsl/jbang/core/commands/Harden.java | 15 +++++++++-
.../apache/camel/dsl/jbang/core/commands/Run.java | 4 ++-
.../dsl/jbang/core/commands/TransformRoute.java | 15 +++++++++-
.../core/commands/action/CamelReceiveAction.java | 14 +++++++++-
.../camel/dsl/jbang/core/commands/bind/Bind.java | 16 ++++++++++-
.../common/JavaVersionCompletionCandidates.java | 32 ++++++++++++++++++++++
.../core/common/ProfileCompletionCandidates.java | 32 ++++++++++++++++++++++
10 files changed, 161 insertions(+), 10 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/DependencyList.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/DependencyList.java
index 7ff744342599..9fa59ae6d238 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/DependencyList.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/DependencyList.java
@@ -22,6 +22,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Properties;
@@ -50,7 +51,19 @@ public class DependencyList extends Export {
protected static final String EXPORT_DIR =
CommandLineHelper.CAMEL_JBANG_WORK_DIR + "/export";
- @CommandLine.Option(names = { "--output" }, description = "Output format
(gav, maven, jbang)", defaultValue = "gav")
+ public static class OutputFormatCompletionCandidates implements
Iterable<String> {
+
+ public OutputFormatCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("gav", "maven", "jbang").iterator();
+ }
+ }
+
+ @CommandLine.Option(names = { "--output" }, completionCandidates =
OutputFormatCompletionCandidates.class,
+ description = "Output format
(${COMPLETION-CANDIDATES})", defaultValue = "gav")
protected String output;
public DependencyList(CamelJBangMain main) {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
index 15f6c70458c9..8abac544185f 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Explain.java
@@ -25,6 +25,7 @@ import java.nio.file.Path;
import java.time.Duration;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -54,6 +55,17 @@ import picocli.CommandLine.Parameters;
sortOptions = false, showDefaultValues = true)
public class Explain extends CamelCommand {
+ public static class FormatCompletionCandidates implements Iterable<String>
{
+
+ public FormatCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("text", "markdown").iterator();
+ }
+ }
+
private static final String DEFAULT_OLLAMA_URL = "http://localhost:11434";
private static final String DEFAULT_MODEL = "llama3.2";
private static final int CONNECT_TIMEOUT_SECONDS = 10;
@@ -123,7 +135,8 @@ public class Explain extends CamelCommand {
boolean verbose;
@Option(names = { "--format" },
- description = "Output format: text, markdown",
+ completionCandidates = FormatCompletionCandidates.class,
+ description = "Output format (${COMPLETION-CANDIDATES})",
defaultValue = "text")
String format = "text";
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 8983d9311464..ac866cf3ddc4 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -51,10 +51,13 @@ import org.apache.camel.catalog.DefaultCamelCatalog;
import org.apache.camel.dsl.jbang.core.commands.catalog.KameletCatalogHelper;
import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
import org.apache.camel.dsl.jbang.core.common.HawtioVersion;
+import org.apache.camel.dsl.jbang.core.common.JavaVersionCompletionCandidates;
+import org.apache.camel.dsl.jbang.core.common.LoggingLevelCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.Plugin;
import org.apache.camel.dsl.jbang.core.common.PluginExporter;
import org.apache.camel.dsl.jbang.core.common.PluginHelper;
import org.apache.camel.dsl.jbang.core.common.Printer;
+import org.apache.camel.dsl.jbang.core.common.ProfileCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.RuntimeType;
import org.apache.camel.dsl.jbang.core.common.RuntimeTypeConverter;
@@ -160,7 +163,8 @@ public abstract class ExportBaseCommand extends
CamelCommand {
defaultValue = "CamelApplication")
protected String mainClassname = "CamelApplication";
- @CommandLine.Option(names = { "--java-version" }, description = "Java
version (21, 25)", defaultValue = "21")
+ @CommandLine.Option(names = { "--java-version" }, completionCandidates =
JavaVersionCompletionCandidates.class,
+ description = "Java version
(${COMPLETION-CANDIDATES})", defaultValue = "21")
protected String javaVersion = "21";
@CommandLine.Option(names = { "--camel-version" },
@@ -173,7 +177,8 @@ public abstract class ExportBaseCommand extends
CamelCommand {
protected String kameletsVersion = RuntimeType.KAMELETS_VERSION;
@CommandLine.Option(names = { "--profile" }, scope =
CommandLine.ScopeType.INHERIT,
- description = "Profile to export (dev, test, or
prod).")
+ completionCandidates =
ProfileCompletionCandidates.class,
+ description = "Profile to export
(${COMPLETION-CANDIDATES}).")
protected String profile;
@CommandLine.Option(names = { "--local-kamelet-dir" },
@@ -219,7 +224,9 @@ public abstract class ExportBaseCommand extends
CamelCommand {
description = "If exporting to current directory
(default) then all existing files are preserved. Enabling this option will
force cleaning current directory including all sub dirs (use this with care)")
protected boolean cleanExportDir;
- @CommandLine.Option(names = { "--logging-level" }, defaultValue = "info",
description = "Logging level")
+ @CommandLine.Option(names = { "--logging-level" }, defaultValue = "info",
+ completionCandidates =
LoggingLevelCompletionCandidates.class,
+ description = "Logging level
(${COMPLETION-CANDIDATES})")
protected String loggingLevel = "info";
@CommandLine.Option(names = { "--package-name" },
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
index 244d03619b5b..77a5b46144a5 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Harden.java
@@ -25,6 +25,7 @@ import java.nio.file.Path;
import java.time.Duration;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -55,6 +56,17 @@ import picocli.CommandLine.Parameters;
sortOptions = false, showDefaultValues = true)
public class Harden extends CamelCommand {
+ public static class FormatCompletionCandidates implements Iterable<String>
{
+
+ public FormatCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("text", "markdown").iterator();
+ }
+ }
+
private static final String DEFAULT_OLLAMA_URL = "http://localhost:11434";
private static final String DEFAULT_MODEL = "llama3.2";
private static final int CONNECT_TIMEOUT_SECONDS = 10;
@@ -140,7 +152,8 @@ public class Harden extends CamelCommand {
boolean verbose;
@Option(names = { "--format" },
- description = "Output format: text, markdown",
+ completionCandidates = FormatCompletionCandidates.class,
+ description = "Output format (${COMPLETION-CANDIDATES})",
defaultValue = "text")
String format = "text";
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 032209bc3c70..b718dddb026c 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -49,6 +49,7 @@ import org.apache.camel.dsl.jbang.core.common.Plugin;
import org.apache.camel.dsl.jbang.core.common.PluginExporter;
import org.apache.camel.dsl.jbang.core.common.PluginHelper;
import org.apache.camel.dsl.jbang.core.common.Printer;
+import org.apache.camel.dsl.jbang.core.common.ProfileCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.PropertyResolver;
import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.RuntimeType;
@@ -194,7 +195,8 @@ public class Run extends CamelCommand {
String springBootVersion = RuntimeType.SPRING_BOOT_VERSION;
@Option(names = { "--profile" }, scope = CommandLine.ScopeType.INHERIT,
defaultValue = "dev",
- description = "Profile to run (dev, test, or prod).")
+ completionCandidates = ProfileCompletionCandidates.class,
+ description = "Profile to run (${COMPLETION-CANDIDATES}).")
String profile = "dev";
@Option(names = { "--dep", "--dependency" }, description = "Add additional
dependencies",
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
index bf7dd0890bfd..bed812a5bb44 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformRoute.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Stack;
@@ -38,6 +39,17 @@ import picocli.CommandLine.Command;
showDefaultValues = true)
public class TransformRoute extends CamelCommand {
+ public static class FormatCompletionCandidates implements Iterable<String>
{
+
+ public FormatCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("xml", "yaml").iterator();
+ }
+ }
+
@CommandLine.Parameters(description = "The Camel file(s) to run. If no
files specified then application.properties is used as source for which files
to run.",
arity = "0..9", paramLabel = "<files>",
parameterConsumer = FilesConsumer.class)
Path[] filePaths; // Defined only for file path completion; the field
never used
@@ -50,7 +62,8 @@ public class TransformRoute extends CamelCommand {
private String output;
@CommandLine.Option(names = { "--format" },
- description = "Output format (xml or yaml), if only
yaml files are provided, the format defaults to xml and vice versa")
+ completionCandidates =
FormatCompletionCandidates.class,
+ description = "Output format
(${COMPLETION-CANDIDATES}), if only yaml files are provided, the format
defaults to xml and vice versa")
String format;
@CommandLine.Option(names = { "--resolve-placeholders" }, defaultValue =
"false",
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
index c9c8cd9d297f..41f4eb06094f 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
@@ -94,6 +94,17 @@ public class CamelReceiveAction extends ActionBaseCommand {
}
}
+ public static class OutputFormatCompletionCandidates implements
Iterable<String> {
+
+ public OutputFormatCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("text", "json").iterator();
+ }
+ }
+
@CommandLine.Parameters(description = "To use an existing running Camel
integration for receiving the message (name or pid)",
arity = "0..1")
String name;
@@ -194,7 +205,8 @@ public class CamelReceiveAction extends ActionBaseCommand {
description = "Pretty print message body when using
JSon or XML format")
boolean pretty;
- @CommandLine.Option(names = { "--output" }, description = "Output format
(text or json)")
+ @CommandLine.Option(names = { "--output" }, completionCandidates =
OutputFormatCompletionCandidates.class,
+ description = "Output format
(${COMPLETION-CANDIDATES})")
private String output;
private volatile long pid;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java
index a1fceaf30877..7d13475ef143 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/bind/Bind.java
@@ -21,6 +21,8 @@ import java.io.InputStream;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Stack;
import java.util.stream.Collectors;
@@ -41,6 +43,17 @@ import picocli.CommandLine.Command;
@Deprecated(since = "4.19")
public class Bind extends CamelCommand {
+ public static class OutputFormatCompletionCandidates implements
Iterable<String> {
+
+ public OutputFormatCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("file", "yaml", "json").iterator();
+ }
+ }
+
@CommandLine.Parameters(description = "Name of binding file to be saved",
arity = "1",
paramLabel = "<file>", parameterConsumer =
FileConsumer.class)
Path filePath; // Defined only for file path completion; the field never
used
@@ -68,7 +81,8 @@ public class Bind extends CamelCommand {
@CommandLine.Option(names = { "--output" },
defaultValue = "file",
- description = "Output format generated by this command
(supports: file, yaml or json).")
+ completionCandidates =
OutputFormatCompletionCandidates.class,
+ description = "Output format generated by this command
(supports: ${COMPLETION-CANDIDATES}).")
String output;
private final TemplateProvider templateProvider;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/JavaVersionCompletionCandidates.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/JavaVersionCompletionCandidates.java
new file mode 100644
index 000000000000..68f640d1a97c
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/JavaVersionCompletionCandidates.java
@@ -0,0 +1,32 @@
+/*
+ * 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.dsl.jbang.core.common;
+
+import java.util.Iterator;
+import java.util.List;
+
+public class JavaVersionCompletionCandidates implements Iterable<String> {
+
+ public JavaVersionCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("21", "25").iterator();
+ }
+
+}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/ProfileCompletionCandidates.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/ProfileCompletionCandidates.java
new file mode 100644
index 000000000000..2ab6bb3eeabf
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/ProfileCompletionCandidates.java
@@ -0,0 +1,32 @@
+/*
+ * 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.dsl.jbang.core.common;
+
+import java.util.Iterator;
+import java.util.List;
+
+public class ProfileCompletionCandidates implements Iterable<String> {
+
+ public ProfileCompletionCandidates() {
+ }
+
+ @Override
+ public Iterator<String> iterator() {
+ return List.of("dev", "test", "prod").iterator();
+ }
+
+}