#version #embassy #semver

emver

带有可选第四位的Semver扩展,给定补丁语义。适用于软件包分发商

4个版本

0.1.6 2021年10月4日
0.1.2 2021年4月22日
0.1.1 2021年4月9日
0.1.0 2020年11月2日

#529 in WebAssembly

Download history 13/week @ 2024-04-04 3/week @ 2024-06-20 11/week @ 2024-06-27 44/week @ 2024-07-04 109/week @ 2024-07-11 96/week @ 2024-07-18

261 每月下载量

MIT 协议

29KB
559

Emver

此模块旨在解决发布Embassy包更新时的问题,其中上游项目可能不知道或对支持Embassy平台上的应用程序不感兴趣。在大多数情况下,原始包将支持semver2。这给我们留下了一个问题,即我们希望保留原始包的版本,因为Embassy平台的一个目标就是透明度。然而,有时我们会出错,发布了需要更新元数据的包的版本。在这种情况下,我们面临着一个难题,要么单方面声明一个非我们编写的包的版本号,要么让问题持续到下一个更新。这两种情况都不利于用户体验,原因各不相同。此模块通过添加第四位数字扩展了上面链接的semver标准,第四位数字具有补丁语义。

用法

将此添加到您的Cargo.toml

[dependencies]
emver = "0.1.0"

操作

Version 包含4个部分:主版本、次要版本、补丁和修订。前三个的意义可以在Semver2规范中找到。第四个也具有补丁语义,但旨在在不是作者的情况下由软件包分发商递增。

Version 还可以从点分隔的字符串中解析,例如 0.1.2.3。它们也可以序列化为字符串,但在最后一位是零的情况下,省略了最后一点和零。解析仍适用于三重。与 Version 相关的解析函数是 parse_version,它由 nom 解析库生成。它可以应用于字符串,并将产生一个 Result<Version, ParseError>

该库的另一部分处理的是类型 VersionRange。一个 VersionRange 是一个集合,它要么锚定在某个特定的 Version 上,并带有某种比较运算符:= >= <= > <,要么描述为其他 VersionRange 的合取或析取。为了方便,我们还提供了两个构造函数(AnyNone),分别作为 ConjDisj 构造函数的恒等元素。因此,为了获得最佳性能,您应该使用智能构造函数 conjdisj,而不是它们的无脑对应物 ConjDisj。这将立即评估恒等元素和湮灭元素,而不是进一步构建 AST,从而节省峰值内存。

为了方便,公开了两个 Monoid 包装器:(AnyRangeAllRange)。这允许您使用带有种子值为 emptycombine 操作对 Iterable 进行折叠。语义差异在于 combine 分别使用 disjconj

大多数情况下,您会希望从字符串中解析这些值,但内部结构对外公开,以处理更罕见的情况。支持来自 node-semver 的某些语法(^1.2.3,~2.3.4,1.2.x,0.0.0-1.1.1)。

最后,该包中最有用的操作是在 Version 上对 VersionRange 进行 satisfies 操作。这只是一个谓词,告诉您 Version 是否落在 VersionRange 内。

法则

以下列出的所有法则都是观察到的等价性,而不是一个字面 Eq 实例,表示表示性等价。这个库唯一的观察者是 satisfies 操作。当您看到 "a === b" 时,您应该将其解释为 obs.satisfies(a) === obs.satisfies(b)。这些法则仅意味着,在不改变程序意义的情况下,始终可以在左侧的项上替换右侧的项。

  • Conj 是交换的:conj(a,b) === conj(b,a)
  • Disj 是交换的:conj(a,b) === disj(b,a)
  • Conj 是结合的:conj(conj(a,b),c) === conj(a,conj(b,c))
  • Disj 是结合的:disj(disj(a,b),c) === disj(a,disj(b,c))
  • AnyConj 的恒等元素:conj(a, Any) === a
  • NoneDisj 的恒等元素:disj(a, None) === a
  • Any 湮灭 Disj:disj(a, Any) === Any
  • None 湮灭 Conj:conj(a, None) === None
  • ConjDisj 上分配:conj(a,disj(b,c)) === disj(conj(a,b),conj(a,c))
  • DisjConj 上分配:disj(a,conj(b,c)) === conj(disj(a,b),disj(a,c))

依赖关系

~3MB
~60K SLoC