cirro.models.file

  1from dataclasses import dataclass
  2from pathlib import PurePath
  3from typing import TypedDict, Dict, Optional
  4
  5from cirro_api_client.v1.models import FileAccessRequest, AccessType, FileEntry
  6
  7from cirro.models.s3_path import S3Path
  8
  9
 10class DirectoryStatistics(TypedDict):
 11    size: float
 12    sizeFriendly: str
 13    numberOfFiles: int
 14
 15
 16class FileAccessContext:
 17    """
 18    Context holder for accessing various files in Cirro and abstracting out their location.
 19    Prefer to use the class methods to instantiate.
 20    """
 21    def __init__(self,
 22                 file_access_request: FileAccessRequest,
 23                 project_id: str,
 24                 base_url: str):
 25        self.file_access_request = file_access_request
 26        self.base_url = base_url
 27        self.project_id = project_id
 28        self._s3_path = S3Path(base_url)
 29
 30    @classmethod
 31    def download(cls, project_id: str, base_url: str, token_lifetime_override: int = None):
 32        return cls(
 33            file_access_request=FileAccessRequest(
 34                access_type=AccessType.PROJECT_DOWNLOAD,
 35                token_lifetime_hours=token_lifetime_override
 36            ),
 37            base_url=base_url,
 38            project_id=project_id
 39        )
 40
 41    @classmethod
 42    def upload_dataset(cls, project_id: str, dataset_id: str, base_url: str, token_lifetime_override: int = None):
 43        return cls(
 44            file_access_request=FileAccessRequest(
 45                access_type=AccessType.DATASET_UPLOAD,
 46                dataset_id=dataset_id,
 47                token_lifetime_hours=token_lifetime_override
 48            ),
 49            base_url=f'{base_url}/data',
 50            project_id=project_id
 51        )
 52
 53    @classmethod
 54    def upload_reference(cls, project_id: str, base_url: str):
 55        return cls(
 56            file_access_request=FileAccessRequest(
 57                access_type=AccessType.REFERENCE_UPLOAD
 58            ),
 59            base_url=base_url,
 60            project_id=project_id
 61        )
 62
 63    @classmethod
 64    def upload_sample_sheet(cls, project_id: str, dataset_id: str, base_url: str):
 65        return cls(
 66            file_access_request=FileAccessRequest(
 67                access_type=AccessType.SAMPLESHEET_UPLOAD,
 68                dataset_id=dataset_id
 69            ),
 70            base_url=base_url,
 71            project_id=project_id
 72        )
 73
 74    @property
 75    def bucket(self) -> str:
 76        """ S3 Bucket """
 77        return self._s3_path.bucket
 78
 79    @property
 80    def prefix(self) -> str:
 81        """ S3 Prefix """
 82        return self._s3_path.key
 83
 84
 85@dataclass(frozen=True)
 86class File:
 87    relative_path: str
 88    size: int
 89    access_context: FileAccessContext
 90    metadata: Optional[Dict] = None
 91
 92    @classmethod
 93    def from_file_entry(cls, file: FileEntry, project_id: str, domain: str = None):
 94        # Path is absolute rather than relative
 95        if 's3://' in file.path:
 96            parts = S3Path(file.path)
 97            domain = parts.base
 98            path = parts.key
 99        else:
100            path = file.path
101
102        return cls(
103            relative_path=path,
104            metadata=file.metadata.additional_properties,
105            size=file.size,
106            access_context=FileAccessContext.download(project_id=project_id, base_url=domain)
107        )
108
109    @property
110    def absolute_path(self):
111        return f'{self.access_context.base_url}/{self.relative_path.strip("/")}'
112
113    @property
114    def name(self):
115        return PurePath(self.absolute_path).name
116
117    def __repr__(self):
118        return f'{self.__class__.__name__}(path={self.relative_path})'
class DirectoryStatistics(typing.TypedDict):
11class DirectoryStatistics(TypedDict):
12    size: float
13    sizeFriendly: str
14    numberOfFiles: int
size: float
sizeFriendly: str
numberOfFiles: int
Inherited Members
builtins.dict
get
setdefault
pop
popitem
keys
items
values
update
fromkeys
clear
copy
class FileAccessContext:
17class FileAccessContext:
18    """
19    Context holder for accessing various files in Cirro and abstracting out their location.
20    Prefer to use the class methods to instantiate.
21    """
22    def __init__(self,
23                 file_access_request: FileAccessRequest,
24                 project_id: str,
25                 base_url: str):
26        self.file_access_request = file_access_request
27        self.base_url = base_url
28        self.project_id = project_id
29        self._s3_path = S3Path(base_url)
30
31    @classmethod
32    def download(cls, project_id: str, base_url: str, token_lifetime_override: int = None):
33        return cls(
34            file_access_request=FileAccessRequest(
35                access_type=AccessType.PROJECT_DOWNLOAD,
36                token_lifetime_hours=token_lifetime_override
37            ),
38            base_url=base_url,
39            project_id=project_id
40        )
41
42    @classmethod
43    def upload_dataset(cls, project_id: str, dataset_id: str, base_url: str, token_lifetime_override: int = None):
44        return cls(
45            file_access_request=FileAccessRequest(
46                access_type=AccessType.DATASET_UPLOAD,
47                dataset_id=dataset_id,
48                token_lifetime_hours=token_lifetime_override
49            ),
50            base_url=f'{base_url}/data',
51            project_id=project_id
52        )
53
54    @classmethod
55    def upload_reference(cls, project_id: str, base_url: str):
56        return cls(
57            file_access_request=FileAccessRequest(
58                access_type=AccessType.REFERENCE_UPLOAD
59            ),
60            base_url=base_url,
61            project_id=project_id
62        )
63
64    @classmethod
65    def upload_sample_sheet(cls, project_id: str, dataset_id: str, base_url: str):
66        return cls(
67            file_access_request=FileAccessRequest(
68                access_type=AccessType.SAMPLESHEET_UPLOAD,
69                dataset_id=dataset_id
70            ),
71            base_url=base_url,
72            project_id=project_id
73        )
74
75    @property
76    def bucket(self) -> str:
77        """ S3 Bucket """
78        return self._s3_path.bucket
79
80    @property
81    def prefix(self) -> str:
82        """ S3 Prefix """
83        return self._s3_path.key

Context holder for accessing various files in Cirro and abstracting out their location. Prefer to use the class methods to instantiate.

FileAccessContext( file_access_request: cirro_api_client.v1.models.FileAccessRequest, project_id: str, base_url: str)
22    def __init__(self,
23                 file_access_request: FileAccessRequest,
24                 project_id: str,
25                 base_url: str):
26        self.file_access_request = file_access_request
27        self.base_url = base_url
28        self.project_id = project_id
29        self._s3_path = S3Path(base_url)
file_access_request
base_url
project_id
@classmethod
def download( cls, project_id: str, base_url: str, token_lifetime_override: int = None):
31    @classmethod
32    def download(cls, project_id: str, base_url: str, token_lifetime_override: int = None):
33        return cls(
34            file_access_request=FileAccessRequest(
35                access_type=AccessType.PROJECT_DOWNLOAD,
36                token_lifetime_hours=token_lifetime_override
37            ),
38            base_url=base_url,
39            project_id=project_id
40        )
@classmethod
def upload_dataset( cls, project_id: str, dataset_id: str, base_url: str, token_lifetime_override: int = None):
42    @classmethod
43    def upload_dataset(cls, project_id: str, dataset_id: str, base_url: str, token_lifetime_override: int = None):
44        return cls(
45            file_access_request=FileAccessRequest(
46                access_type=AccessType.DATASET_UPLOAD,
47                dataset_id=dataset_id,
48                token_lifetime_hours=token_lifetime_override
49            ),
50            base_url=f'{base_url}/data',
51            project_id=project_id
52        )
@classmethod
def upload_reference(cls, project_id: str, base_url: str):
54    @classmethod
55    def upload_reference(cls, project_id: str, base_url: str):
56        return cls(
57            file_access_request=FileAccessRequest(
58                access_type=AccessType.REFERENCE_UPLOAD
59            ),
60            base_url=base_url,
61            project_id=project_id
62        )
@classmethod
def upload_sample_sheet(cls, project_id: str, dataset_id: str, base_url: str):
64    @classmethod
65    def upload_sample_sheet(cls, project_id: str, dataset_id: str, base_url: str):
66        return cls(
67            file_access_request=FileAccessRequest(
68                access_type=AccessType.SAMPLESHEET_UPLOAD,
69                dataset_id=dataset_id
70            ),
71            base_url=base_url,
72            project_id=project_id
73        )
bucket: str
75    @property
76    def bucket(self) -> str:
77        """ S3 Bucket """
78        return self._s3_path.bucket

S3 Bucket

prefix: str
80    @property
81    def prefix(self) -> str:
82        """ S3 Prefix """
83        return self._s3_path.key

S3 Prefix

@dataclass(frozen=True)
class File:
 86@dataclass(frozen=True)
 87class File:
 88    relative_path: str
 89    size: int
 90    access_context: FileAccessContext
 91    metadata: Optional[Dict] = None
 92
 93    @classmethod
 94    def from_file_entry(cls, file: FileEntry, project_id: str, domain: str = None):
 95        # Path is absolute rather than relative
 96        if 's3://' in file.path:
 97            parts = S3Path(file.path)
 98            domain = parts.base
 99            path = parts.key
100        else:
101            path = file.path
102
103        return cls(
104            relative_path=path,
105            metadata=file.metadata.additional_properties,
106            size=file.size,
107            access_context=FileAccessContext.download(project_id=project_id, base_url=domain)
108        )
109
110    @property
111    def absolute_path(self):
112        return f'{self.access_context.base_url}/{self.relative_path.strip("/")}'
113
114    @property
115    def name(self):
116        return PurePath(self.absolute_path).name
117
118    def __repr__(self):
119        return f'{self.__class__.__name__}(path={self.relative_path})'
File( relative_path: str, size: int, access_context: FileAccessContext, metadata: Optional[Dict] = None)
relative_path: str
size: int
access_context: FileAccessContext
metadata: Optional[Dict] = None
@classmethod
def from_file_entry( cls, file: cirro_api_client.v1.models.FileEntry, project_id: str, domain: str = None):
 93    @classmethod
 94    def from_file_entry(cls, file: FileEntry, project_id: str, domain: str = None):
 95        # Path is absolute rather than relative
 96        if 's3://' in file.path:
 97            parts = S3Path(file.path)
 98            domain = parts.base
 99            path = parts.key
100        else:
101            path = file.path
102
103        return cls(
104            relative_path=path,
105            metadata=file.metadata.additional_properties,
106            size=file.size,
107            access_context=FileAccessContext.download(project_id=project_id, base_url=domain)
108        )
absolute_path
110    @property
111    def absolute_path(self):
112        return f'{self.access_context.base_url}/{self.relative_path.strip("/")}'
name
114    @property
115    def name(self):
116        return PurePath(self.absolute_path).name