Skip to content

Commit

Permalink
[parsing] Add support for remote packages
Browse files Browse the repository at this point in the history
TODO needs mutex for const function
  • Loading branch information
jwnimmer-tri committed Mar 16, 2023
1 parent 149b090 commit 7cebdc4
Show file tree
Hide file tree
Showing 12 changed files with 743 additions and 84 deletions.
1 change: 1 addition & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ install(
"//geometry:install",
"//lcmtypes:install",
"//manipulation/models:install_data",
"//multibody/parsing:install",
"//setup:install",
"//tools/install/libdrake:install",
"//tools/workspace:install_external_packages",
Expand Down
15 changes: 13 additions & 2 deletions bindings/pydrake/multibody/parsing_py.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,25 @@ PYBIND11_MODULE(parsing, m) {
using Class = PackageMap;
constexpr auto& cls_doc = doc.PackageMap;
py::class_<Class> cls(m, "PackageMap", cls_doc.doc);
{
using Nested = PackageMap::RemotePackageParams;
constexpr auto& nested_doc = cls_doc.RemotePackageParams;
py::class_<Nested> nested(cls, "RemotePackageParams", nested_doc.doc);
nested.def(ParamInit<Nested>());
DefAttributesUsingSerialize(&nested, nested_doc);
DefReprUsingSerialize(&nested);
DefCopyAndDeepCopy(&nested);
}
cls // BR
.def(py::init<>(), cls_doc.ctor.doc)
.def(py::init<const Class&>(), py::arg("other"), "Copy constructor")
.def("Add", &Class::Add, py::arg("package_name"),
py::arg("package_path"), cls_doc.Add.doc)
.def("AddMap", &Class::AddMap, py::arg("other_map"), cls_doc.AddMap.doc)
.def("AddPackageXml", &Class::AddPackageXml, py::arg("filename"),
cls_doc.AddPackageXml.doc)
.def("AddRemote", &Class::AddRemote, py::arg("package_name"),
py::arg("params"))
.def("Contains", &Class::Contains, py::arg("package_name"),
cls_doc.Contains.doc)
.def("Remove", &Class::Remove, py::arg("package_name"),
Expand All @@ -53,8 +66,6 @@ PYBIND11_MODULE(parsing, m) {
return self.GetPath(package_name);
},
py::arg("package_name"), cls_doc.GetPath.doc)
.def("AddPackageXml", &Class::AddPackageXml, py::arg("filename"),
cls_doc.AddPackageXml.doc)
.def("PopulateFromFolder", &Class::PopulateFromFolder, py::arg("path"),
cls_doc.PopulateFromFolder.doc)
.def("PopulateFromEnvironment", &Class::PopulateFromEnvironment,
Expand Down
10 changes: 10 additions & 0 deletions bindings/pydrake/multibody/test/parsing_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,16 @@ def test_package_map(self):
dut.PopulateFromEnvironment(environment_variable='TEST_TMPDIR')
dut.PopulateFromFolder(path=tmpdir)

# Simple coverage for remote packages (and their Params).
params = PackageMap.RemotePackageParams()
params.urls = ["file:///tmp/does-not-exist.zip"]
params.sha256 = "0" * 64
params.archive_type = "zip"
params.strip_prefix = "prefix"
dut.AddRemote(package_name="remote", params=params)
with self.assertRaisesRegex(RuntimeError, "downloader.*error"):
dut.GetPath("remote")

def test_parser_file(self):
"""Calls every combination of arguments for the Parser methods which
use a file_name (not contents) and inspects their return type.
Expand Down
31 changes: 30 additions & 1 deletion multibody/parsing/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ load(
"drake_py_library",
"drake_py_unittest",
)
load("@drake//tools/install:install.bzl", "install_files")
load("//tools/lint:lint.bzl", "add_lint_tests")
load("@drake//tools/workspace:forward_files.bzl", "forward_files")
load(
Expand Down Expand Up @@ -58,15 +59,22 @@ drake_cc_library(
srcs = ["package_map.cc"],
hdrs = ["package_map.h"],
data = [
":package_downloader.py",
"//:package.xml",
"@models_internal//:package.xml",
],
visibility = ["//visibility:public"],
interface_deps = [
"//common:essential",
"//common:name_value",
],
deps = [
"//common",
"//common:find_cache",
"//common:find_resource",
"//common:find_runfiles",
"//common:scope_exit",
"//common:unused",
"//common/yaml",
"@tinyxml2_internal//:tinyxml2",
],
)
Expand Down Expand Up @@ -619,6 +627,20 @@ drake_cc_googletest(
],
)

drake_cc_googletest(
name = "package_map_remote_test",
data = [
"test/package_map_test_packages/compressed.zip",
],
deps = [
":package_map",
"//common:find_cache",
"//common:find_resource",
"//common:scope_exit",
"//common/test_utilities:expect_throws_message",
],
)

drake_cc_googletest(
name = "drake_manifest_resolution_test",
data = [
Expand Down Expand Up @@ -667,4 +689,11 @@ drake_cc_googletest(
],
)

install_files(
name = "install",
dest = "share/drake/multibody/parsing",
files = ["package_downloader.py"],
visibility = ["//visibility:public"],
)

add_lint_tests()
Loading

0 comments on commit 7cebdc4

Please sign in to comment.