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
261 每月下载量
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
的合取或析取。为了方便,我们还提供了两个构造函数(Any
,None
),分别作为 Conj
和 Disj
构造函数的恒等元素。因此,为了获得最佳性能,您应该使用智能构造函数 conj
和 disj
,而不是它们的无脑对应物 Conj
和 Disj
。这将立即评估恒等元素和湮灭元素,而不是进一步构建 AST,从而节省峰值内存。
为了方便,公开了两个 Monoid 包装器:(AnyRange
,AllRange
)。这允许您使用带有种子值为 empty
的 combine
操作对 Iterable
进行折叠。语义差异在于 combine
分别使用 disj
或 conj
。
大多数情况下,您会希望从字符串中解析这些值,但内部结构对外公开,以处理更罕见的情况。支持来自 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))Any
是Conj
的恒等元素:conj(a, Any) === aNone
是Disj
的恒等元素:disj(a, None) === aAny
湮灭Disj
:disj(a, Any) === AnyNone
湮灭Conj
:conj(a, None) === NoneConj
在Disj
上分配:conj(a,disj(b,c)) === disj(conj(a,b),conj(a,c))Disj
在Conj
上分配:disj(a,conj(b,c)) === conj(disj(a,b),disj(a,c))
依赖关系
~3MB
~60K SLoC