Merge pull request #1 from sbconsulting/master

Adding :REVERSE_ID syntax to links
diff --git a/plyxproto/model.py b/plyxproto/model.py
index 39618a3..f5fe8bd 100644
--- a/plyxproto/model.py
+++ b/plyxproto/model.py
@@ -105,7 +105,8 @@
             dst_port,
             linespan=None,
             lexspan=None,
-            p=None):
+            p=None,
+            reverse_id=None):
         super(
             LinkDefinition,
             self).__init__(
@@ -129,6 +130,9 @@
         self.dst_port = dst_port
         Base.p(self.dst_port, self)
 
+        self.reverse_id = reverse_id
+        Base.p(self.reverse_id, self)
+
     def accept(self, visitor):
         visitor.visit_LinkDefinition(self)
 
diff --git a/plyxproto/parser.py b/plyxproto/parser.py
index e976727..a6c7dc8 100755
--- a/plyxproto/parser.py
+++ b/plyxproto/parser.py
@@ -218,6 +218,10 @@
         '''field_id : NUM'''
         p[0] = LU.i(p, 1)
 
+    def p_reverse_id(self, p):
+        '''reverse_id : NUM'''
+        p[0] = LU.i(p, 1)
+
     def p_rvalue(self, p):
         '''rvalue : NUM
                   | TRUE
@@ -367,6 +371,32 @@
 
         self.lh.set_parse_object(p[0], p)
 
+    # TODO: Add directives to link definition
+    def p_link_definition_with_reverse (self, p):
+        '''link_definition_with_reverse : field_modifier link_type field_name policy_opt ARROW dotname slash_name colon_fieldname EQ field_id COLON reverse_id field_directives SEMI'''
+        p[0] = LinkSpec(
+            FieldDefinition(
+                LU.i(
+                    p, 1), Name('int32'), LU.i(
+                    p, 3), LU.i(
+                    p, 4), LU.i(
+                        p, 10), [
+                            FieldDirective(
+                                Name('type'), Name('link')), FieldDirective(
+                                    Name('model'), LU.i(
+                                        p, 6))] + srcPort(
+                                            LU.i(
+                                                p, 8)) + LU.i(
+                                                    p, 13)), LinkDefinition(
+                                                        LU.i(
+                                                            p, 2), LU.i(
+                                                                p, 3), LU.i(
+                                                                    p, 6), LU.i(
+                                                                        p, 7), LU.i(
+                                                                            p, 8), reverse_id= LU.i(p, 12)))
+
+        self.lh.set_parse_object(p[0], p)
+
     # Root of the field declaration.
     def p_field_definition(self, p):
         '''field_definition : field_modifier field_type field_name policy_opt EQ field_id field_directives SEMI'''
@@ -474,6 +504,7 @@
     def p_message_body_part(self, p):
         '''message_body_part : field_definition
                            | link_definition
+                           | link_definition_with_reverse
                            | enum_definition
                            | option_directive
                            | message_definition
diff --git a/setup.py b/setup.py
index fa753ac..ad1947f 100644
--- a/setup.py
+++ b/setup.py
@@ -11,9 +11,9 @@
 
 setup(
     name='plyxproto',
-    version='3.0.0',
+    version='3.1.0',
     description='xproto parser and processor',
-    author='Dusan Klinec (original protobuf parser), Sapan Bhatia (xproto extensions), Zack Williams (maintenance)',
+    author='Dusan Klinec (original protobuf parser), Sapan Bhatia (xproto extensions), Zack Williams (maintenance), Scott Baker (maintenance)',
     author_email='sapan@opennetworking.org',
     url='https://github.com/sb98052/plyprotobuf',
     license='Apache Software License',