def upload( self, filename: str, filedata: Optional[bytes] = None, filepath: Optional[str] = None, **kwargs: Any, ) -> Dict[str, Any]: """Upload the specified file into the project. .. note:: Either ``filedata`` or ``filepath`` *MUST* be specified. Args: filename: The name of the file being uploaded filedata: The raw data of the file being uploaded filepath: The path to a local file to upload (optional) Raises: GitlabConnectionError: If the server cannot be reached GitlabUploadError: If the file upload fails GitlabUploadError: If ``filedata`` and ``filepath`` are not specified GitlabUploadError: If both ``filedata`` and ``filepath`` are specified Returns: A ``dict`` with the keys: * ``alt`` - The alternate text for the upload * ``url`` - The direct url to the uploaded file * ``markdown`` - Markdown for the uploaded file """ if filepath is None and filedata is None: raise exc.GitlabUploadError("No file contents or path specified") if filedata is not None and filepath is not None: raise exc.GitlabUploadError( "File contents and file path specified") if filepath is not None: with open(filepath, "rb") as f: filedata = f.read() url = f"/projects/{self.id}/uploads" file_info = {"file": (filename, filedata)} data = self.manager.gitlab.http_post(url, files=file_info) if TYPE_CHECKING: assert isinstance(data, dict) return { "alt": data["alt"], "url": data["url"], "markdown": data["markdown"] }
def upload(self, filename, filedata=None, filepath=None, **kwargs): """Upload the specified file into the project. .. note:: Either ``filedata`` or ``filepath`` *MUST* be specified. Args: filename (str): The name of the file being uploaded filedata (bytes): The raw data of the file being uploaded filepath (str): The path to a local file to upload (optional) Raises: GitlabConnectionError: If the server cannot be reached GitlabUploadError: If the file upload fails GitlabUploadError: If ``filedata`` and ``filepath`` are not specified GitlabUploadError: If both ``filedata`` and ``filepath`` are specified Returns: dict: A ``dict`` with the keys: * ``alt`` - The alternate text for the upload * ``url`` - The direct url to the uploaded file * ``markdown`` - Markdown for the uploaded file """ if filepath is None and filedata is None: raise exc.GitlabUploadError("No file contents or path specified") if filedata is not None and filepath is not None: raise exc.GitlabUploadError( "File contents and file path specified") if filepath is not None: with open(filepath, "rb") as f: filedata = f.read() url = "/projects/%(id)s/uploads" % {"id": self.id} file_info = {"file": (filename, filedata)} data = self.manager.gitlab.http_post(url, files=file_info) return { "alt": data["alt"], "url": data["url"], "markdown": data["markdown"] }
def upload( self, package_name: str, package_version: str, file_name: str, path: Union[str, Path], **kwargs: Any, ) -> GenericPackage: """Upload a file as a generic package. Args: package_name: The package name. Must follow generic package name regex rules package_version: The package version. Must follow semantic version regex rules file_name: The name of the file as uploaded in the registry path: The path to a local file to upload Raises: GitlabConnectionError: If the server cannot be reached GitlabUploadError: If the file upload fails GitlabUploadError: If ``filepath`` cannot be read Returns: An object storing the metadata of the uploaded package. https://docs.gitlab.com/ee/user/packages/generic_packages/ """ try: with open(path, "rb") as f: file_data = f.read() except OSError: raise exc.GitlabUploadError(f"Failed to read package file {path}") url = f"{self._computed_path}/{package_name}/{package_version}/{file_name}" server_data = self.gitlab.http_put(url, post_data=file_data, raw=True, **kwargs) if TYPE_CHECKING: assert isinstance(server_data, dict) return self._obj_cls( self, attrs={ "package_name": package_name, "package_version": package_version, "file_name": file_name, "path": path, "message": server_data["message"], }, )