From 32b4e7943427ec9c17d6388cd0f7e0ce3ef992f2 Mon Sep 17 00:00:00 2001 From: "David M. Lee" Date: Thu, 24 Oct 2013 20:48:17 +0000 Subject: The Swagger 1.2 specification for type extension ended up being slightly different than my proposal. Instead of putting an 'extends' field on the subtype, the base type has a 'subTypes' field, which is a list of the subTypes. Given that its a messaging model and not an object model, kinda makes sense. This patch changes the events.json api-doc, and the python translators to take the new format into account. Other changes that are in Swagger 1.2 were not adopted, since the spec is still in flux, and could change before it's finalized. A summary of changes to the Swagger-1.2 spec can be found at https://github.com/wordnik/swagger-core/wiki/1.2-transition. (closes issue ASTERISK-22440) Review: https://reviewboard.asterisk.org/r/2909/ ........ Merged revisions 401701 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@401834 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- rest-api-templates/ari_model_validators.c.mustache | 4 +- rest-api-templates/models.wiki.mustache | 2 +- rest-api-templates/swagger_model.py | 68 +++++++++++----------- 3 files changed, 38 insertions(+), 36 deletions(-) (limited to 'rest-api-templates') diff --git a/rest-api-templates/ari_model_validators.c.mustache b/rest-api-templates/ari_model_validators.c.mustache index 7bb527898..9d3167156 100644 --- a/rest-api-templates/ari_model_validators.c.mustache +++ b/rest-api-templates/ari_model_validators.c.mustache @@ -57,11 +57,11 @@ int ast_ari_validate_{{c_id}}(struct ast_json *json) if (strcmp("{{id}}", discriminator) == 0) { /* Self type; fall through */ } else -{{#subtypes}} +{{#all_subtypes}} if (strcmp("{{id}}", discriminator) == 0) { return ast_ari_validate_{{c_id}}(json); } else -{{/subtypes}} +{{/all_subtypes}} { ast_log(LOG_ERROR, "ARI {{id}} has undocumented subtype %s\n", discriminator); diff --git a/rest-api-templates/models.wiki.mustache b/rest-api-templates/models.wiki.mustache index b2e742afc..2bc1e467f 100644 --- a/rest-api-templates/models.wiki.mustache +++ b/rest-api-templates/models.wiki.mustache @@ -5,7 +5,7 @@ {{#models}} h1. {{id}} {{#extends}}Base type: [{{extends}}|#{{extends}}]{{/extends}} -{{#has_subtypes}}Subtypes:{{#subtypes}} [{{id}}|#{{id}}]{{/subtypes}}{{/has_subtypes}} +{{#has_subtypes}}Subtypes:{{#all_subtypes}} [{{id}}|#{{id}}]{{/all_subtypes}}{{/has_subtypes}} {{#wiki_description}} {{{wiki_description}}} diff --git a/rest-api-templates/swagger_model.py b/rest-api-templates/swagger_model.py index af52266b4..be98c4a3c 100644 --- a/rest-api-templates/swagger_model.py +++ b/rest-api-templates/swagger_model.py @@ -33,8 +33,8 @@ import re import sys import traceback -# I'm not quite sure what was in Swagger 1.2, but apparently I missed it -SWAGGER_VERSIONS = ["1.1", "1.3"] +# We don't fully support Swagger 1.2, but we need it for subtyping +SWAGGER_VERSIONS = ["1.1", "1.2"] SWAGGER_PRIMITIVES = [ 'void', @@ -479,13 +479,13 @@ class Model(Stringify): def __init__(self): self.id = None - self.extends = None - self.extends_type = None + self.subtypes = [] + self.__subtype_types = [] self.notes = None self.description = None self.__properties = None self.__discriminator = None - self.__subtypes = [] + self.__extends_type = None def load(self, id, model_json, processor, context): context = context.next_stack(model_json, 'id') @@ -494,9 +494,9 @@ class Model(Stringify): self.id = model_json.get('id') if id != self.id: raise SwaggerError("Model id doesn't match name", context) - self.extends = model_json.get('extends') - if self.extends and context.version_less_than("1.3"): - raise SwaggerError("Type extension support added in Swagger 1.3", + self.subtypes = model_json.get('subTypes') or [] + if self.subtypes and context.version_less_than("1.2"): + raise SwaggerError("Type extension support added in Swagger 1.2", context) self.description = model_json.get('description') props = model_json.get('properties').items() or [] @@ -507,8 +507,8 @@ class Model(Stringify): discriminator = model_json.get('discriminator') if discriminator: - if context.version_less_than("1.3"): - raise SwaggerError("Discriminator support added in Swagger 1.3", + if context.version_less_than("1.2"): + raise SwaggerError("Discriminator support added in Swagger 1.2", context) discr_props = [p for p in self.__properties if p.name == discriminator] @@ -526,43 +526,42 @@ class Model(Stringify): processor.process_model(self, context) return self - def add_subtype(self, subtype): - """Add subtype to this model. - - @param subtype: Model instance for the subtype. - """ - self.__subtypes.append(subtype) + def extends(self): + return self.__extends_type and self.__extends_type.id def set_extends_type(self, extends_type): - self.extends_type = extends_type + self.__extends_type = extends_type + + def set_subtype_types(self, subtype_types): + self.__subtype_types = subtype_types def discriminator(self): """Returns the discriminator, digging through base types if needed. """ return self.__discriminator or \ - self.extends_type and self.extends_type.discriminator() + self.__extends_type and self.__extends_type.discriminator() def properties(self): base_props = [] - if self.extends_type: - base_props = self.extends_type.properties() + if self.__extends_type: + base_props = self.__extends_type.properties() return base_props + self.__properties def has_properties(self): return len(self.properties()) > 0 - def subtypes(self): - """Returns the full list of all subtypes. + def all_subtypes(self): + """Returns the full list of all subtypes, including sub-subtypes. """ - res = self.__subtypes + \ - [subsubtypes for subtype in self.__subtypes - for subsubtypes in subtype.subtypes()] + res = self.__subtype_types + \ + [subsubtypes for subtype in self.__subtype_types + for subsubtypes in subtype.all_subtypes()] return sorted(res, key=lambda m: m.id) def has_subtypes(self): """Returns True if type has any subtypes. """ - return len(self.subtypes()) > 0 + return len(self.subtypes) > 0 class ApiDeclaration(Stringify): @@ -641,13 +640,16 @@ class ApiDeclaration(Stringify): # Now link all base/extended types model_dict = dict((m.id, m) for m in self.models) for m in self.models: - if m.extends: - extends_type = model_dict.get(m.extends) - if not extends_type: - raise SwaggerError("%s extends non-existing model %s", - m.id, m.extends) - extends_type.add_subtype(m) - m.set_extends_type(extends_type) + def link_subtype(name): + res = model_dict.get(subtype) + if not res: + raise SwaggerError("%s has non-existing subtype %s", + m.id, name) + res.set_extends_type(m) + return res; + if m.subtypes: + m.set_subtype_types([ + link_subtype(subtype) for subtype in m.subtypes]) return self -- cgit v1.2.3