def validate_url(cls, value: Any) -> Optional[ParseResult]: if isinstance(value, str) and is_url(value): # pragma: no cover return urlparse(value) elif value is None: # pragma: no cover return None raise Error( f'This protocol doesn\'t support only http/https. --input={value}' ) # pragma: no cover
def ref_type(self) -> Optional[JSONReference]: if self.ref: if self.ref[0] == '#': return JSONReference.LOCAL elif is_url(self.ref): return JSONReference.URL return JSONReference.REMOTE return None # pragma: no cover
def parse_ref(self, obj: JsonSchemaObject, path: List[str]) -> None: if obj.ref: reference = self.model_resolver.add_ref(obj.ref) if not reference or not reference.loaded: # https://swagger.io/docs/specification/using-ref/ ref = self.model_resolver.resolve_ref(obj.ref) if obj.ref_type == JSONReference.LOCAL: # Local Reference – $ref: '#/definitions/myElement' self.reserved_refs[tuple( self.model_resolver.current_root)].add( ref) # type: ignore elif self.model_resolver.is_after_load(ref): self.reserved_refs[tuple( ref.split('#')[0].split('/'))].add(ref) # type: ignore else: if is_url(ref): relative_path, object_path = ref.split('#') relative_paths = [relative_path] base_path = None else: if self.model_resolver.is_external_root_ref(ref): relative_path, object_path = ref[:-1], '' else: relative_path, object_path = ref.split('#') relative_paths = relative_path.split('/') base_path = Path(*relative_paths).parent with self.model_resolver.current_base_path_context( base_path), self.model_resolver.base_url_context( relative_path): self._parse_file( self._get_ref_body(relative_path), self.model_resolver.add_ref(ref, resolved=True).name, relative_paths, object_path.split('/') if object_path else None, ) self.model_resolver.add_ref(obj.ref, ).loaded = True if obj.items: if isinstance(obj.items, JsonSchemaObject): self.parse_ref(obj.items, path) else: for item in obj.items: self.parse_ref(item, path) if isinstance(obj.additionalProperties, JsonSchemaObject): self.parse_ref(obj.additionalProperties, path) for item in obj.anyOf: self.parse_ref(item, path) for item in obj.allOf: self.parse_ref(item, path) for item in obj.oneOf: self.parse_ref(item, path) if obj.properties: for value in obj.properties.values(): self.parse_ref(value, path)
def resolve_ref(self, object_ref: str) -> Reference: reference = self.model_resolver.add_ref(object_ref) if reference.loaded: return reference # https://swagger.io/docs/specification/using-ref/ ref = self.model_resolver.resolve_ref(object_ref) if get_ref_type(object_ref) == JSONReference.LOCAL: # Local Reference – $ref: '#/definitions/myElement' self.reserved_refs[tuple(self.model_resolver.current_root)].add( ref) # type: ignore return reference elif self.model_resolver.is_after_load(ref): self.reserved_refs[tuple(ref.split('#')[0].split('/'))].add( ref) # type: ignore return reference if is_url(ref): relative_path, object_path = ref.split('#') relative_paths = [relative_path] base_path = None else: if self.model_resolver.is_external_root_ref(ref): relative_path, object_path = ref[:-1], '' else: relative_path, object_path = ref.split('#') relative_paths = relative_path.split('/') base_path = Path(*relative_paths).parent with self.model_resolver.current_base_path_context( base_path), self.model_resolver.base_url_context( relative_path): self._parse_file( self._get_ref_body(relative_path), self.model_resolver.add_ref(ref, resolved=True).name, relative_paths, object_path.split('/') if object_path else None, ) reference.loaded = True return reference
def _get_ref_body(self, resolved_ref: str) -> Dict[Any, Any]: if is_url(resolved_ref): return self._get_ref_body_from_url(resolved_ref) return self._get_ref_body_from_remote(resolved_ref)
def get_ref_type(ref: str) -> JSONReference: if ref[0] == '#': return JSONReference.LOCAL elif is_url(ref): return JSONReference.URL return JSONReference.REMOTE