datapackage-swift

Build Coverage Codebase Support

一个用于处理 Data Packages 的 Swift 库。它还包含一个针对 Tabular Data Package 的配置文件,并结合了相应的 Table Schema 库。

要求

实现状态

该库支持以下功能和配置文件。有一个测试套件来检查哪些应该正常工作。欢迎贡献。

请注意,用于 Tabular Data Package Profile 的 Table Schema 实现是不完整的。不支持的字段类型将不会被转换,从而导致在这些不支持的类型上潜在的数据丢失。

总体状态

功能 状态
读取/写入 Data Package JSON 描述符 可用
Tabular Data Package profile(表格数据包配置文件) 可用
验证 可用
针对 JSON Schema 的验证 缺失
检索远程资源 缺失,消费者可以处理
验证 基本可用
严格模式 部分,通过日志级别
Schema 推断 缺失
压缩 缺失
附加/自定义属性 可用
通过 Profiles 扩展 可用

这是 Data Package 和 Tabular Data Package 的惯用 Swift 实现。它最初实现了功能的子集,用于将数据库序列化(和反序列化)为人类可用的格式。此后,它已扩展为更通用的用途。虽然此实现提供了对规范中所有属性的访问,但某些功能的优先级较低,特别是涉及网络和模式验证的任何内容。

一般的策略是仅在需要时才实现功能。

Data Package Profile 状态

功能 状态
附加/自定义属性 可用
属性 状态
名称 可用,无验证
Id 可用
许可证 可用
标题 可用
描述 可用,无验证
主页 可用
版本 可用,无语义版本验证
来源 可用
贡献者 可用
关键词 可用
图片 可用
创建时间 可用*

* 仅在 Apple 产品(iOS >= 10 和 macOS >= 10.12)上可用,因为 swift-corelibs-foundation 中的 Linux 实现不完整。目前不支持小数秒。

Data Resource Profile 状态

功能 状态
本地捆绑资源 可用
检索远程资源 消费者必须处理
内联数据 消费者必须解释
每个资源的多个路径 消费者必须处理
属性 状态
路径 可用,无验证
数据 可用,但消费者可以解释
名称 可用,无验证
标题 可用
描述 可用
格式 可用
媒体类型 可用
编码 可用
字节 可用,但消费者应该验证
哈希 可用,但消费者应该验证
来源 可用
许可证 可用
模式 可用,但消费者可以解释

Tabular Data Package Profile 状态

功能 状态
CSV 支持 可用,需要外部 CSV 库

Tabular Data Resource Profile 状态

功能 状态
Table Schema 可用
CSV Dialect 可用
本地捆绑资源 可用
检索远程资源 消费者必须处理
内联数据 消费者必须解释
每个资源的多个路径 消费者必须处理
Table Schema 状态

请参阅 Table Schema

命令行界面

包含一个简单的 CLI 工具,该工具使用此库来显示包验证警告和错误,并可选择重新导出。

make
make install
datapackage-swift path/to/package

集成到您的项目中

Swift Package Manager

该项目是使用 Swift Package Manager 设置的。理想情况下,将其添加到您项目的 SPM 依赖项中,或使用 Xcode 集成的 Swift Package Manager。或者,生成您自己的 Xcode .xcodeproj 以使用以下命令与您的构建系统集成

swift package generate-xcodeproj --xcconfig-overrides ./Configuration.xcconfig

用法示例

实例化

可以从 JSON 描述符实例化一个包

let registry = Registry(default: Package.self)
registry.add(profile: Package.self)
registry.add(profile: TabularDataPackage.self)

var importURL = URL(fileURLWithPath: "./")
importURL.appendPathComponent("2017-12-14", isDirectory: true)

var log = Log()

guard let package = Package.package(url: importURL, registry: registry, log: &log) else {
    // Error
}

或者可以直接实例化

let package = Package()

序列化

var exportURL = URL(fileURLWithPath: "./")
exportURL.appendPathComponent("2017-12-15", isDirectory: true)

guard package.save(to: exportURL) else {
    // Error
}

了解库

模型检查(验证和确认)

该库区分验证和确认:验证对应于从 JSON 描述符反序列化时,模型在实例化时的有效性。而确认对应于模型在实例化后某个时间点的有效性。

这种区分很有用,因为规范对模型施加了一些约束,这些约束可能无法在编译时全部解决。例如,必需属性的值格式是否不正确,或者属性的存在是否取决于另一个属性。此外,模型应允许随着模型更新到新状态而进行转换。因此,有必要在实例化时以及在使用模型时通过模型验证步骤来检查有效性。

两种方法用于模型检查。首先,一些初始化器可能会失败。其次,公开一个日志,其中包含有关模型的错误和警告。

var log = Log()

let package = Package.package(url: importURL, registry: registry, log: &log)
let package?.verify(log: &log)

for item in log.items {
    print(item.message)
}

日志按严重性级别进行分级,错误会导致无法实例化模型。错误对应于规范中的 MUSTMUST NOTREQUIREDSHALLSHALL NOT。警告对应于 SHOULDSHOULD NOTRECOMMENDED

模型表示

此库不是维护一个在访问各种属性时修改的基础 JSON 描述符的模型实例,而是将 JSON 描述符解码为模型对象。这对序列化有影响,其中模型的导出是不稳定的:未更改的属性可能会被更改,并且属性的顺序和格式可能无法保留。

关于 Swift 库的一句话

Swift 5 与 Swift 4 源代码兼容,并且历史表明每个新的 Swift 版本都与上一个版本源代码兼容。尽管 ABI 稳定性、模块稳定性和库演进支持是正在解决的关于库的创作和消费的兼容性问题,但实际上,二进制兼容性不如源代码兼容性那么重要,因为此库的代码可用。此外,Swift 5 的 ABI 稳定性仅在 Apple 的平台上可用 - 像 Linux 这样的其他平台需要单独实现它。