Skip to content

Commit 3334c29

Browse files
urdf, sdf: Use sealed XML reflection bits
Clean up tests.
1 parent d25cfce commit 3334c29

File tree

7 files changed

+291
-282
lines changed

7 files changed

+291
-282
lines changed

src/urdf_parser_py/__init__.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
Python implementation of the URDF parser.
3+
"""
4+
5+
import functools
6+
import warnings
7+
8+
9+
class _NowPrivateDescriptor(object):
10+
# Implements the descriptor interface to warn about deprecated access.
11+
def __init__(self, private):
12+
self._private = private
13+
self._old_public = self._private.lstrip('_')
14+
self.__doc__ = "Deprecated propery '{}'".format(self._old_public)
15+
16+
def _warn(self):
17+
warnings.warn(
18+
"'{}' is deprecated, and will be removed in future releases."
19+
.format(self._old_public),
20+
category=DeprecationWarning, stacklevel=2)
21+
22+
def __get__(self, obj, objtype):
23+
self._warn()
24+
if obj is None:
25+
return getattr(objtype, self._private)
26+
else:
27+
return getattr(obj, self._private)
28+
29+
def __set__(self, obj, value):
30+
self._warn()
31+
setattr(obj, self._private, value)
32+
33+
def __del__(self, obj):
34+
self._warn()
35+
delattr(obj, self._private)
36+
37+
38+
def _now_private_property(private):
39+
# Indicates that a property (or method) is now private.
40+
return _NowPrivateDescriptor(private)

src/urdf_parser_py/sdf.py

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
from urdf_parser_py.xml_reflection.basics import *
2-
import urdf_parser_py.xml_reflection as xmlr
1+
from urdf_parser_py import _now_private_property
2+
import urdf_parser_py._xml_reflection as _xmlr
33

4-
# What is the scope of plugins? Model, World, Sensor?
4+
_xmlr.start_namespace('sdf')
55

6-
xmlr.start_namespace('sdf')
76

8-
9-
class Pose(xmlr.Object):
7+
class Pose(_xmlr.Object):
108
def __init__(self, vec=None, extra=None):
119
self.xyz = None
1210
self.rpy = None
@@ -32,37 +30,37 @@ def as_vec(self):
3230
rpy = self.rpy if self.rpy else [0, 0, 0]
3331
return xyz + rpy
3432

35-
def read_xml(self, node):
33+
def _read_xml(self, node):
3634
# Better way to do this? Define type?
37-
vec = get_type('vector6').read_xml(node)
38-
self.load_vec(vec)
35+
vec = _xmlr.get_type('vector6')._read_xml(node)
36+
self.from_vec(vec)
3937

40-
def write_xml(self, node):
38+
def _write_xml(self, node):
4139
vec = self.as_vec()
42-
get_type('vector6').write_xml(node, vec)
40+
_xmlr.get_type('vector6')._write_xml(node, vec)
4341

44-
def check_valid(self):
42+
def _check_valid(self):
4543
assert self.xyz is not None or self.rpy is not None
4644

4745

48-
name_attribute = xmlr.Attribute('name', str)
49-
pose_element = xmlr.Element('pose', Pose, False)
46+
_name_attribute = _xmlr.Attribute('name', str)
47+
_pose_element = _xmlr.Element('pose', Pose, required=False)
5048

5149

52-
class Entity(xmlr.Object):
50+
class Entity(_xmlr.Object):
5351
def __init__(self, name=None, pose=None):
5452
self.name = name
5553
self.pose = pose
5654

5755

58-
xmlr.reflect(Entity, params=[
59-
name_attribute,
60-
pose_element
56+
_xmlr.reflect(Entity, params=[
57+
_name_attribute,
58+
_pose_element
6159
])
6260

6361

64-
class Inertia(xmlr.Object):
65-
KEYS = ['ixx', 'ixy', 'ixz', 'iyy', 'iyz', 'izz']
62+
class Inertia(_xmlr.Object):
63+
_KEYS = ['ixx', 'ixy', 'ixz', 'iyy', 'iyz', 'izz']
6664

6765
def __init__(self, ixx=0.0, ixy=0.0, ixz=0.0, iyy=0.0, iyz=0.0, izz=0.0):
6866
self.ixx = ixx
@@ -79,24 +77,21 @@ def to_matrix(self):
7977
[self.ixz, self.iyz, self.izz]]
8078

8179

82-
xmlr.reflect(Inertia,
83-
params=[xmlr.Element(key, float) for key in Inertia.KEYS])
84-
85-
# Pretty much copy-paste... Better method?
86-
# Use multiple inheritance to separate the objects out so they are unique?
80+
_xmlr.reflect(Inertia,
81+
params=[_xmlr.Element(key, float) for key in Inertia._KEYS])
8782

8883

89-
class Inertial(xmlr.Object):
84+
class Inertial(_xmlr.Object):
9085
def __init__(self, mass=0.0, inertia=None, pose=None):
9186
self.mass = mass
9287
self.inertia = inertia
9388
self.pose = pose
9489

9590

96-
xmlr.reflect(Inertial, params=[
97-
xmlr.Element('mass', float),
98-
xmlr.Element('inertia', Inertia),
99-
pose_element
91+
_xmlr.reflect(Inertial, params=[
92+
_xmlr.Element('mass', float),
93+
_xmlr.Element('inertia', Inertia),
94+
_pose_element
10095
])
10196

10297

@@ -107,11 +102,11 @@ def __init__(self, name=None, pose=None, inertial=None, kinematic=False):
107102
self.kinematic = kinematic
108103

109104

110-
xmlr.reflect(Link, parent_cls=Entity, params=[
111-
xmlr.Element('inertial', Inertial),
112-
xmlr.Attribute('kinematic', bool, False),
113-
xmlr.AggregateElement('visual', Visual, var='visuals'),
114-
xmlr.AggregateElement('collision', Collision, var='collisions')
105+
_xmlr.reflect(Link, parent_cls=Entity, params=[
106+
_xmlr.Element('inertial', Inertial),
107+
_xmlr.Attribute('kinematic', bool, False),
108+
_xmlr.AggregateElement('visual', Visual, var='visuals'),
109+
_xmlr.AggregateElement('collision', Collision, var='collisions')
115110
])
116111

117112

@@ -123,10 +118,10 @@ def __init__(self, name=None, pose=None):
123118
self.plugins = []
124119

125120

126-
xmlr.reflect(Model, parent_cls=Entity, params=[
127-
xmlr.AggregateElement('link', Link, var='links'),
128-
xmlr.AggregateElement('joint', Joint, var='joints'),
129-
xmlr.AggregateElement('plugin', Plugin, var='plugins')
121+
_xmlr.reflect(Model, parent_cls=Entity, params=[
122+
_xmlr.AggregateElement('link', Link, var='links'),
123+
_xmlr.AggregateElement('joint', Joint, var='joints'),
124+
_xmlr.AggregateElement('plugin', Plugin, var='plugins')
130125
])
131126

132-
xmlr.end_namespace('sdf')
127+
_xmlr.end_namespace('sdf')

0 commit comments

Comments
 (0)