> On Fri, 23 Aug 2013 17:59:21 +0900 (JST)
> [email protected] (YAMAMOTO Takashi) wrote:
>
>>> On Fri, 23 Aug 2013 13:42:54 +0900 (JST)
>>> [email protected] (YAMAMOTO Takashi) wrote:
>>>
>>>>> On Fri, 23 Aug 2013 12:18:31 +0900 (JST)
>>>>> [email protected] (YAMAMOTO Takashi) wrote:
>>>>>
>>>>>>> On Fri, 16 Aug 2013 15:29:22 +0900
>>>>>>> YAMAMOTO Takashi <[email protected]> wrote:
>>>>>>>
>>>>>>>> Signed-off-by: YAMAMOTO Takashi <[email protected]>
>>>>>>>> ---
>>>>>>>> ryu/ofproto/ofproto_v1_0_parser.py | 6 +++++-
>>>>>>>> 1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/ryu/ofproto/ofproto_v1_0_parser.py
>>>>>>>> b/ryu/ofproto/ofproto_v1_0_parser.py
>>>>>>>> index 3fae86d..e1951c8 100644
>>>>>>>> --- a/ryu/ofproto/ofproto_v1_0_parser.py
>>>>>>>> +++ b/ryu/ofproto/ofproto_v1_0_parser.py
>>>>>>>> @@ -18,6 +18,7 @@ import struct
>>>>>>>> import binascii
>>>>>>>>
>>>>>>>> from ofproto_parser import StringifyMixin, MsgBase, msg_pack_into,
>>>>>>>> msg_str_attr
>>>>>>>> +from ryu.lib import addrconv
>>>>>>>> from ryu.lib import mac
>>>>>>>> from . import ofproto_parser
>>>>>>>> from . import ofproto_v1_0
>>>>>>>> @@ -86,6 +87,9 @@ class
>>>>>>>> OFPPhyPort(ofproto_parser.namedtuple('OFPPhyPort', (
>>>>>>>> def parser(cls, buf, offset):
>>>>>>>> port = struct.unpack_from(ofproto_v1_0.OFP_PHY_PORT_PACK_STR,
>>>>>>>> buf, offset)
>>>>>>>> + i = cls._fields.index('hw_addr')
>>>>>>>> + port = list(port)
>>>>>>>> + port[i] = addrconv.mac.bin_to_text(port[i])
>>>>>>>> return cls(*port)
>>>>>>>
>>>>>>> Can we use unicode type here? Then _encode_value() in stringfy.py just
>>>>>>
>>>>>> are you talking about "name", not "hw_addr"?
>>>>>
>>>>> hw_addr.
>>>>
>>>> then i'm not sure if i understand what you mean.
>>>> do you mean to use different python types (str vs unicode) to
>>>> tell the encoder do base64 or not? it can work for encoding
>>>> but not for decoding.
>>>
>>> _JSON_FORMATER thing in this patchset describes the type of members in
>>> a class. Then you can know how to decode.
>>>
>>> I thought that we could use unicode for 'string' type however looks
>>> like it needs more changes than I want. Scratch that.
>>
>> IMO, if how to decode is specified _JSON_FORMATTER or _STRING,
>> it's better to use the same mechanism to specify how to encode.
>>
>>>
>>> I like to simply use 'type' attribute rather than allowing own
>>> encoder/decoder. We use JSON so it's just about string or binary. I
>>> like a simpler like the following. I don't like to use class attribute
>>> though. I prefer to use the attribute of each member.
>>
>> do you like something like the following?
>>
>> python:
>>
>> class Binary(str):
>> pass
>>
>> class Hoge(StringifyMixin):
>> def __init__(self):
>> self.field1 = Binary('foo')
>> self.field2 = 'bar'
>>
>> json:
>>
>> { "Hoge": {
>> "field1": { "Binary": "xxx base64 encoded 'foo' xxx" },
>> "field2": "bar"
>> }}
>
> Not sure. For me, the above JSON looks unfamiliar. If we do the above,
> I think that we should do all the field in the same way for
> consistency (that is, adding 'u32', 'u64', etc description). And
> surely I don't like such.
ok. neither do i.
>
> 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.
are you happier with the following?
or is tagging with a string ('string') essential?
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,
+ _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