Skip to content

Commit 3c5dc11

Browse files
authored
Properly (de)serialize VersionSpec to JSON (#93)
* Properly (de)serialize VersionSpec to JSON * Update src/Dependencies.jl
1 parent ad41af8 commit 3c5dc11

File tree

2 files changed

+98
-31
lines changed

2 files changed

+98
-31
lines changed

src/Dependencies.jl

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -113,43 +113,37 @@ end
113113
# Add JSON serialization of dependencies
114114
string_or_nothing(x) = isnothing(x) ? x : string(x)
115115

116-
major(v::VersionNumber) = v.major
117-
minor(v::VersionNumber) = v.minor
118-
patch(v::VersionNumber) = v.patch
119-
major(v::Pkg.Types.VersionBound) = v.t[1]
120-
minor(v::Pkg.Types.VersionBound) = v.t[2]
121-
patch(v::Pkg.Types.VersionBound) = v.t[3]
122-
__version(v::VersionNumber) = v
123-
__version(v::Pkg.Types.VersionSpec) = v.ranges[1].lower
124-
version(d::AbstractDependency) = __version(getpkg(d).version)
125-
version(d::Dependency) = __version(d.pkg.version)
116+
# helper to get the version of a dependency (and not the build_version)
117+
version(d::AbstractDependency) = getpkg(d).version
118+
version(d::Dependency) = d.pkg.version
126119

127120
for (type, type_descr) in ((Dependency, "dependency"), (BuildDependency, "builddependency"))
128121
JSON.lower(d::type) = Dict("type" => type_descr,
129122
"name" => d.pkg.name,
130123
"uuid" => string_or_nothing(d.pkg.uuid),
131-
"version-major" => major(version(d)),
132-
"version-minor" => minor(version(d)),
133-
"version-patch" => patch(version(d)))
124+
"version" => JSON.parse(JSON.json(version(d))))
134125
end
135126

127+
import Pkg.Types: VersionBound, VersionRange, VersionSpec
128+
dejson(::Type{VersionBound}, d::Dict{String,Any}) = VersionBound(NTuple{d["n"],Int}(d["t"]))
129+
dejson(::Type{VersionRange}, d::Dict{String,Any}) = VersionRange(dejson(VersionBound, d["lower"]), dejson(VersionBound, d["upper"]))
130+
dejson(::Type{VersionSpec}, d::Dict{String,Any}) = VersionSpec([dejson(VersionRange, v) for v in d["ranges"]])
131+
136132
# When deserialiasing the JSON file, the dependencies are in the form of
137133
# dictionaries. This function converts the dictionary back to the appropriate
138134
# AbstractDependency.
139135
function dependencify(d::Dict)
140-
if d["type"] == "dependency"
141-
uuid = isnothing(d["uuid"]) ? d["uuid"] : UUID(d["uuid"])
142-
version = VersionNumber(d["version-major"], d["version-minor"], d["version-patch"])
143-
version = version == v"0" ? nothing : version
144-
return Dependency(PackageSpec(; name = d["name"], uuid = uuid, version = version))
145-
elseif d["type"] == "builddependency"
136+
if haskey(d, "uuid") && haskey(d, "version") && haskey(d, "name")
146137
uuid = isnothing(d["uuid"]) ? d["uuid"] : UUID(d["uuid"])
147-
version = VersionNumber(d["version-major"], d["version-minor"], d["version-patch"])
148-
version = version == v"0" ? nothing : version
149-
return BuildDependency(PackageSpec(; name = d["name"], uuid = uuid, version = version))
150-
else
151-
error("Cannot convert to dependency")
138+
version = dejson(VersionSpec, d["version"])
139+
pkg = PackageSpec(; name = d["name"], uuid = uuid, version = version)
140+
if d["type"] == "dependency"
141+
return Dependency(pkg)
142+
elseif d["type"] == "builddependency"
143+
return BuildDependency(pkg)
144+
end
152145
end
146+
error("Cannot convert to dependency")
153147
end
154148

155149

test/dependencies.jl

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using Test
2-
using Pkg, Base.BinaryPlatforms
2+
using Base.BinaryPlatforms
3+
using Pkg
4+
using Pkg.Types: VersionSpec
35
using BinaryBuilderBase
46
using BinaryBuilderBase: getname, getpkg, dependencify
57
using JSON
@@ -17,12 +19,20 @@ end
1719

1820
@testset "Dependencies" begin
1921
name = "Foo_jll"
22+
2023
dep = Dependency(PackageSpec(; name = name))
2124
@test Dependency(name) == dep
2225
@test getname(dep) == name
23-
@test getname(PackageSpec(; name = name)) == name
2426
@test getpkg(dep) == PackageSpec(; name = name)
2527

