Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/cli_tools/example/command_completion_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import 'completion_script_completely.dart';
/// ```
///
/// In order to regenerate the completion scripts, run these commands for each
/// target.
/// tool to target.
///
/// See also [README_completion.md].
///
Expand Down
45 changes: 12 additions & 33 deletions packages/cli_tools/example/completion_script_carapace.dart
Original file line number Diff line number Diff line change
@@ -1,65 +1,44 @@
/// This file is auto-generated.
library;

import 'package:cli_tools/better_command_runner.dart' show CompletionTarget;
import 'package:cli_tools/better_command_runner.dart' show CompletionTool;

const String _completionScript = r'''
# yaml-language-server: $schema=https://carapace.sh/schemas/command.json
name: example
persistentFlags:
-q, --quiet: Suppress all cli output. Is overridden by -v, --verbose.
-v, --verbose: Prints additional information useful for development. Overrides --q, --quiet.
-q, --quiet: "Suppress all cli output. Is overridden by -v, --verbose."
-v, --verbose: "Prints additional information useful for development. Overrides --q, --quiet."

commands:
- name: completion

commands:
- name: generate
flags:
-t, --target=!: The target tool format
-e, --exec-name=: Override the name of the executable
-f, --file=: Write the specification to a file instead of stdout
-t, --tool=!: "The completion tool to target"
-e, --exec-name=: "Override the name of the executable"
-f, --file=: "Write the specification to a file instead of stdout"
completion:
flag:
target: ["completely", "carapace"]
tool: ["completely", "carapace"]
file: ["$files"]

- name: embed
flags:
-t, --target=!: The target tool format
-f, --script-file=: The script file to embed
-o, --output-file=: The Dart file name to write
-d, --output-dir=: Override the directory to write the Dart source file to
completion:
flag:
target: ["completely", "carapace"]
output-dir: ["$directories"]

- name: install
flags:
-t, --target=!: The target tool format
-e, --exec-name=: Override the name of the executable
-d, --write-dir=: Override the directory to write the script to
-t, --tool=!: "The completion tool to target"
-e, --exec-name=: "Override the name of the executable"
-d, --write-dir=: "Override the directory to write the script to"
completion:
flag:
target: ["completely", "carapace"]
tool: ["completely", "carapace"]
write-dir: ["$directories"]

- name: install
flags:
-t, --target=!: The target tool format
-e, --exec-name=: Override the name of the executable
-d, --write-dir=: Override the directory to write the script to
completion:
flag:
target: ["completely", "carapace"]
write-dir: ["$directories"]


''';

/// Embedded script for command line completion for `carapace`.
const completionScriptCarapace = (
target: CompletionTarget.carapace,
tool: CompletionTool.carapace,
script: _completionScript,
);
36 changes: 8 additions & 28 deletions packages/cli_tools/example/completion_script_completely.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// This file is auto-generated.
library;

import 'package:cli_tools/better_command_runner.dart' show CompletionTarget;
import 'package:cli_tools/better_command_runner.dart' show CompletionTool;

