一个用于处理 Data Packages 的 Swift 库。它还包含一个针对 Tabular Data Package 的配置文件,并结合了相应的 Table Schema 库。
swift-corelibs-foundation
中的功能可用性Foundation
框架是唯一的依赖项该库支持以下功能和配置文件。有一个测试套件来检查哪些应该正常工作。欢迎贡献。
请注意,用于 Tabular Data Package Profile 的 Table Schema 实现是不完整的。不支持的字段类型将不会被转换,从而导致在这些不支持的类型上潜在的数据丢失。
功能 | 状态 |
---|---|
读取/写入 Data Package JSON 描述符 | 可用 |
Tabular Data Package profile(表格数据包配置文件) | 可用 |
验证 | 可用 |
针对 JSON Schema 的验证 | 缺失 |
检索远程资源 | 缺失,消费者可以处理 |
验证 | 基本可用 |
严格模式 | 部分,通过日志级别 |
Schema 推断 | 缺失 |
压缩 | 缺失 |
附加/自定义属性 | 可用 |
通过 Profiles 扩展 | 可用 |
这是 Data Package 和 Tabular Data Package 的惯用 Swift 实现。它最初实现了功能的子集,用于将数据库序列化(和反序列化)为人类可用的格式。此后,它已扩展为更通用的用途。虽然此实现提供了对规范中所有属性的访问,但某些功能的优先级较低,特别是涉及网络和模式验证的任何内容。
一般的策略是仅在需要时才实现功能。
功能 | 状态 |
---|---|
附加/自定义属性 | 可用 |
属性 | 状态 |
---|---|
名称 | 可用,无验证 |
Id | 可用 |
许可证 | 可用 |
标题 | 可用 |
描述 | 可用,无验证 |
主页 | 可用 |
版本 | 可用,无语义版本验证 |
来源 | 可用 |
贡献者 | 可用 |
关键词 | 可用 |
图片 | 可用 |
创建时间 | 可用* |
* 仅在 Apple 产品(iOS >= 10 和 macOS >= 10.12)上可用,因为 swift-corelibs-foundation
中的 Linux 实现不完整。目前不支持小数秒。
功能 | 状态 |
---|---|
本地捆绑资源 | 可用 |
检索远程资源 | 消费者必须处理 |
内联数据 | 消费者必须解释 |
每个资源的多个路径 | 消费者必须处理 |
属性 | 状态 |
---|---|
路径 | 可用,无验证 |
数据 | 可用,但消费者可以解释 |
名称 | 可用,无验证 |
标题 | 可用 |
描述 | 可用 |
格式 | 可用 |
媒体类型 | 可用 |
编码 | 可用 |
字节 | 可用,但消费者应该验证 |
哈希 | 可用,但消费者应该验证 |
来源 | 可用 |
许可证 | 可用 |
模式 | 可用,但消费者可以解释 |
功能 | 状态 |
---|---|
CSV 支持 | 可用,需要外部 CSV 库 |
功能 | 状态 |
---|---|
Table Schema | 可用 |
CSV Dialect | 可用 |
本地捆绑资源 | 可用 |
检索远程资源 | 消费者必须处理 |
内联数据 | 消费者必须解释 |
每个资源的多个路径 | 消费者必须处理 |
请参阅 Table Schema。
包含一个简单的 CLI 工具,该工具使用此库来显示包验证警告和错误,并可选择重新导出。
make
make install
datapackage-swift path/to/package
该项目是使用 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)
}
日志按严重性级别进行分级,错误会导致无法实例化模型。错误对应于规范中的 MUST
、MUST NOT
、REQUIRED
、SHALL
或 SHALL NOT
。警告对应于 SHOULD
、SHOULD NOT
或 RECOMMENDED
。
此库不是维护一个在访问各种属性时修改的基础 JSON 描述符的模型实例,而是将 JSON 描述符解码为模型对象。这对序列化有影响,其中模型的导出是不稳定的:未更改的属性可能会被更改,并且属性的顺序和格式可能无法保留。
Swift 5 与 Swift 4 源代码兼容,并且历史表明每个新的 Swift 版本都与上一个版本源代码兼容。尽管 ABI 稳定性、模块稳定性和库演进支持是正在解决的关于库的创作和消费的兼容性问题,但实际上,二进制兼容性不如源代码兼容性那么重要,因为此库的代码可用。此外,Swift 5 的 ABI 稳定性仅在 Apple 的平台上可用 - 像 Linux 这样的其他平台需要单独实现它。