3个不稳定版本
0.2.1 | 2022年10月10日 |
---|---|
0.2.0 | 2022年10月2日 |
0.1.0 | 2022年7月21日 |
#2567 在 解析器实现
33KB
549 行
typed-format-version:从结构化文件中加载format.version.{major,minor}。
该模块尝试解析可能已从配置文件中加载的某些原始数据中的format.version "部分",并确定该部分是否包含有效的"major"和"minor"整数值。然后调用者可以选择正确的模式来验证加载的数据,例如,使用带有正确顶级数据类定义的typedload
库。
最常用的函数可能是get_version()
:它接受一个原始数据字典,并在数据包含有效的"format"字典,其中包含"version"字典时,返回一个具有major
和minor
整数属性的Version
对象。可选地,如果pop
参数传递了true值,则get_version()
函数可以删除顶级"format"成员。
Python示例
从文件中加载一些数据,确保其格式正确
try:
raw = json.load(pathlib.Path(cfgfile).open())
ver = typed_format_version.get_version(raw)
except (OSError, ValueError) as err:
sys.exit(f"Invalid data format for {cfgfile}: {err}")
if ver.as_version_tuple() != (0, 2):
sys.exit("Only config format 0.2 supported right now")
cfg = typedload.load(raw, ConfigData)
确定要验证的最佳版本,允许在未知的小版本中添加更多字段
SCHEMAS = {
(0, 1): ConfigTop_0_1,
(0, 2): ConfigTop_0_2,
(1, 0): ConfigTop_1_0,
}
try:
raw = json.load(pathlib.Path(cfgfile).open())
exact_ver = typed_format_version.get_version(raw)
mver = typed_format_version.determine_version_match(exact_ver, SCHEMAS)
except (OSError, ValueError) as err:
sys.exit(f"Invalid data format for {cfgfile}: {err}")
# Either load the data directly...
cfg = typedload.load(raw, SCHEMAS[mver.version], failonextra=mver.failonextra)
# ...or do something with mver.version, possibly examining ver further and
# "upgrading" the loaded configuration from earlier versions by e.g.
# adding default values for fields or reshaping the data.
Rust示例
从文件中加载一些数据,确保其格式正确
use std::fs;
use expect_exit::ExpectedWithError;
let contents = fs::read_to_string(&infile).or_exit_e(|| format!("Could not read {}", infile.display()));
let fver = typed_format_version::get_version_from_str(&contents, serde_json::from_str)
.or_exit_e(|| format!("Could not parse format.version from {}", infile.display()));
if (fver.major(), fver.minor()) != (0, 2) {
expect_exit::exit("Only config format 0.2 supported right now");
}
let cfg: ConfigData = serde_json::from_str(&contents)
.or_exit_e(|| format!("Could not parse {}", infile.display()));
从早期数据格式版本升级
let cfg = match fver.major() {
0 => {
let cfg_0: ConfigData_0 = serde_json::from_str(&contents)
.or_exit_e(|| format!("Could not parse {}", infile.display()));
upgrade_from_version_0(cfg_0)
},
1 => serde_json::from_str::<ConfigData>(&contents)
.or_exit_e(|| format!("Could not parse {}", infile.display())),
_ => expect_exit::exit(&format!("Unexpected major format version {}", fver.major()),
};
联系方式
typed-format-version
库在GitLab仓库中开发。它由Peter Pentchev编写。
依赖项
~0.5–1.1MB
~24K SLoC