>> 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 <[email protected]>
>> 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 <[email protected]>
>> ---
>> 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
>> [email protected]
>> 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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel