Skip to content

Commit 750d3f5

Browse files
authored
Merge pull request #81 from joewiz/refactor-with-semver.xq-v3
Refactor with semver.xq v3
2 parents f177b20 + 0e16646 commit 750d3f5

File tree

5 files changed

+85
-138
lines changed

5 files changed

+85
-138
lines changed

expath-pkg.xml.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns="http://expath.org/ns/pkg" name="http://exist-db.org/apps/public-repo" abbrev="@project.name@" version="@project.version@" spec="1.0">
33
<title>eXist-db Public Application Repository</title>
44
<dependency processor="http://exist-db.org" semver-min="5.3.0"/>
5-
<dependency package="http://exist-db.org/xquery/semver-xq" semver-min="2.4.0"/>
5+
<dependency package="http://exist-db.org/xquery/semver-xq" semver-min="3.0.0"/>
66
<dependency package="http://exist-db.org/apps/shared" semver-min="0.9.1"/>
77
<dependency package="http://exist-db.org/html-templating" semver-min="1.1.0"/>
88
</package>

modules/app.xqm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ declare function app:view-package($node as node(), $model as map(*), $mode as xs
216216
(: view current package info :)
217217
else
218218
let $packages := $package-group//package
219-
let $compatible-packages := versions:find-compatible-packages($packages, $procVersion)
219+
let $compatible-packages := versions:get-packages-satisfying-exist-version($packages, $procVersion)
220220
let $incompatible-packages := $packages except $compatible-packages
221221
let $show-details := true()
222222
return
@@ -352,7 +352,7 @@ declare function app:package-group-to-list-item($package-group as element(packag
352352
let $download-version-url := concat($repoURL, "public/", $package/@path)
353353
return
354354
<li>
355-
<a href="{$download-version-url}">{$package/@path/string()}</a>
355+
<a href="{$download-version-url}">{ $package/version/string() }</a>
356356
</li>,
357357

358358
(: show links to any other version of the package that is compatible with the requested version of eXist,
@@ -446,7 +446,7 @@ declare function app:requires-to-english($requires as element()) {
446446
if (semver:validate-expath-package-semver-template($requires/@semver-max)) then
447447
concat("earlier than ", semver:serialize-parsed(semver:resolve-expath-package-semver-template-max($requires/@semver-max)))
448448
else
449-
$requires/@semver-max || "or earlier"
449+
$requires/@semver-max || " or earlier"
450450
)
451451
else if ($requires/@semver-min) then
452452
concat(
@@ -463,7 +463,7 @@ declare function app:requires-to-english($requires as element()) {
463463
if (semver:validate-expath-package-semver-template($requires/@semver-max)) then
464464
concat("earlier than ", semver:serialize-parsed(semver:resolve-expath-package-semver-template-max($requires/@semver-max)))
465465
else
466-
$requires/@semver-min || "or earlier"
466+
$requires/@semver-min || " or earlier"
467467
)
468468
else
469469
" version " || $config:default-exist-version

modules/find.xq

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
xquery version "3.1";
22

33
(:~
4-
: Respond to eXist build requests for packages using various identifier and version number criteria
4+
: Respond to eXist build requests for packages by their package descriptor's abbrev or name
5+
: attribute, matching either (1) a minimum eXist version expressed as a SemVer version, or
6+
: (2) an EXPath Package version attributes (`version`, `semver`, `semver-min`, and `semver-max`).
57
:
6-
: The info parameter can be used for troubleshooting
8+
: The parameter name `version` is retained for backward compatibility, even though it's
9+
: `versions` in the EXPath Package spec.
10+
:
11+
: The `info` parameter can be used for troubleshooting.
12+
:
13+
: The `zip` parameter forces the EXPath Package to be returned with a .xar.zip file extension.
14+
:
15+
: @see http://expath.org/spec/pkg
716
:)
817

918
import module namespace app="http://exist-db.org/xquery/app" at "app.xqm";
@@ -16,33 +25,37 @@ declare namespace response="http://exist-db.org/xquery/response";
1625
let $abbrev := request:get-parameter("abbrev", ())
1726
let $name := request:get-parameter("name", ())
1827
let $exist-version-semver := request:get-parameter("processor", $config:default-exist-version)
19-
let $version := request:get-parameter("version", ())
28+
let $versions := request:get-parameter("version", ())
2029
let $semver := request:get-parameter("semver", ())
2130
let $semver-min := request:get-parameter("semver-min", ())
2231
let $semver-max := request:get-parameter("semver-max", ())
2332
let $zip := request:get-parameter("zip", ())
2433
let $info := request:get-parameter("info", ())
2534
let $app-root-absolute-url := request:get-parameter("app-root-absolute-url", ())
2635

27-
let $package-group :=
36+
let $packages :=
2837
if ($name) then
29-
doc($config:package-groups-doc)//package-group[name eq $name]
38+
doc($config:package-groups-doc)//package-group[name eq $name]//package
3039
else
31-
doc($config:package-groups-doc)//package-group[abbrev eq $abbrev]
40+
doc($config:package-groups-doc)//package-group[abbrev eq $abbrev]//package
3241

33-
let $newest-compatible-package := versions:find-newest-compatible-package($package-group//package, $exist-version-semver, $version, $semver, $semver-min, $semver-max)
42+
let $package :=
43+
if (exists($versions) or exists($semver) or exists($semver-min) or exists($semver-max)) then
44+
versions:get-newest-package-satisfying-version-attributes($packages, $versions, $semver, $semver-min, $semver-max)
45+
else
46+
versions:get-newest-package-satisfying-exist-version($packages, $exist-version-semver)
3447

3548
return
36-
if ($newest-compatible-package) then
49+
if ($package) then
3750
(: TODO shouldn't we get $abs-public from $config? - joewiz :)
3851
let $abs-public := $app-root-absolute-url || "/public/"
39-
let $xar-filename := $newest-compatible-package/@path
52+
let $xar-filename := $package/@path
4053
return
4154
if ($info) then
4255
element found {
43-
$newest-compatible-package/@sha256,
44-
$newest-compatible-package/version ! attribute version {.},
45-
$newest-compatible-package/@path
56+
$package/@sha256,
57+
$package/version ! attribute version {.},
58+
$package/@path
4659
}
4760
else if ($zip) then
4861
app:redirect-to($abs-public || $xar-filename || ".zip")

modules/list.xq

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ declare option output:method "xml";
2020
declare option output:media-type "application/xml";
2121

2222
let $exist-version := request:get-parameter("version", $config:default-exist-version)
23-
let $exist-version-semver :=
24-
if (semver:validate($exist-version)) then
25-
$exist-version
26-
else
27-
$config:default-exist-version
23+
let $exist-version-semver := semver:parse($exist-version, true()) => semver:serialize-parsed()
2824
return
2925
element apps {
3026
attribute version { $exist-version-semver },
3127
for $package-group in doc($config:package-groups-doc)//package-group
32-
let $compatible-packages := versions:find-compatible-packages($package-group//package, $exist-version-semver)
28+
let $compatible-packages := versions:get-packages-satisfying-exist-version($package-group//package, $exist-version-semver)
3329
return
3430
if (exists($compatible-packages)) then
3531
let $newest-package := head($compatible-packages)

modules/versions.xqm

Lines changed: 53 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,152 +1,90 @@
11
xquery version "3.1";
22

33
(:~
4-
: A library module for finding packages by version number criteria
4+
: A library module for finding packages by EXPath Package dependency version attributes
5+
: or eXist version
56
:)
67

78
module namespace versions="http://exist-db.org/apps/public-repo/versions";
89

910
import module namespace semver="http://exist-db.org/xquery/semver";
1011

11-
(:~
12-
: Find all packages compatible with a specific version of eXist (or higher)
13-
:)
14-
declare function versions:find-compatible-packages(
15-
$packages as element(package)*,
16-
$exist-version-semver as xs:string
17-
) as element(package)* {
18-
versions:find-compatible-packages($packages, $exist-version-semver, (), (), (), ())
19-
};
2012

2113
(:~
22-
: Find all packages compatible with a version of eXist meeting various version criteria
23-
:
24-
: TODO: find packages with version, semver, or min/max-version attributes to test those conditions - joewiz
14+
: Get all packages satisfying EXPath Package dependency version attributes
2515
:)
26-
declare function versions:find-compatible-packages(
16+
declare function versions:get-packages-satisfying-version-attributes(
2717
$packages as element(package)*,
28-
$exist-version-semver as xs:string,
29-
$version as xs:string?,
18+
$versions as xs:string?,
3019
$semver as xs:string?,
3120
$semver-min as xs:string?,
3221
$semver-max as xs:string?
3322
) as element(package)* {
34-
if ($semver) then
35-
versions:find-version($packages, $semver, $semver)
36-
else if ($version) then
37-
$packages[version = $version]
38-
else if ($semver-min and $semver-max) then
39-
versions:find-version($packages, $semver-min, $semver-max)
40-
else if (exists($exist-version-semver)) then
41-
versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver)
42-
else
43-
()
23+
$packages[
24+
semver:satisfies-expath-package-dependency-versioning-attributes(
25+
./version,
26+
$versions,
27+
$semver,
28+
$semver-min,
29+
$semver-max
30+
)
31+
]
32+
=> versions:sort-packages()
4433
};
4534

4635
(:~
47-
: Find the newest version of packages compatible with a specific version of eXist (or higher)
36+
: Get the newest version of a package satisfying EXPath Package dependency version attributes
4837
:)
49-
declare function versions:find-newest-compatible-package(
50-
$packages as element(package)*,
51-
$exist-version-semver as xs:string
52-
) as element(package)? {
53-
versions:find-newest-compatible-package($packages, $exist-version-semver, (), (), (), ())
54-
};
55-
56-
(:~
57-
: Find the newest version of packages compatible with a version of eXist meeting various version criteria
58-
:)
59-
declare function versions:find-newest-compatible-package(
38+
declare function versions:get-newest-package-satisfying-version-attributes(
6039
$packages as element(package)*,
61-
$exist-version-semver as xs:string,
62-
$version as xs:string?,
40+
$versions as xs:string?,
6341
$semver as xs:string?,
64-
$min-version as xs:string?,
65-
$max-version as xs:string?
42+
$semver-min as xs:string?,
43+
$semver-max as xs:string?
6644
) as element(package)? {
67-
versions:find-compatible-packages($packages, $exist-version-semver, $version, $semver, $min-version, $max-version)
45+
$packages
46+
=> versions:get-packages-satisfying-version-attributes($versions, $semver, $semver-min, $semver-max)
6847
=> head()
6948
};
7049

71-
declare
72-
%private
73-
function versions:find-version($packages as element(package)*, $minVersion as xs:string?, $maxVersion as xs:string?) {
74-
let $minVersion := if ($minVersion) then $minVersion else "0"
75-
let $maxVersion := if ($maxVersion) then $maxVersion else "9999"
76-
return
77-
versions:find-version($packages, $minVersion, $maxVersion, ())
78-
};
79-
80-
declare
81-
%private
82-
function versions:find-version($packages as element(package)*, $minVersion as xs:string, $maxVersion as xs:string, $newest as element()?) {
83-
if (empty($packages)) then
84-
$newest
85-
else
86-
let $package := head($packages)
87-
let $packageVersion := ($package/version, $package/@version)[1]
88-
let $newestVersion := ($newest/version, $newest/@version)[1]
89-
let $newer :=
90-
if (
91-
(
92-
empty($newest) or
93-
semver:ge($packageVersion, $newestVersion, true())
94-
) and
95-
semver:ge($packageVersion, $minVersion, true()) and
96-
semver:le($packageVersion, $maxVersion, true())
97-
) then
98-
$package
99-
else
100-
$newest
101-
return
102-
versions:find-version(tail($packages), $minVersion, $maxVersion, $newer)
103-
};
104-
10550
(:~
106-
: Find packages whose eXist version requirements meet the client's eXist version
51+
: Find all packages compatible with a specific version of eXist (or higher)
10752
:
108-
: @deprecated As of 2.1.3, use the private function versions:find-packages-satisfying-exist-version-requirements#2
53+
: For example, via app.xqm or list.xq, a client may request the subset of a package's
54+
: releases that are compatible with eXist 5.3.0. The function examines each release's
55+
: eXist dependency declarations (if present) and returns all matching packages.
10956
:)
110-
declare function versions:find-packages-satisfying-exist-version-requirements(
111-
$packages as element(package)*,
112-
$exist-version-semver as xs:string,
113-
$min-version as xs:string?,
114-
$max-version as xs:string?
57+
declare function versions:get-packages-satisfying-exist-version(
58+
$packages as element(package)*,
59+
$exist-version as xs:string
11560
) as element(package)* {
116-
versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver)
61+
$packages[
62+
semver:satisfies-expath-package-dependency-versioning-attributes(
63+
$exist-version,
64+
./requires/@versions,
65+
./requires/@semver,
66+
./requires/@semver-min,
67+
./requires/@semver-max
68+
)
69+
]
70+
=> versions:sort-packages()
11771
};
11872

11973
(:~
120-
: Find packages whose eXist version requirements meet the client's eXist version
121-
:
122-
: For example, via app.xqm or list.xq, a client may request the subset of a package's
123-
: releases that are compatible with eXist 5.3.0. The function examines each release's
124-
: eXist dependency declarations (if present) and returns all matching packages.
74+
: Find the newest version of packages compatible with a specific version of eXist (or higher)
12575
:)
126-
declare %private function versions:find-packages-satisfying-exist-version-requirements(
127-
$packages as element(package)*,
76+
declare function versions:get-newest-package-satisfying-exist-version(
77+
$packages as element(package)*,
12878
$exist-version-semver as xs:string
129-
) as element(package)* {
130-
for $package in $packages
131-
let $satisfies-semver-min-requirement :=
132-
if (exists($package/requires/@semver-min)) then
133-
semver:ge-parsed(
134-
semver:parse($exist-version-semver, true()),
135-
semver:resolve-if-expath-package-server-template-else-parse($package/requires/@semver-min, "min", true())
136-
)
137-
else
138-
true()
139-
let $satisfies-semver-max-requirement :=
140-
if (exists($package/requires/@semver-max)) then
141-
semver:lt-parsed(
142-
semver:parse($exist-version-semver, true()),
143-
semver:resolve-if-expath-package-server-template-else-parse($package/requires/@semver-max, "max", true())
144-
)
145-
else
146-
true()
147-
return
148-
if ($satisfies-semver-min-requirement and $satisfies-semver-max-requirement) then
149-
$package
150-
else
151-
()
79+
) as element(package)? {
80+
$packages
81+
=> versions:get-packages-satisfying-exist-version($exist-version-semver)
82+
=> head()
83+
};
84+
85+
(:~
86+
: Sort packages by version
87+
:)
88+
declare function versions:sort-packages($packages as element(package)*) {
89+
semver:sort($packages, function($package) { $package/version }, true())
15290
};

0 commit comments

Comments
 (0)