const String _completionScript = r'''
# example completion -*- shell-script -*-
Expand Down Expand Up @@ -60,23 +60,15 @@ _example_completions() {
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")
;;

'completion embed'*'--output-dir')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")
;;

'completion generate'*'--target')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "completely carapace")" -- "$cur")
;;

'completion install'*'--target')
'completion generate'*'--tool')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "completely carapace")" -- "$cur")
;;

'completion generate'*'--file')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
;;

'completion embed'*'--target')
'completion install'*'--tool')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "completely carapace")" -- "$cur")
;;

Expand All @@ -88,36 +80,24 @@ _example_completions() {
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")
;;

'completion install'*'-d')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")
;;

'completion install'*'-t')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "completely carapace")" -- "$cur")
;;

'completion embed'*'-t')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "completely carapace")" -- "$cur")
;;

'completion embed'*'-d')
'completion install'*'-d')
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")
;;

'completion generate'*)
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "--quiet -q --verbose -v --target -t --exec-name -e --file -f")" -- "$cur")
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "--quiet -q --verbose -v --tool -t --exec-name -e --file -f")" -- "$cur")
;;

'completion install'*)
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "--quiet -q --verbose -v --target -t --exec-name -e --write-dir -d")" -- "$cur")
;;

'completion embed'*)
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "--quiet -q --verbose -v --target -t --script-file -f --output-file -o --output-dir -d")" -- "$cur")
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "--quiet -q --verbose -v --tool -t --exec-name -e --write-dir -d")" -- "$cur")
;;

'completion'*)
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "generate embed install --quiet -q --verbose -v")" -- "$cur")
while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_example_completions_filter "generate install --quiet -q --verbose -v")" -- "$cur")
;;

*)
Expand All @@ -134,6 +114,6 @@ _example_completions() {

/// Embedded script for command line completion for `completely`.
const completionScriptCompletely = (
target: CompletionTarget.completely,
tool: CompletionTool.completely,
script: _completionScript,
);
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:args/command_runner.dart';
import 'package:config/config.dart';

import 'completion/completion_command.dart';
import 'completion/completion_target.dart' show CompletionScript;
import 'completion/completion_tool.dart' show CompletionScript;

/// A function type for executing code before running a command.
typedef OnBeforeRunCommand = Future<void> Function(BetterCommandRunner runner);
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export 'completion_target.dart';
export 'completion_tool.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ import '../better_command.dart';
import 'completion_embed_command.dart';
import 'completion_generate_command.dart';
import 'completion_install_command.dart';
import 'completion_target.dart';
import 'completion_tool.dart';

abstract final class CompletionOptions {
static const targetOption = EnumOption(
enumParser: EnumParser(CompletionTarget.values),
argName: 'target',
static const toolOption = EnumOption(
enumParser: EnumParser(CompletionTool.values),
argName: 'tool',
argAbbrev: 't',
helpText: 'The target tool format',
helpText: 'The completion tool to target',
allowedHelp: {
'completely':
'Use the `completely` tool (https://github.com/bashly-framework/completely)',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import '../better_command_runner.dart' show StandardGlobalOption;
import 'completion_command.dart' show CompletionOptions;

enum CompletionEmbedOption<V extends Object> implements OptionDefinition<V> {
target(CompletionOptions.targetOption),
tool(CompletionOptions.toolOption),
scriptFileName(StringOption(
argName: 'script-file',
argAbbrev: 'f',
Expand All @@ -22,7 +22,7 @@ enum CompletionEmbedOption<V extends Object> implements OptionDefinition<V> {
helpText: 'The Dart file name to write ("-" for stdout)',
fromCustom: _outputSourceFileName,
customValidator: _validateSourceFileName,
defaultsTo: 'completion_script_<target>.dart',
defaultsTo: 'completion_script_<tool>.dart',
)),
outDir(DirOption(
argName: 'output-dir',
Expand Down Expand Up @@ -62,8 +62,8 @@ Directory _defaultWriteDir() {
}

String _outputSourceFileName(final Configuration cfg) {
final target = cfg.value(CompletionEmbedOption.target);
return 'completion_script_${target.name}.dart';
final tool = cfg.value(CompletionEmbedOption.tool);
return 'completion_script_${tool.name}.dart';
}

void _validateSourceFileName(final String value) {
Expand Down Expand Up @@ -95,7 +95,7 @@ class CompletionEmbedCommand<T>
@override
Future<T> runWithConfig(
final Configuration<CompletionEmbedOption> commandConfig) async {
final target = commandConfig.value(CompletionEmbedOption.target);
final tool = commandConfig.value(CompletionEmbedOption.tool);
final scriptFileName =
commandConfig.optionalValue(CompletionEmbedOption.scriptFileName);
final writeFile = commandConfig.value(CompletionEmbedOption.outFileName);
Expand All @@ -113,15 +113,15 @@ class CompletionEmbedCommand<T>
/// This file is auto-generated.
library;

import 'package:cli_tools/better_command_runner.dart' show CompletionTarget;
import 'package:cli_tools/better_command_runner.dart' show CompletionTool;

const String _completionScript = r'''
$scriptContent
''';

/// Embedded script for command line completion for `${target.name}`.
const completionScript${target.name.capitalize()} = (
target: $target,
/// Embedded script for command line completion for `${tool.name}`.
const completionScript${tool.name.capitalize()} = (
tool: $tool,
script: _completionScript,
);
""";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import '../better_command_runner.dart' show StandardGlobalOption;
import 'carapace_generator.dart';
import 'completely_generator.dart';
import 'completion_command.dart' show CompletionOptions;
import 'completion_target.dart';
import 'completion_tool.dart';
import 'usage_representation.dart';

enum CompletionGenerateOption<V extends Object> implements OptionDefinition<V> {
target(CompletionOptions.targetOption),
tool(CompletionOptions.toolOption),
execName(CompletionOptions.execNameOption),
file(FileOption(
argName: 'file',
Expand All @@ -38,7 +38,7 @@ class CompletionGenerateCommand<T>
@override
Future<T> runWithConfig(
final Configuration<CompletionGenerateOption> commandConfig) async {
final target = commandConfig.value(CompletionGenerateOption.target);
final tool = commandConfig.value(CompletionGenerateOption.tool);
final execName =
commandConfig.optionalValue(CompletionGenerateOption.execName);
final file = commandConfig.optionalValue(CompletionGenerateOption.file);
Expand All @@ -55,11 +55,11 @@ class CompletionGenerateCommand<T>

final IOSink out = file?.openWrite() ?? stdout;

switch (target) {
case CompletionTarget.completely:
switch (tool) {
case CompletionTool.completely:
CompletelyYamlGenerator().generate(out, usage);
break;
case CompletionTarget.carapace:
case CompletionTool.carapace:
CarapaceYamlGenerator().generate(out, usage);
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import '../better_command.dart';
import '../better_command_runner.dart' show StandardGlobalOption;
import '../exit_exception.dart';
import 'completion_command.dart' show CompletionOptions;
import 'completion_target.dart';
import 'completion_tool.dart';

enum CompletionInstallOption<V extends Object> implements OptionDefinition<V> {
target(CompletionOptions.targetOption),
tool(CompletionOptions.toolOption),
execName(CompletionOptions.execNameOption),
writeDir(DirOption(
argName: 'write-dir',
Expand All @@ -27,12 +27,12 @@ enum CompletionInstallOption<V extends Object> implements OptionDefinition<V> {

class CompletionInstallCommand<T>
extends BetterCommand<CompletionInstallOption, T> {
final Map<CompletionTarget, String> _embeddedCompletions;
final Map<CompletionTool, String> _embeddedCompletions;

CompletionInstallCommand({
required final Iterable<CompletionScript> embeddedCompletions,
}) : _embeddedCompletions = Map.fromEntries(embeddedCompletions.map(
(final e) => MapEntry(e.target, e.script),
(final e) => MapEntry(e.tool, e.script),
)),
super(options: CompletionInstallOption.values);

Expand All @@ -45,7 +45,7 @@ class CompletionInstallCommand<T>
@override
Future<T> runWithConfig(
final Configuration<CompletionInstallOption> commandConfig) async {
final target = commandConfig.value(CompletionInstallOption.target);
final tool = commandConfig.value(CompletionInstallOption.tool);
final execName =
commandConfig.optionalValue(CompletionInstallOption.execName);
final writeDir =
Expand All @@ -56,28 +56,28 @@ class CompletionInstallCommand<T>
throw StateError('BetterCommandRunner not set');
}

final scriptContent = _embeddedCompletions[target];
final scriptContent = _embeddedCompletions[tool];
if (scriptContent == null) {
stderr.writeln('No embedded script found for target: $target');
stderr.writeln('No embedded script found for tool "$tool"');
throw ExitException.error();
}

final executableName = execName ?? betterRunner.executableName;

final writeFileName = switch (target) {
CompletionTarget.completely => '$executableName.bash',
CompletionTarget.carapace => '$executableName.yaml',
final writeFileName = switch (tool) {
CompletionTool.completely => '$executableName.bash',
CompletionTool.carapace => '$executableName.yaml',
};
final writeDirPath = writeDir?.path ??
switch (target) {
CompletionTarget.completely => p.join(
switch (tool) {
CompletionTool.completely => p.join(
_getHomeDir(),
'.local',
'share',
'bash-completion',
'completions',
),
CompletionTarget.carapace => p.join(
CompletionTool.carapace => p.join(
_getUserConfigDir(),
'carapace',
'specs',
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
enum CompletionTool {
completely,
carapace,
}

typedef CompletionScript = ({CompletionTool tool, String script});
Loading