#version #format #config-format #data-file #config-file #deserialize #parser

typed-format-version

从结构化文件中加载format.version.{major,minor}

3个不稳定版本

0.2.1 2022年10月10日
0.2.0 2022年10月2日
0.1.0 2022年7月21日

#2567解析器实现

BSD-2-Clause

33KB
549

typed-format-version:从结构化文件中加载format.version.{major,minor}。

该模块尝试解析可能已从配置文件中加载的某些原始数据中的format.version "部分",并确定该部分是否包含有效的"major"和"minor"整数值。然后调用者可以选择正确的模式来验证加载的数据,例如,使用带有正确顶级数据类定义的typedload库。

最常用的函数可能是get_version():它接受一个原始数据字典,并在数据包含有效的"format"字典,其中包含"version"字典时,返回一个具有majorminor整数属性的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