From 88ec37531a22b57402fad1b0ab47a7c543c07d52 Mon Sep 17 00:00:00 2001 From: Dmitry Rozhkov Date: Fri, 7 Apr 2017 14:33:26 +0300 Subject: [PATCH] resource-retriever: backport python3 compatibility patch The added patch makes resource-retriever compatible with python3. Also drop python-urlgrabber which resource-retriever used to depend on. Signed-off-by: Dmitry Rozhkov --- .../python/python-urlgrabber_3.9.1.bb | 15 -- .../0001-Python3-compatibility-10.patch | 141 ++++++++++++++++++ .../resource-retriever_1.11.7.bb | 6 +- 3 files changed, 145 insertions(+), 17 deletions(-) delete mode 100644 recipes-devtools/python/python-urlgrabber_3.9.1.bb create mode 100644 recipes-ros/resource-retriever/resource-retriever/0001-Python3-compatibility-10.patch diff --git a/recipes-devtools/python/python-urlgrabber_3.9.1.bb b/recipes-devtools/python/python-urlgrabber_3.9.1.bb deleted file mode 100644 index aeb792d..0000000 --- a/recipes-devtools/python/python-urlgrabber_3.9.1.bb +++ /dev/null @@ -1,15 +0,0 @@ -DESCRIPTION = "A high-level cross-protocol url-grabber" -SECTION = "devel/python" -LICENSE = "LGPL-2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=68ad62c64cc6c620126241fd429e68fe" -SRCNAME = "urlgrabber" - -DEPENDS = "python-pycurl-native python-pycurl" - -SRC_URI = "https://pypi.python.org/packages/source/u/${SRCNAME}/${SRCNAME}-${PV}.tar.gz" -SRC_URI[md5sum] = "00c8359bf71062d0946bacea521f80b4" -SRC_URI[sha256sum] = "4437076c8708e5754ea04540e46c7f4f233734ee3590bb8a96389264fb0650d0" - -S = "${WORKDIR}/${SRCNAME}-${PV}" - -inherit distutils diff --git a/recipes-ros/resource-retriever/resource-retriever/0001-Python3-compatibility-10.patch b/recipes-ros/resource-retriever/resource-retriever/0001-Python3-compatibility-10.patch new file mode 100644 index 0000000..eca93c2 --- /dev/null +++ b/recipes-ros/resource-retriever/resource-retriever/0001-Python3-compatibility-10.patch @@ -0,0 +1,141 @@ +From 2105ad5c201bacd9860ad21fa3b4de96eed0e124 Mon Sep 17 00:00:00 2001 +From: Ruben Smits +Date: Mon, 13 Feb 2017 18:02:23 +0100 +Subject: [PATCH] Python3 compatibility (#10) + +* Replace urlgrabber with urllib[2] + +As urlgrabber is not supported for Python 3 replace it with either the built-in urllib (Python 2) or urllib2 (Python 3) + +* Use rospkg instead of system call for rospack + +* Add test for python functionality + +* Fix rospkg dependency definition + +Upstream-Status: Backported +--- + package.xml | 2 +- + src/resource_retriever/__init__.py | 26 ++++++++++++++------------ + test/CMakeLists.txt | 2 ++ + test/test.py | 36 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 53 insertions(+), 13 deletions(-) + create mode 100644 test/test.py + +diff --git a/package.xml b/package.xml +index fc1d789..4b447dc 100644 +--- a/package.xml ++++ b/package.xml +@@ -28,6 +28,6 @@ + curl + rosconsole + roslib +- python-urlgrabber ++ python-rospkg + + +diff --git a/src/resource_retriever/__init__.py b/src/resource_retriever/__init__.py +index d92baca..747a63f 100644 +--- a/src/resource_retriever/__init__.py ++++ b/src/resource_retriever/__init__.py +@@ -33,17 +33,16 @@ + + import roslib; roslib.load_manifest('resource_retriever') + import subprocess +-import urlgrabber, string ++import rospkg ++try: ++ from urllib.request import urlopen ++ from urllib.error import URLError ++except ImportError: ++ from urllib2 import urlopen ++ from urllib2 import URLError + + PACKAGE_PREFIX = 'package://' +- +-def rospack_find(package): +- process = subprocess.Popen(['rospack', 'find', package], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +- (stdout, stderr) = process.communicate() +- if len(stderr) > 0: +- raise Exception(stderr) +- else: +- return string.strip(stdout) ++r = rospkg.RosPack() + + def get_filename(url, use_protocol=True ): + mod_url = url +@@ -55,7 +54,7 @@ def get_filename(url, use_protocol=True ): + + package = mod_url[0:pos] + mod_url = mod_url[pos:] +- package_path = rospack_find(package) ++ package_path = r.get_path(package) + + if use_protocol: + protocol = "file://" +@@ -65,5 +64,8 @@ def get_filename(url, use_protocol=True ): + return mod_url + + def get(url): +- return urlgrabber.urlopen(get_filename(url)) +- ++ filename = get_filename(url) ++ try: ++ return urlopen(filename).read() ++ except URLError: ++ raise Exception("Invalid URL: {}".format(filename)) +diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt +index f133bf6..e311f59 100644 +--- a/test/CMakeLists.txt ++++ b/test/CMakeLists.txt +@@ -2,3 +2,5 @@ set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) + + catkin_add_gtest(${PROJECT_NAME}_utest test.cpp) + target_link_libraries(${PROJECT_NAME}_utest ${PROJECT_NAME}) ++ ++catkin_add_nosetests(test.py) +diff --git a/test/test.py b/test/test.py +new file mode 100644 +index 0000000..ce1843f +--- /dev/null ++++ b/test/test.py +@@ -0,0 +1,36 @@ ++import resource_retriever as r ++ ++import os ++import rospkg ++from nose.tools import raises ++ ++rospack = rospkg.RosPack() ++ ++def test_get_by_package(): ++ res = r.get("package://resource_retriever/test/test.txt") ++ assert len(res) == 1 ++ assert res == 'A'.encode() ++ ++def test_get_large_file(): ++ res_path = os.path.join(rospack.get_path("resource_retriever"), "test/large_file.dat") ++ with open(res_path, 'w') as f: ++ for _ in range(1024*1024*50): ++ f.write('A') ++ res = r.get("package://resource_retriever/test/large_file.dat") ++ assert len(res) == 1024*1024*50 ++ ++def test_http(): ++ res = r.get("http://packages.ros.org/ros.key") ++ assert len(res) > 0 ++ ++@raises(Exception) ++def test_invalid_file(): ++ r.get("file://fail") ++ ++@raises(Exception) ++def test_no_file(): ++ r.get("package://roscpp") ++ ++@raises(rospkg.common.ResourceNotFound) ++def test_invalid_package(): ++ r.get("package://invalid_package_blah/test.xml") +-- +2.9.3 + diff --git a/recipes-ros/resource-retriever/resource-retriever_1.11.7.bb b/recipes-ros/resource-retriever/resource-retriever_1.11.7.bb index e65a3b9..94e49ea 100644 --- a/recipes-ros/resource-retriever/resource-retriever_1.11.7.bb +++ b/recipes-ros/resource-retriever/resource-retriever_1.11.7.bb @@ -6,7 +6,9 @@ LIC_FILES_CHKSUM = "file://package.xml;beginline=16;endline=16;md5=d566ef916e9de DEPENDS = "curl rosconsole roslib" -SRC_URI = "https://github.com/ros/${ROS_SPN}/archive/${PV}.tar.gz;downloadfilename=${ROS_SP}.tar.gz" +SRC_URI = "https://github.com/ros/${ROS_SPN}/archive/${PV}.tar.gz;downloadfilename=${ROS_SP}.tar.gz \ + file://0001-Python3-compatibility-10.patch \ + " SRC_URI[md5sum] = "1dffd39475ebe70b14390889d3b4b3c4" SRC_URI[sha256sum] = "5f00e95c5a086973efa25e26da9cee8f4b10b446fbb5eb6694b32b2201539866" @@ -14,4 +16,4 @@ S = "${WORKDIR}/${ROS_SP}" inherit catkin -RDEPENDS_${PN} = "python-urlgrabber" +RDEPENDS_${PN} = "${PYTHON_PN}-rospkg"