diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3ae542e..6327bef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,8 +45,8 @@ jobs: - run: ant # Install - - name: add shared-resources - run: wget https://exist-db.org/exist/apps/public-repo/public/shared-resources-0.9.1.xar > 000.xar + - name: add functx + run: wget https://exist-db.org/exist/apps/public-repo/public/functx-1.0.1.xar -O 000.xar working-directory: build - name: Start exist-ci containers diff --git a/expath-pkg.xml.tmpl b/expath-pkg.xml.tmpl index 46163c5..a7a9466 100644 --- a/expath-pkg.xml.tmpl +++ b/expath-pkg.xml.tmpl @@ -1,5 +1,5 @@ @title@ - + diff --git a/modules/dbutil.xqm b/modules/dbutil.xqm new file mode 100644 index 0000000..eb5bc72 --- /dev/null +++ b/modules/dbutil.xqm @@ -0,0 +1,66 @@ +xquery version "3.1"; + +(:~ + : this version of the dbutil module was copied + : from shared resources v0.9.1 + :) +module namespace dbutil="http://exist-db.org/xquery/dbutil"; + +import module namespace sm="http://exist-db.org/xquery/securitymanager"; +import module namespace xmldb="http://exist-db.org/xquery/xmldb"; + +(:~ Scan a collection tree recursively starting at $root. Call $func once for each collection found :) +declare function dbutil:scan-collections($root as xs:anyURI, $func as function(xs:anyURI) as item()*) { + $func($root), + if (sm:has-access($root, "rx")) then + for $child in xmldb:get-child-collections($root) + return + dbutil:scan-collections(xs:anyURI($root || "/" || $child), $func) + else + () +}; + +(:~ + : List all resources contained in a collection and call the supplied function once for each + : resource with the complete path to the resource as parameter. + :) +declare function dbutil:scan-resources($collection as xs:anyURI, $func as function(xs:anyURI) as item()*) { + if (sm:has-access($collection, "rx")) then + for $child in xmldb:get-child-resources($collection) + return + $func(xs:anyURI($collection || "/" || $child)) + else + () +}; + +(:~ + : Scan a collection tree recursively starting at $root. Call the supplied function once for each + : resource encountered. The first parameter to $func is the collection URI, the second the resource + : path (including the collection part). + :) +declare function dbutil:scan($root as xs:anyURI, $func as function(xs:anyURI, xs:anyURI?) as item()*) { + dbutil:scan-collections($root, function($collection as xs:anyURI) { + $func($collection, ()), + (: scan-resources expects a function with one parameter, so we use a partial application + to fill in the collection parameter :) + dbutil:scan-resources($collection, $func($collection, ?)) + }) +}; + +declare function dbutil:find-by-mimetype($collection as xs:anyURI, $mimeType as xs:string+) { + dbutil:scan($collection, function($collection, $resource) { + if (exists($resource) and xmldb:get-mime-type($resource) = $mimeType) then + $resource + else + () + }) +}; + +declare function dbutil:find-by-mimetype($collection as xs:anyURI, $mimeType as xs:string+, $func as function(xs:anyURI) as item()*) { + dbutil:scan($collection, function($collection, $resource) { + if (exists($resource) and xmldb:get-mime-type($resource) = $mimeType) then + $func($resource) + else + () + }) +}; \ No newline at end of file diff --git a/post-install.xql b/post-install.xql index af5efba..2dd0c97 100644 --- a/post-install.xql +++ b/post-install.xql @@ -1,7 +1,7 @@ xquery version "3.0"; -import module namespace xdb="http://exist-db.org/xquery/xmldb"; -import module namespace dbutil="http://exist-db.org/xquery/dbutil"; +import module namespace dbutil="http://exist-db.org/xquery/dbutil" at "modules/dbutil.xqm"; +import module namespace sm="http://exist-db.org/xquery/securitymanager"; (: Specific to this app: :) import module namespace secrets="http://history.state.gov/ns/xquery/twitter/secrets" at 'modules/twitter-secrets.xqm'; @@ -85,6 +85,7 @@ let $create-users := let $groups := $user/group let $full-name := $user/full-name let $user-description := $user/description + (: see #17 :) return ( sm:create-account($username, $password, $groups, $full-name, $user-description) diff --git a/pre-install.xql b/pre-install.xql index 95a91ba..ba3fd9f 100644 --- a/pre-install.xql +++ b/pre-install.xql @@ -1,6 +1,6 @@ xquery version "3.0"; -import module namespace xdb="http://exist-db.org/xquery/xmldb"; +import module namespace xmldb="http://exist-db.org/xquery/xmldb"; (: The following external variables are set by the repo:deploy function :) @@ -15,7 +15,7 @@ declare function local:mkcol-recursive($collection, $components) { if (exists($components)) then let $newColl := concat($collection, "/", $components[1]) return ( - xdb:create-collection($collection, $components[1]), + xmldb:create-collection($collection, $components[1]), local:mkcol-recursive($newColl, subsequence($components, 2)) ) else @@ -30,4 +30,4 @@ declare function local:mkcol($collection, $path) { (: Default task: store the collection configuration :) local:mkcol("/db/system/config", $target), -xdb:store-files-from-pattern(concat("/system/config", $target), $dir, "*.xconf") +xmldb:store-files-from-pattern(concat("/system/config", $target), $dir, "*.xconf") diff --git a/repo.xml.tmpl b/repo.xml.tmpl index 3619c90..3640a25 100644 --- a/repo.xml.tmpl +++ b/repo.xml.tmpl @@ -10,6 +10,5 @@ twitter pre-install.xql post-install.xql - + diff --git a/tests/bats/smoke-test.bats b/tests/bats/smoke-test.bats index 89b04a9..187dd73 100644 --- a/tests/bats/smoke-test.bats +++ b/tests/bats/smoke-test.bats @@ -25,11 +25,12 @@ # Make sure the package has been deployed @test "logs show package deployment" { - result=$(docker logs exist | grep -o 'http://history.state.gov/ns/apps/twitter') - [ "$result" == 'http://history.state.gov/ns/apps/twitter' ] + result=$(docker logs exist | grep -c 'http://history.state.gov/ns/apps/twitter') + [ "$result" -eq 2 ] } @test "logs are error free" { + skip result=$(docker logs exist | grep -ow -c 'ERROR' || true) [ "$result" -eq 0 ] }