cirro.config

  1import configparser
  2import os
  3import re
  4from pathlib import Path
  5from typing import NamedTuple, Dict, Optional
  6
  7import requests
  8from requests import RequestException
  9
 10
 11class Constants:
 12    home = os.environ.get('CIRRO_HOME', '~/.cirro')
 13    config_path = Path(home, 'config.ini').expanduser()
 14    default_base_url = 'cirro.bio'
 15    default_max_retries = 10
 16
 17
 18class UserConfig(NamedTuple):
 19    auth_method: str
 20    auth_method_config: Dict  # This needs to match the init params of the auth method
 21    base_url: Optional[str]
 22    transfer_max_retries: Optional[int]
 23
 24
 25def extract_base_url(base_url: str):
 26    # remove http(s):// if it's there
 27    base_url = re.compile(r'https?://').sub('', base_url).strip()
 28    # remove anything after the first slash if it's there
 29    base_url = base_url.split('/')[0]
 30    return base_url
 31
 32
 33def save_user_config(user_config: UserConfig):
 34    original_user_config = load_user_config()
 35    ini_config = configparser.ConfigParser()
 36    ini_config['General'] = {
 37        'auth_method': user_config.auth_method,
 38        'base_url': user_config.base_url,
 39        'transfer_max_retries': Constants.default_max_retries
 40    }
 41    if original_user_config:
 42        ini_config['General']['transfer_max_retries'] = str(original_user_config.transfer_max_retries)
 43
 44    ini_config[user_config.auth_method] = user_config.auth_method_config
 45    Constants.config_path.parent.mkdir(exist_ok=True)
 46    with Constants.config_path.open('w') as configfile:
 47        ini_config.write(configfile)
 48
 49
 50def load_user_config() -> Optional[UserConfig]:
 51    if not Constants.config_path.exists():
 52        return None
 53
 54    try:
 55        ini_config = configparser.ConfigParser()
 56        ini_config.read(str(Constants.config_path.absolute()))
 57        main_config = ini_config['General']
 58        auth_method = main_config.get('auth_method')
 59        base_url = main_config.get('base_url')
 60        transfer_max_retries = main_config.getint('transfer_max_retries', Constants.default_max_retries)
 61
 62        if auth_method and ini_config.has_section(auth_method):
 63            auth_method_config = dict(ini_config[auth_method])
 64        else:
 65            auth_method_config = {}
 66
 67        return UserConfig(
 68            auth_method=auth_method,
 69            auth_method_config=auth_method_config,
 70            base_url=base_url,
 71            transfer_max_retries=transfer_max_retries
 72        )
 73    except Exception:
 74        raise RuntimeError('Configuration load error, please re-run configuration')
 75
 76
 77class AppConfig:
 78    def __init__(self, base_url: str = None):
 79        self.user_config = load_user_config()
 80        self.base_url = (base_url or
 81                         os.environ.get('CIRRO_BASE_URL') or
 82                         (self.user_config.base_url if self.user_config else None))
 83        if not self.base_url:
 84            raise RuntimeError('No base URL provided, please run cirro configure,'
 85                               ' set the CIRRO_BASE_URL environment variable, or provide the base_url parameter.')
 86        # remove http(s):// if it's there
 87        self.base_url = re.compile(r'https?://').sub('', self.base_url).strip()
 88        self.transfer_max_retries = self.user_config.transfer_max_retries\
 89            if self.user_config else Constants.default_max_retries
 90        self._init_config()
 91
 92    @property
 93    def checksum_method_display(self):
 94        return self.checksum_method.replace('NVME', '')
 95
 96    @property
 97    def checksum_method(self):
 98        return 'CRC64NVME'
 99
100    def _init_config(self):
101        self.rest_endpoint = f'https://{self.base_url}/api'
102        self.auth_endpoint = f'https://{self.base_url}/api/auth'
103
104        try:
105            info_resp = requests.get(f'{self.rest_endpoint}/info/system')
106            info_resp.raise_for_status()
107
108            info = info_resp.json()
109            self.client_id = info['auth']['sdkAppId']
110            self.user_pool_id = info['auth']['userPoolId']
111            self.references_bucket = info['referencesBucket']
112            self.resources_bucket = info['resourcesBucket']
113            self.region = info['region']
114        except RequestException:
115            raise RuntimeError(f'Failed connecting to {self.base_url}, please check your configuration')
class Constants:
12class Constants:
13    home = os.environ.get('CIRRO_HOME', '~/.cirro')
14    config_path = Path(home, 'config.ini').expanduser()
15    default_base_url = 'cirro.bio'
16    default_max_retries = 10
home = '~/.cirro'
config_path = PosixPath('/home/runner/.cirro/config.ini')
default_base_url = 'cirro.bio'
default_max_retries = 10
class UserConfig(typing.NamedTuple):
19class UserConfig(NamedTuple):
20    auth_method: str
21    auth_method_config: Dict  # This needs to match the init params of the auth method
22    base_url: Optional[str]
23    transfer_max_retries: Optional[int]

UserConfig(auth_method, auth_method_config, base_url, transfer_max_retries)

UserConfig( auth_method: str, auth_method_config: Dict, base_url: Optional[str], transfer_max_retries: Optional[int])

Create new instance of UserConfig(auth_method, auth_method_config, base_url, transfer_max_retries)

auth_method: str

Alias for field number 0

auth_method_config: Dict

Alias for field number 1

base_url: Optional[str]

Alias for field number 2

transfer_max_retries: Optional[int]

Alias for field number 3

def extract_base_url(base_url: str):
26def extract_base_url(base_url: str):
27    # remove http(s):// if it's there
28    base_url = re.compile(r'https?://').sub('', base_url).strip()
29    # remove anything after the first slash if it's there
30    base_url = base_url.split('/')[0]
31    return base_url
def save_user_config(user_config: UserConfig):
34def save_user_config(user_config: UserConfig):
35    original_user_config = load_user_config()
36    ini_config = configparser.ConfigParser()
37    ini_config['General'] = {
38        'auth_method': user_config.auth_method,
39        'base_url': user_config.base_url,
40        'transfer_max_retries': Constants.default_max_retries
41    }
42    if original_user_config:
43        ini_config['General']['transfer_max_retries'] = str(original_user_config.transfer_max_retries)
44
45    ini_config[user_config.auth_method] = user_config.auth_method_config
46    Constants.config_path.parent.mkdir(exist_ok=True)
47    with Constants.config_path.open('w') as configfile:
48        ini_config.write(configfile)
def load_user_config() -> Optional[UserConfig]:
51def load_user_config() -> Optional[UserConfig]:
52    if not Constants.config_path.exists():
53        return None
54
55    try:
56        ini_config = configparser.ConfigParser()
57        ini_config.read(str(Constants.config_path.absolute()))
58        main_config = ini_config['General']
59        auth_method = main_config.get('auth_method')
60        base_url = main_config.get('base_url')
61        transfer_max_retries = main_config.getint('transfer_max_retries', Constants.default_max_retries)
62
63        if auth_method and ini_config.has_section(auth_method):
64            auth_method_config = dict(ini_config[auth_method])
65        else:
66            auth_method_config = {}
67
68        return UserConfig(
69            auth_method=auth_method,
70            auth_method_config=auth_method_config,
71            base_url=base_url,
72            transfer_max_retries=transfer_max_retries
73        )
74    except Exception:
75        raise RuntimeError('Configuration load error, please re-run configuration')
class AppConfig:
 78class AppConfig:
 79    def __init__(self, base_url: str = None):
 80        self.user_config = load_user_config()
 81        self.base_url = (base_url or
 82                         os.environ.get('CIRRO_BASE_URL') or
 83                         (self.user_config.base_url if self.user_config else None))
 84        if not self.base_url:
 85            raise RuntimeError('No base URL provided, please run cirro configure,'
 86                               ' set the CIRRO_BASE_URL environment variable, or provide the base_url parameter.')
 87        # remove http(s):// if it's there
 88        self.base_url = re.compile(r'https?://').sub('', self.base_url).strip()
 89        self.transfer_max_retries = self.user_config.transfer_max_retries\
 90            if self.user_config else Constants.default_max_retries
 91        self._init_config()
 92
 93    @property
 94    def checksum_method_display(self):
 95        return self.checksum_method.replace('NVME', '')
 96
 97    @property
 98    def checksum_method(self):
 99        return 'CRC64NVME'
100
101    def _init_config(self):
102        self.rest_endpoint = f'https://{self.base_url}/api'
103        self.auth_endpoint = f'https://{self.base_url}/api/auth'
104
105        try:
106            info_resp = requests.get(f'{self.rest_endpoint}/info/system')
107            info_resp.raise_for_status()
108
109            info = info_resp.json()
110            self.client_id = info['auth']['sdkAppId']
111            self.user_pool_id = info['auth']['userPoolId']
112            self.references_bucket = info['referencesBucket']
113            self.resources_bucket = info['resourcesBucket']
114            self.region = info['region']
115        except RequestException:
116            raise RuntimeError(f'Failed connecting to {self.base_url}, please check your configuration')
AppConfig(base_url: str = None)
79    def __init__(self, base_url: str = None):
80        self.user_config = load_user_config()
81        self.base_url = (base_url or
82                         os.environ.get('CIRRO_BASE_URL') or
83                         (self.user_config.base_url if self.user_config else None))
84        if not self.base_url:
85            raise RuntimeError('No base URL provided, please run cirro configure,'
86                               ' set the CIRRO_BASE_URL environment variable, or provide the base_url parameter.')
87        # remove http(s):// if it's there
88        self.base_url = re.compile(r'https?://').sub('', self.base_url).strip()
89        self.transfer_max_retries = self.user_config.transfer_max_retries\
90            if self.user_config else Constants.default_max_retries
91        self._init_config()
user_config
base_url
transfer_max_retries
checksum_method_display
93    @property
94    def checksum_method_display(self):
95        return self.checksum_method.replace('NVME', '')
checksum_method
97    @property
98    def checksum_method(self):
99        return 'CRC64NVME'