def openapihttpdomain(spec, **options): generators = [] # OpenAPI spec may contain JSON references, common properties, etc. # Trying to render the spec "As Is" will require to put multiple # if-s around the code. In order to simplify flow, let's make the # spec to have only one (expected) schema, i.e. normalize it. utils.normalize_spec(spec, **options) # If 'paths' are passed we've got to ensure they exist within an OpenAPI # spec; otherwise raise error and ask user to fix that. if 'paths' in options: if not set(options['paths']).issubset(spec['paths']): raise ValueError( 'One or more paths are not defined in the spec: %s.' % (', '.join(set(options['paths']) - set(spec['paths'])), )) render_request = False if 'request' in options: render_request = True convert = utils.get_text_converter(options) # https://github.com/OAI/OpenAPI-Specification/blob/3.0.2/versions/3.0.0.md#paths-object if 'group' in options: groups = collections.defaultdict(list) for endpoint in options.get('paths', spec['paths']): for method, properties in spec['paths'][endpoint].items(): key = properties.get('tags', [''])[0] groups[key].append( _httpresource(endpoint, method, properties, convert, render_examples='examples' in options, render_request=render_request)) for key in sorted(groups.keys()): if key: generators.append(_header(key)) else: generators.append(_header('default')) generators.extend(groups[key]) else: for endpoint in options.get('paths', spec['paths']): for method, properties in spec['paths'][endpoint].items(): generators.append( _httpresource(endpoint, method, properties, convert, render_examples='examples' in options, render_request=render_request)) return iter(itertools.chain(*generators))
def openapihttpdomain(spec, **options): if 'examples' in options: raise ValueError( 'Rendering examples is not supported for OpenAPI v2.x specs.') if 'request' in options: raise ValueError( 'The :request: option is not supported for OpenAPI v2.x specs.') generators = [] # OpenAPI spec may contain JSON references, common properties, etc. # Trying to render the spec "As Is" will require to put multiple # if-s around the code. In order to simplify flow, let's make the # spec to have only one (expected) schema, i.e. normalize it. utils.normalize_spec(spec, **options) # If 'paths' are passed we've got to ensure they exist within an OpenAPI # spec; otherwise raise error and ask user to fix that. if 'paths' in options: if not set(options['paths']).issubset(spec['paths']): raise ValueError( 'One or more paths are not defined in the spec: %s.' % ( ', '.join(set(options['paths']) - set(spec['paths'])), ) ) for endpoint in options.get('paths', spec['paths']): for method, properties in spec['paths'][endpoint].items(): generators.append(_httpresource( endpoint, method, properties, utils.get_text_converter(options), )) return iter(itertools.chain(*generators))
def openapihttpdomain(spec, **options): generators = [] # OpenAPI spec may contain JSON references, common properties, etc. # Trying to render the spec "As Is" will require to put multiple # if-s around the code. In order to simplify flow, let's make the # spec to have only one (expected) schema, i.e. normalize it. utils.normalize_spec(spec, **options) # Paths list to be processed paths = [] # If 'paths' are passed we've got to ensure they exist within an OpenAPI # spec; otherwise raise error and ask user to fix that. if 'paths' in options: if not set(options['paths']).issubset(spec['paths']): raise ValueError( 'One or more paths are not defined in the spec: %s.' % (', '.join(set(options['paths']) - set(spec['paths'])), )) paths = options['paths'] # Check against regular expressions to be included if 'include' in options: for i in options['include']: ir = re.compile(i) for path in spec['paths']: if ir.match(path): paths.append(path) # If no include nor paths option, then take full path if 'include' not in options and 'paths' not in options: paths = spec['paths'] # Remove paths matching regexp if 'exclude' in options: _paths = [] for e in options['exclude']: er = re.compile(e) for path in paths: if not er.match(path): _paths.append(path) paths = _paths render_request = False if 'request' in options: render_request = True convert = utils.get_text_converter(options) # https://github.com/OAI/OpenAPI-Specification/blob/3.0.2/versions/3.0.0.md#paths-object if 'group' in options: groups = collections.OrderedDict([(x['name'], []) for x in spec.get('tags', {})]) for endpoint in paths: for method, properties in spec['paths'][endpoint].items(): key = properties.get('tags', [''])[0] groups.setdefault(key, []).append( _httpresource(endpoint, method, properties, convert, render_examples='examples' in options, render_request=render_request)) for key in groups.keys(): if key: generators.append(_header(key)) else: generators.append(_header('default')) generators.extend(groups[key]) else: for endpoint in paths: for method, properties in spec['paths'][endpoint].items(): generators.append( _httpresource(endpoint, method, properties, convert, render_examples='examples' in options, render_request=render_request)) return iter(itertools.chain(*generators))
def openapihttpdomain(spec, **options): if 'examples' in options: raise ValueError( 'Rendering examples is not supported for OpenAPI v2.x specs.') if 'request' in options: raise ValueError( 'The :request: option is not supported for OpenAPI v2.x specs.') generators = [] # OpenAPI spec may contain JSON references, common properties, etc. # Trying to render the spec "As Is" will require to put multiple # if-s around the code. In order to simplify flow, let's make the # spec to have only one (expected) schema, i.e. normalize it. utils.normalize_spec(spec, **options) # Paths list to be processed paths = [] # If 'paths' are passed we've got to ensure they exist within an OpenAPI # spec; otherwise raise error and ask user to fix that. if 'paths' in options: if not set(options['paths']).issubset(spec['paths']): raise ValueError( 'One or more paths are not defined in the spec: %s.' % (', '.join(set(options['paths']) - set(spec['paths'])), )) paths = options['paths'] # Check against regular expressions to be included if 'include' in options: for i in options['include']: ir = re.compile(i) for path in spec['paths']: if ir.match(path): paths.append(path) # If no include nor paths option, then take full path if 'include' not in options and 'paths' not in options: paths = spec['paths'] # Remove paths matching regexp if 'exclude' in options: _paths = [] for e in options['exclude']: er = re.compile(e) for path in paths: if not er.match(path): _paths.append(path) paths = _paths for endpoint in paths: for method, properties in spec['paths'][endpoint].items(): generators.append( _httpresource( endpoint, method, properties, utils.get_text_converter(options), )) return iter(itertools.chain(*generators))