>> I'm not sure we would add other types except for 'string' but I'm >> inclined to something like the following. > > it looks like same as what i posted last week to me.
The difference is that I don't think that we want to to put 'type' into ofproto_* instead of a reference to the json encode/decode implementation. ofproto_* explains 'types' and the code taking care of encode/decode knows what to encode/decode for these types. > are you happier with the following? I don't think that we need addrconv.plain_text stuff. JSON uses utf for string. I don't think we need additional abstraction there. > or is tagging with a string ('string') essential? Not but as I explained above, I prefer ofproto_* to just define types. > YAMAMOTO Takashi > > diff --git a/ryu/lib/stringify.py b/ryu/lib/stringify.py > index b71da75..ea3b3b8 100644 > --- a/ryu/lib/stringify.py > +++ b/ryu/lib/stringify.py > @@ -21,6 +21,9 @@ import collections > import inspect > > > +from ryu.lib import addrconv > + > + > # Some arguments to __init__ is mungled in order to avoid name conflicts > # with builtin names. > # The standard mangling is to append '_' in order to avoid name clashes > @@ -46,6 +49,9 @@ _mapdict_key = lambda f, d: dict([(f(k), v) for k, v in > d.items()]) > _mapdict_kv = lambda f, d: dict([(k, f(k, v)) for k, v in d.items()]) > > > +StringType = addrconv.plain_text > + > + > class StringifyMixin(object): > _class_prefixes = [] > > @@ -80,7 +86,10 @@ class StringifyMixin(object): > > @classmethod > def _get_converter(cls, k): > - return cls._JSON_FORMATTER[k] > + for t, attrs in cls._TYPE.iteritems(): > + if k in attrs: > + return t > + raise KeyError > > @classmethod > def _get_encoder(cls, k, encode_string): > diff --git a/ryu/ofproto/ofproto_v1_0_parser.py > b/ryu/ofproto/ofproto_v1_0_parser.py > index d8e42bb..03c11ff 100644 > --- a/ryu/ofproto/ofproto_v1_0_parser.py > +++ b/ryu/ofproto/ofproto_v1_0_parser.py > @@ -24,6 +24,7 @@ from . import ofproto_parser > from . import ofproto_v1_0 > from . import nx_match > from ryu import utils > +from ryu.lib.stringify import StringType > > import logging > LOG = logging.getLogger('ryu.ofproto.ofproto_v1_0_parser') > @@ -83,11 +84,13 @@ class OFPPhyPort(ofproto_parser.namedtuple('OFPPhyPort', ( > 'port_no', 'hw_addr', 'name', 'config', 'state', 'curr', > 'advertised', > 'supported', 'peer'))): > > - _JSON_FORMATTER = { > - 'hw_addr': addrconv.plain_text, > - # XXX OF spec is unclear about the encoding of name. > - # OVS seems to use UTF-8. > - # 'name': addrconv.plain_text, hw_addr is ascii. JSON uses utf by default. I don't think that there is any uncleanness here. > + _TYPE = { > + StringType: [ > + 'hw_addr', > + # XXX OF spec is unclear about the encoding of name. > + # OVS seems to use UTF-8. > + # 'name' > + ] > } > > @classmethod > @@ -2126,7 +2129,11 @@ class OFPFlowMod(MsgBase): > @_set_msg_type(ofproto_v1_0.OFPT_PORT_MOD) > class OFPPortMod(MsgBase): > > - _JSON_FORMATTER = {'hw_addr': addrconv.plain_text} > + _TYPE = { > + StringType: [ > + 'hw_addr', > + ] > + } > > def __init__(self, datapath, port_no, hw_addr, config, mask, advertise): > super(OFPPortMod, self).__init__(datapath) > >> >> = >>>From b5ddaabfbb4ad5500d70fdd350f616ae357058f4 Mon Sep 17 00:00:00 2001 >> From: FUJITA Tomonori <fujita.tomon...@lab.ntt.co.jp> >> Date: Sat, 24 Aug 2013 08:54:16 +0900 >> Subject: [PATCH 3/6] stop be64 encode/decode for strings in JSON >> representation >> >> Our JSON handles binary and string in the same way (use be64 >> always). Had better to handle string in human readable way (string is >> supposed to be utf-8 encoded/decoded by default in JSON). >> >> Signed-off-by: FUJITA Tomonori <fujita.tomon...@lab.ntt.co.jp> >> --- >> ryu/lib/stringify.py | 15 +++++++++++++-- >> 1 file changed, 13 insertions(+), 2 deletions(-) >> >> diff --git a/ryu/lib/stringify.py b/ryu/lib/stringify.py >> index 8b755c5..050aa0a 100644 >> --- a/ryu/lib/stringify.py >> +++ b/ryu/lib/stringify.py >> @@ -79,9 +79,18 @@ class StringifyMixin(object): >> return False >> >> @classmethod >> + def _is_string_type(cls, k): >> + if hasattr(cls, '_TYPE'): >> + if 'string' in cls._TYPE and k in cls._TYPE['string']: >> + return True >> + return False >> + >> + @classmethod >> def _encode_value(cls, k, v, encode_string=base64.b64encode): >> encode = lambda x: cls._encode_value(k, x, encode_string) >> - if isinstance(v, (bytes, unicode)): >> + if cls._is_string_type(k): >> + json_value = v.encode('utf') >> + elif isinstance(v, (bytes, unicode)): >> json_value = encode_string(v) >> elif isinstance(v, list): >> json_value = map(encode, v) >> @@ -124,7 +133,9 @@ class StringifyMixin(object): >> @classmethod >> def _decode_value(cls, k, json_value, decode_string=base64.b64decode): >> decode = lambda x: cls._decode_value(k, x, decode_string) >> - if isinstance(json_value, (bytes, unicode)): >> + if cls._is_string_type(k): >> + v = json_value >> + elif isinstance(json_value, (bytes, unicode)): >> v = decode_string(json_value) >> elif isinstance(json_value, list): >> v = map(decode, json_value) >> -- >> 1.7.12.4 (Apple Git-37) >> >> >> >> >> >> ------------------------------------------------------------------------------ >> Introducing Performance Central, a new site from SourceForge and >> AppDynamics. Performance Central is your source for news, insights, >> analysis and resources for efficient Application Performance Management. >> Visit us today! >> http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk >> _______________________________________________ >> Ryu-devel mailing list >> Ryu-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/ryu-devel > > ------------------------------------------------------------------------------ > Introducing Performance Central, a new site from SourceForge and > AppDynamics. Performance Central is your source for news, insights, > analysis and resources for efficient Application Performance Management. > Visit us today! > http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk > _______________________________________________ > Ryu-devel mailing list > Ryu-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/ryu-devel ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel