#toml #cargo-toml #bash #json-toml #key-file #key-value #command-line-tool

应用 tomato-toml

🍅 在 TOML 文件中获取和设置值,同时保留注释和格式

5 个版本 (重大更改)

0.5.0 2023 年 9 月 24 日
0.4.0 2023 年 9 月 9 日
0.3.0 2022 年 8 月 18 日
0.2.0 2022 年 8 月 14 日
0.1.0 2022 年 8 月 6 日

#1211 in 命令行工具

BlueOak-1.0.0

48KB
855

tomato

Test the tomato Crates.io

在 TOML 文件中获取、设置和删除值,同时保留注释和格式。

就是这样。这就是功能集。我编写了 tomato 来满足我的主要使用案例,即从 TOML 预设文件中读取各种类型的值,使用 bash 工具处理这些值,并且偶尔从其他 bash 脚本中更新这些值。

要安装

# using homebrew:
brew tap ceejbot/tap
brew install tomato

# if you have rust installed and prefer to build from source:
cargo install tomato-toml

# once installed:
tomato --help

或者从 发布版 中获取预构建的可执行文件。

如果您在修改值时不需要保留注释和格式,可以使用 dasel 作为替代工具。dasel 还支持大量的文件格式。

如果您需要转换 JSON、YAML 和 TOML 之间,请查看 jyt

用法

简短版

  • 获取键:tomato get <点分.> <文件>
  • 设置键:tomato set <点分.> <> <文件>
  • 删除键:tomato rm <点分.> <文件>(与 rm 有很多别名)

setrm 子命令就地修改输入文件。多亏了 toml_edit 的魔力,它们在不干扰空格和注释的情况下这样做。

默认情况下,tomato 以适合立即在 bash 脚本中使用的形式输出数据。例如,字符串是不带引号的。bash 格式生成适合在 bash 中的 eval 使用的输出。对于数组和关联数组,请使用此格式。如果您需要消耗更复杂的输出,可以选择 json 格式并将结果管道传输到 jq。当然,如果您需要 TOML,请使用 toml

详细版

🍅 tomato 0.2.0
A command-line tool to get and set values in toml files while preserving comments and formatting.

Keys are written using `.` to separate path segments. You can use `array[idx]` syntax to index into
arrays if you want to. For example, to get the name of the current crate you're working on, you'd
run `tomato get Cargo.toml package.name`.

By default tomato emits data in a form suitable for immediate use in bash scripts if they are
primitive values: strings are unquoted, for instance. If you want to use more complex data types,
consider one of the other output formats.

To read from stdin instead of a file, omit the file from the arguments. Operating on stdin changes
the behavior of set and rm somewhat, under the assumption that you are using this tool in a shell
script. If you read from stdin, normal output (the old value) is suppressed. Instead the modified
file is written to stdout in json if you requested json, toml otherwise. The 'bash' format option is
ignored.

USAGE:
	tomato [OPTIONS] <SUBCOMMAND>

OPTIONS:
	-b, --backup
			Back up the file to <filepath>.bak if we write a new version. This option is ignored
			when we're operating on stdin

	-f, --format <FORMAT>
			How to format the output: json, toml, bash, or raw
			[default: raw]

	-h, --help
			Print help information

	-V, --version
			Print version information

SUBCOMMANDS:
	get     Get the value of a key from the given file
	set     Set a key to the given value, returning the previous value if one existed
	rm      Delete a key from the given file, returning the previous value if one existed
	completions
			Generate completions for the named shell
	help    Print this message or the help of the given subcommand(s)

getrm 如果目标键未找到,都会将空字符串打印到标准输出。如果目标键未找到,set 会以非零状态退出,并在标准错误中打印一条消息。

设置布尔值和数字

番茄在它的 set 命令中对待布尔值和数字的方式与普通值略有不同。你很可能需要在某些时候将布尔值的 "true" 和字符串 "true" 都作为值设置。为了在命令行上将布尔值 true 和字符串 "true" 区分开来,请用引号包围字符串,不要用引号包围布尔值。记住,你的shell会移除第一层引号,所以你需要使用两层!也就是说,使用 '"true"' 来获取字符串,并使用 true 来获取布尔值。

以下是与测试组件一起工作的示例

# set a value to a boolean
➜ tomato -f toml set testcases.are_complete true fixtures/sample.toml
false
➜ tomato -f toml get testcases.are_complete fixtures/sample.toml
true
# set a value to a string
➜ tomato -f toml set testcases.are_complete '"false"' fixtures/sample.toml
true
# set a value to a number
➜ tomato -f toml set testcases.are_complete 20 fixtures/sample.toml
"false"
# set a value to a string that happens to be a number
➜ tomato -f toml set testcases.are_complete "'20'" fixtures/sample.toml
20
➜ tomato -f toml get testcases.are_complete fixtures/sample.toml
"20"

示例

以下是一些针对此项目Cargo清单运行的示例

$ tomato get package.name Cargo.toml
tomato
$ tomato --format json get package.name Cargo.toml
"tomato"
$ cat Cargo.toml | tomato get package.name
tomato

# set examples
$ tomato set package.name broccoli Cargo.toml
tomato
$ tomato set package.keywords[1] yaml Cargo.toml
toml

# Keys that don't exist
$ tomato get dependencies.toml_edit[0] Cargo.toml

$ tomato set dependencies.toml_edit[0] "first!" Cargo.toml
Error: unable to index into non-array at dependencies.toml_edit.0

# rm has a number of aliases to prevent user frustration
$ tomato --format json del package.categories[0] Cargo.toml
"command-line-utilities"

查看 examples/ 目录中的一些示例bash脚本,其中包括更多样化的示例,包括bash中使用列表和关联数组的示例。

贡献

当然!请记住主要用例:你需要读取toml并在bash中使用它。我很乐意接受任何改进该用例或使Rust部分更好的东西。

许可证

蓝橡模型许可证;在 LICENSE.md 中查看文本。

依赖项

~9–19MB
~283K SLoC