28+
dep_version = Dependency(PackageSpec(; name = name, version = v"1"))
29+
@test getname(dep_version) == name
30+
@test getpkg(dep_version) == PackageSpec(; name = name, version = v"1")
31+
32+
dep_vspec = Dependency(PackageSpec(; name = name, version = VersionSpec("1.1-1.4.5")))
33+
@test getname(dep_vspec) == name
34+
@test getpkg(dep_vspec) == PackageSpec(; name = name, version = VersionSpec("1.1-1.4.5"))
35+
2636
build_version = v"1.2.3"
2737
dep_buildver = Dependency(PackageSpec(; name = name), build_version)
2838
@test Dependency(name, build_version) == dep_buildver
@@ -33,26 +43,89 @@ end
3343
build_dep = BuildDependency(PackageSpec(; name = build_name))
3444
@test BuildDependency(build_name) == build_dep
3545
@test getname(build_dep) == build_name
36-
@test getname(PackageSpec(; name = build_name)) == build_name
3746
@test getpkg(build_dep) == PackageSpec(; name = build_name)
3847

3948
@testset "JSON (de)serialization" begin
4049
jdep = JSON.lower(dep)
41-
@test jdep == Dict("type" => "dependency", "name" => name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
50+
@test jdep == Dict(
51+
"type" => "dependency",
52+
"name" => name,
53+
"uuid" => nothing,
54+
"version" => Dict(
55+
"ranges" => [
56+
Dict(
57+
"lower" => Dict("t" => [0,0,0], "n" => 0),
58+
"upper" => Dict("t" => [0,0,0], "n" => 0)
59+
)
60+
]
61+
)
62+
)
4263
@test dependencify(jdep) == dep
4364

65+
jdep_vspec = JSON.lower(dep_vspec)
66+
@test jdep_vspec == Dict(
67+
"type" => "dependency",
68+
"name" => name,
69+
"uuid" => nothing,
70+
"version" => Dict(
71+
"ranges" => [
72+
Dict(
73+
"lower" => Dict("t" => [1,1,0], "n" => 2),
74+
"upper" => Dict("t" => [1,4,5], "n" => 3)
75+
)
76+
]
77+
)
78+
)
79+
@test dependencify(jdep_vspec) == dep_vspec
80+
4481
jdep_buildver = JSON.lower(dep_buildver)
45-
@test jdep_buildver == Dict("type" => "dependency", "name" => name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
82+
@test jdep_buildver == Dict(
83+
"type" => "dependency",
84+
"name" => name,
85+
"uuid" => nothing,
86+
"version" => Dict(
87+
"ranges" => [
88+
Dict(
89+
"lower" => Dict("t" => [0,0,0], "n" => 0),
90+
"upper" => Dict("t" => [0,0,0], "n" => 0)
91+
)
92+
]
93+
)
94+
)
4695
# the build_version is currently not serialized, so the following test fails
4796
@test_broken dependencify(jdep_buildver) == dep_buildver
4897

4998
jbuild_dep = JSON.lower(build_dep)
50-
@test jbuild_dep == Dict("type" => "builddependency", "name" => build_name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
99+
@test jbuild_dep == Dict(
100+
"type" => "builddependency",
101+
"name" => build_name,
102+
"uuid" => nothing,
103+
"version" => Dict(
104+
"ranges" => [
105+
Dict(
106+
"lower" => Dict("t" => [0,0,0], "n" => 0),
107+
"upper" => Dict("t" => [0,0,0], "n" => 0)
108+
)
109+
]
110+
)
111+
)
51112
@test dependencify(jbuild_dep) == build_dep
52113

53114
full_dep = Dependency(PackageSpec(; name = "Baz_jll", uuid = "00000000-1111-2222-3333-444444444444", version = "3.1.4"))
54115
jfull_dep = JSON.lower(full_dep)
55-
@test jfull_dep == Dict("type" => "dependency", "name" => "Baz_jll", "uuid" => "00000000-1111-2222-3333-444444444444", "version-major" => 0x3, "version-minor" => 0x1, "version-patch" => 0x4)
116+
@test jfull_dep == Dict(
117+
"type" => "dependency",
118+
"name" => "Baz_jll",
119+
"uuid" => "00000000-1111-2222-3333-444444444444",
120+
"version" => Dict(
121+
"ranges" => [
122+
Dict(
123+
"lower" => Dict("t" => [3,1,4], "n" => 3),
124+
"upper" => Dict("t" => [3,1,4], "n" => 3)
125+
)
126+
]
127+
)
128+
)
56129
@test dependencify(jfull_dep) == full_dep
57130
@test_throws ErrorException dependencify(Dict("type" => "git"))
58131
end

0 commit comments

Comments
 (0)