예제 #1
0
 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