diff --git a/src/ns.sh b/src/ns.sh index 947ec91..0cca87d 100644 --- a/src/ns.sh +++ b/src/ns.sh @@ -23,6 +23,38 @@ __PKGSH_INC_NS=1 +## +# Import a package as a fully-qualified namespace +# +# N.B.: This should be used instead of `source` to import a package to +# ensure that any additional needed processing is performed; otherwise, +# while it will still run, it may not work as expected with pkgsh. +# +# The package will be sourced and all functions may be accessed by using the +# fully-qualified name. +# +# For example, given `import-fqns foo::bar`, you would access function `baz` +# in that namespace as the full `foo::bar::baz`. +# +# Packages imported using this method will be available to all sourced +# files in the current shell (and for subshells if there are any exports); +# this is intended to be used internally for package loading prior to +# additional processing; it is analgous to `source`. +# +import-fqns() +{ + local -r ns="$1" + local -r pkgpath="${ns//:://}.sh" + + test -f "$pkgpath" -a -r "$pkgpath" || { + echo "error: \`$ns' is not a package" >&2 + return 1 + } + + source "$pkgpath" +} + + ## # Apply to current namespace # diff --git a/test/fixture/pkg-stub.sh b/test/fixture/pkg-stub.sh new file mode 100644 index 0000000..ca9efc5 --- /dev/null +++ b/test/fixture/pkg-stub.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Stub package for testing +# +# Copyright (C) 2014 Mike Gerwitz +# +# This file is part of pkgsh. +# +# pkgsh is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +## + + +test::fixture::pkg-stub::try() +{ + echo "pkg-stub $@" +} diff --git a/test/ns/test-import-fqns.sh b/test/ns/test-import-fqns.sh new file mode 100644 index 0000000..5e9be70 --- /dev/null +++ b/test/ns/test-import-fqns.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# Tests importing a fully qualified namespace +# +# Copyright (C) 2014 Mike Gerwitz +# +# This file is part of pkgsh. +# +# pkgsh is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# This is equalent to `source`ing a package, except that it may perform +# additional processing that is required to properly load the package. +## + +source src/ns.sh + + +test-ok() +{ + # this should auto-load test/fixture/pkg-stub.sh + import-fqns test::fixture::pkg-stub + + # we should now have access to the functions as if we sourced it + result="$( test::fixture::pkg-stub::try foo )" + assert "$result" == "pkg-stub foo" +} + + +test-bad() +{ + local -i ok=0 + local -r badns=test::does::not::exist + + # this package does not exist; should error + result="$( import-fqns "$badns" 2>&1 )" || { + # good; this is what we want, but we need to handle this failure, since + # -e is set + ok=1 + } + + assert "$ok" -eq 1 + + # ensure that an error is output + [[ "$result" =~ error ]] || assert -z "missing 'error'" + [[ "$result" =~ "$badns" ]] || assert -z "missing ns name in error" +} + + +test-ok +test-bad +