Skip to content

Commit f40d2d0

Browse files
committed
Cut version 0.3.2 for release to PyPI.
* (M) pyangbind/lib/* - update files to fix PEP8 compliance issues. * (M) setup.py - update version. * (M) tests/* - update files for PEP8 compliance.
1 parent 5c95949 commit f40d2d0

20 files changed

Lines changed: 211 additions & 141 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ dist/*
66
tests/pyvirtualenv
77
dev/*
88
tmp/*
9+
*.PEP8-ERRORS

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,6 @@
4040
WARNING).
4141
* Adds support for carrying the namespace and defined module in a class.
4242
* Adds a metadata element to carry JSON metadata that was received.
43+
44+
16-03-2016 - 0.3.2
45+
* Fixes an issue relating to to identity value inheritance.

pyangbind/lib/serialise.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@
3232

3333
import sys
3434

35+
3536
class pybindJSONIOError(Exception):
3637
pass
3738

3839

3940
class pybindJSONUpdateError(Exception):
4041
pass
4142

43+
4244
class pybindJSONDecodeError(Exception):
4345
pass
4446

@@ -86,7 +88,7 @@ def default(self, obj, mode="default"):
8688

8789
if isinstance(obj, dict):
8890
ndict = {}
89-
for k,v in obj.iteritems():
91+
for k, v in obj.iteritems():
9092
ndict[k] = self.default(v, mode=mode)
9193
return ndict
9294

@@ -190,9 +192,9 @@ def default(self, obj, mode="default"):
190192

191193
return [self.default(i) for i in obj]
192194

193-
194195
raise AttributeError("Unmapped type: %s" % original_yang_type)
195196

197+
196198
class pybindJSONDecoder(object):
197199
@staticmethod
198200
def load_json(d, parent, yang_base, obj=None, path_helper=None,
@@ -231,21 +233,23 @@ def load_json(d, parent, yang_base, obj=None, path_helper=None,
231233
for elem in chobj._pyangbind_elements:
232234
unsetchildelem = getattr(chobj, "_unset_%s" % elem)
233235
unsetchildelem()
234-
pybindJSONDecoder.load_json(d[key], chobj, yang_base, obj=chobj, path_helper=path_helper)
236+
pybindJSONDecoder.load_json(d[key], chobj, yang_base, obj=chobj,
237+
path_helper=path_helper)
235238
set_via_stdmethod = False
236239
elif pybind_attr in ["YANGListType", "list"]:
237240
# we need to add each key to the list and then skip a level in the
238241
# JSON hierarchy
239242
list_obj = getattr(obj, safe_name(key), None)
240243
if list_obj is None:
241-
raise pybindJSONDecodeError("Could not load list object with name %s" % key)
244+
raise pybindJSONDecodeError("Could not load list object " +
245+
"with name %s" % key)
242246
ordered_list = getattr(list_obj, "_ordered", None)
243247
if ordered_list:
244248
# Put keys in order:
245249
okeys = []
246250
kdict = {}
247-
for k,v in d[key].iteritems():
248-
if not "__yang_order" in v:
251+
for k, v in d[key].iteritems():
252+
if "__yang_order" not in v:
249253
# Element is not specified in terms of order, so
250254
# push to a list that keeps this order
251255
okeys.append(k)
@@ -264,7 +268,8 @@ def load_json(d, parent, yang_base, obj=None, path_helper=None,
264268
if child_key not in chobj:
265269
chobj.add(child_key)
266270
parent = chobj[child_key]
267-
pybindJSONDecoder.load_json(d[key][child_key], parent, yang_base, obj=parent, path_helper=path_helper)
271+
pybindJSONDecoder.load_json(d[key][child_key], parent, yang_base,
272+
obj=parent, path_helper=path_helper)
268273
set_via_stdmethod = False
269274
if overwrite:
270275
for child_key in chobj:
@@ -305,8 +310,8 @@ def load_json(d, parent, yang_base, obj=None, path_helper=None,
305310
def check_metadata_add(key, data, obj):
306311
keys = [unicode(k) for k in data]
307312
if ("@" + key) in keys:
308-
for k,v in data["@" + key].iteritems():
309-
obj._add_metadata(k,v)
313+
for k, v in data["@" + key].iteritems():
314+
obj._add_metadata(k, v)
310315

311316
@staticmethod
312317
def load_ietf_json(d, parent, yang_base, obj=None, path_helper=None,
@@ -340,8 +345,8 @@ def load_ietf_json(d, parent, yang_base, obj=None, path_helper=None,
340345

341346
if key == "@":
342347
# Handle whole container metadata object
343-
for k,v in d[key].iteritems():
344-
obj._add_metadata(k,v)
348+
for k, v in d[key].iteritems():
349+
obj._add_metadata(k, v)
345350
continue
346351
elif "@" in key:
347352
# Don't handle metadata elements, each element
@@ -356,7 +361,9 @@ def load_ietf_json(d, parent, yang_base, obj=None, path_helper=None,
356361
if attr_get is None:
357362
raise AttributeError("Invalid attribute specified (%s)" % ykey)
358363
pybindJSONDecoder.check_metadata_add(key, d, attr_get())
359-
pybindJSONDecoder.load_ietf_json(d[key], None, None, obj=attr_get(), path_helper=path_helper, extmethods=extmethods, overwrite=overwrite)
364+
pybindJSONDecoder.load_ietf_json(d[key], None, None, obj=attr_get(),
365+
path_helper=path_helper, extmethods=extmethods,
366+
overwrite=overwrite)
360367
elif isinstance(d[key], list):
361368
for elem in d[key]:
362369
# if this is a list, then this is a YANG list
@@ -372,13 +379,15 @@ def load_ietf_json(d, parent, yang_base, obj=None, path_helper=None,
372379
nobj = this_attr[k]
373380
elif " " in this_attr._keyval:
374381
kwargs = {}
375-
for pkv,ykv in zip(this_attr._keyval.split(" "), this_attr._yang_keys.split(" ")):
382+
for pkv, ykv in zip(this_attr._keyval.split(" "),
383+
this_attr._yang_keys.split(" ")):
376384
kwargs[pkv] = elem[ykv]
377385
nobj = this_attr.add(**kwargs)
378-
#pybindJSONDecoder.load_ietf_json(elem, None, None, obj=nobj, path_helper=path_helper, extmethods=extmethods, overwrite=overwrite)
379386
else:
380387
nobj = this_attr.add(elem[this_attr._yang_keys])
381-
pybindJSONDecoder.load_ietf_json(elem, None, None, obj=nobj, path_helper=path_helper, extmethods=extmethods, overwrite=overwrite)
388+
pybindJSONDecoder.load_ietf_json(elem, None, None, obj=nobj,
389+
path_helper=path_helper, extmethods=extmethods,
390+
overwrite=overwrite)
382391
pybindJSONDecoder.check_metadata_add(key, d, nobj)
383392
else:
384393
std_method_set = True
@@ -396,11 +405,13 @@ def load_ietf_json(d, parent, yang_base, obj=None, path_helper=None,
396405
else:
397406
set_method = getattr(obj, "_set_%s" % safe_name(ykey), None)
398407
if set_method is None:
399-
raise AttributeError("Invalid attribute specified in JSON - %s" % (ykey))
408+
raise AttributeError("Invalid attribute specified in JSON - %s"
409+
% (ykey))
400410
set_method(d[key])
401411
pybindJSONDecoder.check_metadata_add(key, d, get_method())
402412
return obj
403413

414+
404415
class pybindIETFJSONEncoder(pybindJSONEncoder):
405416
@staticmethod
406417
def generate_element(obj, parent_namespace=None, flt=False):
@@ -415,18 +426,21 @@ def generate_element(obj, parent_namespace=None, flt=False):
415426
for element_name in obj._pyangbind_elements:
416427
element = getattr(obj, element_name, None)
417428
yang_name = getattr(element, "yang_name", None)
418-
yname = yang_name() if not yang_name is None else element_name
429+
yname = yang_name() if yang_name is not None else element_name
419430

420431
if not element._namespace == parent_namespace:
421432
# if the namespace is different, then precede with the module
422433
# name as per spec.
423434
yname = "%s:%s" % (element._defining_module, yname)
424435

425436
generated_by = getattr(element, "_pybind_generated_by", None)
426-
if generated_by == "container":
427-
d[yname] = pybindIETFJSONEncoder.generate_element(element, parent_namespace=element._namespace, flt=flt)
437+
if generated_by == "container":
438+
d[yname] = pybindIETFJSONEncoder.generate_element(element,
439+
parent_namespace=element._namespace, flt=flt)
428440
elif generated_by == "YANGListType":
429-
d[yname] = [pybindIETFJSONEncoder.generate_element(i, parent_namespace=element._namespace, flt=flt) for i in element._members.itervalues()]
441+
d[yname] = [pybindIETFJSONEncoder.generate_element(i,
442+
parent_namespace=element._namespace, flt=flt)
443+
for i in element._members.itervalues()]
430444
else:
431445
if flt and element._changed():
432446
d[yname] = element
@@ -435,7 +449,8 @@ def generate_element(obj, parent_namespace=None, flt=False):
435449
return d
436450

437451
def encode(self, obj):
438-
return json.JSONEncoder.encode(self, self._preprocess_element(obj, mode="ietf"))
452+
return json.JSONEncoder.encode(self,
453+
self._preprocess_element(obj, mode="ietf"))
439454

440455
def default(self, obj, mode="ietf"):
441456
return pybindJSONEncoder().default(obj, mode="ietf")

pyangbind/lib/xpathhelper.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ def get(self, path, caller=False):
9191

9292
class YANGPathHelper(PybindXpathHelper):
9393
_attr_re = re.compile("^(?P<tagname>[^\[]+)(?P<args>(\[[^\]]+\])+)$")
94-
_arg_re = re.compile("^((and|or) )?[@]?(?P<cmd>[a-zA-Z0-9\-\_:]+)([ ]+)?=([ ]+)?" +
95-
"[\'\"]?(?P<arg>[^ ^\'^\"]+)([\'\"])?([ ]+)?" +
94+
_arg_re = re.compile("^((and|or) )?[@]?(?P<cmd>[a-zA-Z0-9\-\_:]+)([ ]+)?" +
95+
"=([ ]+)?[\'\"]?(?P<arg>[^ ^\'^\"]+)([\'\"])?([ ]+)?" +
9696
"(?P<remainder>.*)")
9797
_relative_path_re = re.compile("^(\.|\.\.)")
9898

@@ -200,7 +200,7 @@ def _tagname_attributes(self, tag, normalise_namespace=True):
200200
attributes[c] = a
201201
tmp_arg = r
202202
else:
203-
raise XPathError("invalid attribute string specified" +
203+
raise XPathError("invalid attribute string specified" +
204204
"for %s" % tagname +
205205
"(err part: %s (%s))" % (arg, tmp_arg))
206206
return (tagname, attributes)

pyangbind/lib/yangtypes.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ def safe_name(arg):
8282
# so that we can retrieve it when get() is called.
8383
return arg
8484

85+
8586
def RestrictedPrecisionDecimalType(*args, **kwargs):
8687
"""
8788
Function to return a new type that is based on decimal.Decimal with
@@ -854,7 +855,8 @@ def YANGDynClass(*args, **kwargs):
854855
rpath = []
855856
chk_path = "/" + "/".join(remove_path_attributes(rpath))
856857
if chk_path in extmethods:
857-
for method in [i for i in dir(extmethods[chk_path]) if not i.startswith("_")]:
858+
for method in [i for i in dir(extmethods[chk_path])
859+
if not i.startswith("_")]:
858860
clsslots.append("_" + method)
859861

860862
class YANGBaseClass(base_type):
@@ -888,9 +890,11 @@ def __init__(self, *args, **kwargs):
888890
self._metadata = {}
889891

890892
if self._extmethods:
891-
chk_path = "/" + "/".join(remove_path_attributes(self._register_path()))
893+
chk_path = \
894+
"/" + "/".join(remove_path_attributes(self._register_path()))
892895
if chk_path in self._extmethods:
893-
for method in [i for i in dir(self._extmethods[chk_path]) if not i.startswith("_")]:
896+
for method in [i for i in dir(self._extmethods[chk_path]) if
897+
not i.startswith("_")]:
894898
# Don't allow methods to be overwritten
895899
if hasattr(self, "_" + method):
896900
continue
@@ -902,7 +906,7 @@ def __init__(self, *args, **kwargs):
902906
if default:
903907
self._default = default
904908
if len(args):
905-
if not self._default is False:
909+
if self._default is not False:
906910
if not args[0] == self._default:
907911
self._set()
908912
else:
@@ -1099,7 +1103,6 @@ def __init__(self, *args, **kwargs):
10991103
self._type = re.sub("<(type|class) '(?P<class>.*)'>", "\g<class>",
11001104
str(get_method()._base_type))
11011105
self._ptr = True
1102-
#self._referenced_object = path_chk[0]
11031106
elif self._require_instance:
11041107
if not value:
11051108
self._referenced_object = None

pyangbind/plugin/pybind.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ def build_pybind(ctx, modules, fd):
262262

263263
ctx.pybind_common_hdr += "from operator import attrgetter\n"
264264
if ctx.opts.use_xpathhelper:
265-
ctx.pybind_common_hdr += "import pyangbind.lib.xpathhelper as xpathhelper\n"
265+
ctx.pybind_common_hdr += "import pyangbind.lib.xpathhelper as " + \
266+
"xpathhelper\n"
266267
ctx.pybind_common_hdr += """from pyangbind.lib.yangtypes import """
267268
ctx.pybind_common_hdr += """RestrictedPrecisionDecimalType, """
268269
ctx.pybind_common_hdr += """RestrictedClassType, TypedListType\n"""
@@ -358,11 +359,14 @@ def build_pybind(ctx, modules, fd):
358359
get_children(ctx, fd, rpcs, module, module, register_paths=False,
359360
path="/%s_rpc" % (safe_name(module.arg)))
360361

362+
361363
def build_identities(ctx, defnd):
362364
def find_all_identity_values(item, definitions, values=list()):
363-
new_values = [k for k in definitions[item] if not k in ["@module", "@namespace"] and not k in values]
365+
new_values = [k for k in definitions[item] if k not
366+
in ["@module", "@namespace"] and k not in values]
364367
for v in new_values:
365-
values.extend([i for i in find_all_identity_values(v, definitions, values=values) if not i in values])
368+
values.extend([i for i in find_all_identity_values(v, definitions,
369+
values=values) if i not in values])
366370
values.extend(new_values)
367371
return values
368372

@@ -448,9 +452,10 @@ def find_all_identity_values(item, definitions, values=list()):
448452
for identity in orig_identity_d:
449453
vals = find_all_identity_values(identity, orig_identity_d, values=[])
450454
for value in vals:
451-
if not value in orig_identity_d[identity]:
452-
identity_d[identity][value] = {k: v for k,v in
453-
orig_identity_d[value].iteritems() if k in ["@module", "@namespace"]}
455+
if value not in orig_identity_d[identity]:
456+
identity_d[identity][value] = {k: v for k, v in
457+
orig_identity_d[value].iteritems() if k in
458+
["@module", "@namespace"]}
454459

455460
# Add entries to the class_map such that this identity can be referenced by
456461
# elements that use this identity ref.
@@ -1280,7 +1285,7 @@ def get_element(ctx, fd, element, module, parent, path,
12801285

12811286
# Find element's namespace
12821287
namespace = element.i_orig_module.search_one("namespace").arg \
1283-
if hasattr(element, "i_orig_module") else None
1288+
if hasattr(element, "i_orig_module") else None
12841289
defining_module = element.i_orig_module.arg if \
12851290
hasattr(element, "i_orig_module") else None
12861291

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
# PyangBind uses the same versioning approach as OpenConfig - see
1414
# http://www.openconfig.net/file-cabinet/Semantic_Versioning_for_OpenConfig.pdf?attredirects=0&d=1
15-
version='0.3.1',
15+
version='0.3.2',
1616

1717
description="PyangBind is a plugin for pyang which converts YANG data" + \
1818
"models into a Python class hierarchy, such that Python " + \

tests/extmethods/run.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
TESTNAME = "extmethods"
88

9+
910
class extmethodcls(object):
1011
def commit(self, *args, **kwargs):
1112
return "COMMIT_CALLED"
@@ -72,17 +73,22 @@ def main():
7273

7374
for chk in results:
7475
method = getattr(x.item.one, "_" + chk[0], None)
75-
assert (method is not None) == chk[1], "Method %s retrieved incorrectly, method was: %s" % method
76+
assert (method is not None) == chk[1], \
77+
"Method %s retrieved incorrectly, method was: %s" % method
7678
if method is not None:
7779
result = method()
78-
assert result == chk[2], "Incorrect result returned from %s -> %s != %s" % (chk[0], result, chk[2])
80+
assert result == chk[2], "Incorrect return from %s -> %s != %s" \
81+
% (chk[0], result, chk[2])
7982

80-
expected_return = {'args': ('one',), 'kwargs': {'caller': ['item', 'one'], 'two': 2, 'path_helper': False}}
81-
assert x.item.one._echo('one', two=2) == expected_return, "args+kwargs not echoed correctly"
83+
expected_return = {'args': ('one',), 'kwargs': {'caller': ['item', 'one'],
84+
'two': 2, 'path_helper': False}}
85+
assert x.item.one._echo('one', two=2) == expected_return, \
86+
"args+kwargs not echoed correctly"
8287

8388
try:
8489
x.item.two = False
85-
assert False, "incorrectly set an attribute that did not exist in extmethods"
90+
assert False, \
91+
"incorrectly set an attribute that did not exist in extmethods"
8692
except AttributeError:
8793
pass
8894

tests/identityref/run.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ def main():
112112
"id4 leaf was set incorrectly (%s: %s != %s)" % \
113113
(k[0], k[1], passed)
114114

115-
for k in [("daughter", True), ("cousin", True), ("mother", True), ("aunt", True),
116-
("greatgrandmother", False)]:
115+
for k in [("daughter", True), ("cousin", True), ("mother", True),
116+
("aunt", True), ("greatgrandmother", False)]:
117117
passed = True
118118
try:
119119
i.test_container.id5 = k[0]
@@ -138,6 +138,5 @@ def main():
138138
os.system("/bin/rm %s/bindings.pyc" % this_dir)
139139

140140

141-
142141
if __name__ == '__main__':
143142
main()

tests/include-import/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def main():
3131
assert pyangbindpath is not False, "could not resolve pyangbind directory"
3232

3333
this_dir = os.path.dirname(os.path.realpath(__file__))
34-
34+
3535
cmd = "%s " % pythonpath
3636
cmd += "%s --plugindir %s/pyangbind/plugin" % (pyangpath, pyangbindpath)
3737
cmd += " -f pybind -o %s/bindings.py" % this_dir

0 commit comments

Comments
 (0)