def parse_obj(cls, obj: dict) -> OpenAPISpec:
            try:
                cls._alert_unsupported_spec(obj)
                return super().parse_obj(obj)
            except ValidationError as e:
                # We are handling possibly misconfigured specs and
                # want to do a best-effort job to get a reasonable interface out of it.
                new_obj = copy.deepcopy(obj)
                for error in e.errors():
                    keys = error["loc"]
                    item = new_obj
                    for key in keys[:-1]:
                        item = item[key]
                    item.pop(keys[-1], None)
                return cls.parse_obj(new_obj)
[docs]        @classmethod
        def from_spec_dict(cls, spec_dict: dict) -> OpenAPISpec:
            """Get an OpenAPI spec from a dict."""
            return cls.parse_obj(spec_dict)
[docs]        @classmethod
        def from_text(cls, text: str) -> OpenAPISpec:
            """Get an OpenAPI spec from a text."""
            try:
                spec_dict = json.loads(text)
            except json.JSONDecodeError:
                spec_dict = yaml.safe_load(text)
            return cls.from_spec_dict(spec_dict)
[docs]        @classmethod
        def from_file(cls, path: Union[str, Path]) -> OpenAPISpec:
            """Get an OpenAPI spec from a file path."""
            path_ = path if isinstance(path, Path) else Path(path)
            if not path_.exists():
                raise FileNotFoundError(f"{path} does not exist")
            with path_.open("r") as f:
                return cls.from_text(f.read())
[docs]        @classmethod
        def from_url(cls, url: str) -> OpenAPISpec: