[svn-commits] dlee: branch dlee/ari-event-remodel2 r393218 - in /team/dlee/ari-event-remode...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Jun 28 15:37:07 CDT 2013


Author: dlee
Date: Fri Jun 28 15:37:05 2013
New Revision: 393218

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=393218
Log:
Adjusted for latest Swagger subtyping spec.

* Discriminator is now specified by a model field instead of a property type
* Actually, this is in swagger-1.3. Have no idea what swagger-1.2 was.

Modified:
    team/dlee/ari-event-remodel2/rest-api-templates/swagger_model.py
    team/dlee/ari-event-remodel2/rest-api/api-docs/events.json

Modified: team/dlee/ari-event-remodel2/rest-api-templates/swagger_model.py
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-event-remodel2/rest-api-templates/swagger_model.py?view=diff&rev=393218&r1=393217&r2=393218
==============================================================================
--- team/dlee/ari-event-remodel2/rest-api-templates/swagger_model.py (original)
+++ team/dlee/ari-event-remodel2/rest-api-templates/swagger_model.py Fri Jun 28 15:37:05 2013
@@ -33,7 +33,8 @@
 import sys
 import traceback
 
-SWAGGER_VERSIONS = ["1.1", "1.2"]
+# I'm not quite sure what was in Swagger 1.2, but apparently I missed it
+SWAGGER_VERSIONS = ["1.1", "1.3"]
 
 SWAGGER_PRIMITIVES = [
     'void',
@@ -45,7 +46,6 @@
     'double',
     'float',
     'Date',
-    'DISCRIMINATOR',
 ]
 
 
@@ -54,6 +54,28 @@
     """
     def __repr__(self):
         return "%s(%s)" % (self.__class__, pprint.saferepr(self.__dict__))
+
+
+def compare_versions(lhs, rhs):
+    '''Performs a lexicographical comparison between two version numbers.
+
+    This properly handles simple major.minor.whatever.sure.why.not version
+    numbers, but fails miserably if there's any letters in there.
+
+    For reference:
+      1.0 == 1.0
+      1.0 < 1.0.1
+      1.2 < 1.10
+
+    @param lhs Left hand side of the comparison
+    @param rhs Right hand side of the comparison
+    @return  < 0 if lhs  < rhs
+    @return == 0 if lhs == rhs
+    @return  > 0 if lhs  > rhs
+    '''
+    lhs = [int(v) for v in lhs.split('.')]
+    rhs = [int(v) for v in rhs.split('.')]
+    return cmp(lhs, rhs)
 
 
 class ParsingContext(object):
@@ -81,8 +103,8 @@
 
     stack = property(get_stack)
 
-    def is_version(self, ver):
-        return self.swagger_version == ver
+    def version_less_than(self, ver):
+        return compare_versions(self.swagger_version, ver) < 0
 
     def next_stack(self, json, id_field):
         """Returns a new item pushed to the stack.
@@ -313,12 +335,6 @@
             raise SwaggerError("The type for integer should be 'int'", context)
 
         self.name = type_name
-        self.is_discriminator = self.name == 'DISCRIMINATOR'
-        if self.is_discriminator:
-            self.name = 'string'
-            if context.is_version("1.1"):
-                raise SwaggerError(
-                    "DISCRIMINATOR support added in Swagger 1.2", context)
         type_param = get_list_parameter_type(self.name)
         self.is_list = type_param is not None
         if self.is_list:
@@ -450,9 +466,6 @@
 
         type = property_json.get('type')
         self.type = type and SwaggerType().load(type, processor, context)
-        if self.type.is_discriminator:
-            # Discriminators are always required
-            self.required = True
 
         processor.process_property(self, context)
         return self
@@ -484,8 +497,8 @@
         if id != self.id:
             raise SwaggerError("Model id doesn't match name", context)
         self.extends = model_json.get('extends')
-        if self.extends and context.is_version("1.1"):
-            raise SwaggerError("Type extension support added in Swagger 1.2",
+        if self.extends and context.version_less_than("1.3"):
+            raise SwaggerError("Type extension support added in Swagger 1.3",
                                context)
         self.description = model_json.get('description')
         props = model_json.get('properties').items() or []
@@ -493,14 +506,21 @@
             Property(k).load(j, processor, context) for (k, j) in props]
         self.__properties = sorted(self.__properties, key=lambda p: p.name)
 
-        discriminators = [
-            p for p in self.__properties if p.type.is_discriminator]
-        if len(discriminators) > 1:
-            raise SwaggerError("Model may have at most one discriminator",
-                               context)
-
-        if discriminators:
-            self.__discriminator = discriminators[0]
+        discriminator = model_json.get('discriminator')
+
+        if discriminator:
+            if context.version_less_than("1.3"):
+                raise SwaggerError("Discriminator support added in Swagger 1.3",
+                                   context)
+
+            discr_props = [p for p in self.__properties if p.name == discriminator]
+            if not discr_props:
+                raise SwaggerError(
+                    "Discriminator '%s' does not name a property of '%s'" % (
+                        discriminator, self.id),
+                    context)
+
+            self.__discriminator = discr_props[0]
 
         self.model_json = json.dumps(model_json,
                                      indent=2, separators=(',', ': '))
@@ -602,7 +622,7 @@
         context = context.next(version=self.swagger_version)
         if not self.swagger_version in SWAGGER_VERSIONS:
             raise SwaggerError(
-                "Unsupported Swagger version %s" % swagger_version, context)
+                "Unsupported Swagger version %s" % self.swagger_version, context)
 
         validate_required_fields(api_decl_json, self.required_fields, context)
 

Modified: team/dlee/ari-event-remodel2/rest-api/api-docs/events.json
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-event-remodel2/rest-api/api-docs/events.json?view=diff&rev=393218&r1=393217&r2=393218
==============================================================================
--- team/dlee/ari-event-remodel2/rest-api/api-docs/events.json (original)
+++ team/dlee/ari-event-remodel2/rest-api/api-docs/events.json Fri Jun 28 15:37:05 2013
@@ -3,7 +3,7 @@
 	"_author": "David M. Lee, II <dlee at digium.com>",
 	"_svn_revision": "$Revision$",
 	"apiVersion": "0.0.1",
-	"swaggerVersion": "1.2",
+	"swaggerVersion": "1.3",
 	"basePath": "http://localhost:8088/stasis",
 	"resourcePath": "/api-docs/events.{format}",
 	"apis": [
@@ -36,9 +36,11 @@
 		"Event": {
 			"id": "Event",
 			"description": "Base type for asynchronous events from Asterisk.",
+			"discriminator": "type",
 			"properties": {
 				"type": {
-					"type": "DISCRIMINATOR",
+					"type": "string",
+					"required": true,
 					"description": "Indicates the type of this event."
 				},
 				"application": {




More information about the svn-commits mailing list