diff options
Diffstat (limited to '')
-rw-r--r-- | cgitize/repo.py | 76 |
1 files changed, 41 insertions, 35 deletions
diff --git a/cgitize/repo.py b/cgitize/repo.py index 8ecbcf5..01b7430 100644 --- a/cgitize/repo.py +++ b/cgitize/repo.py @@ -9,14 +9,17 @@ from urllib.parse import urlsplit, urlunsplit class Repo: - @staticmethod - def extract_repo_name(repo_id): - return os.path.basename(repo_id) - - def __init__(self, repo_id, clone_url=None, owner=None, desc=None, + @classmethod + def from_config(cls, cfg): + if 'id' not in cfg: + raise ValueError('every repository must have its id defined') + return cls(cfg['id'], clone_url=cfg.get('clone_url'), + owner=cfg.get('owner'), desc=cfg.get('desc'), + homepage=cfg.get('homepage')) + + def __init__(self, name, clone_url=None, owner=None, desc=None, homepage=None): - self._repo_id = repo_id - self._repo_name = self.extract_repo_name(repo_id) + self._name = name self._clone_url = clone_url self._owner = owner self._desc = desc @@ -24,19 +27,15 @@ class Repo: def fill_defaults(self, config): if self._owner is None: - self._owner = config.default_owner + self._owner = config.main.default_owner def validate(self): if self.clone_url is None: raise RuntimeError('upstream repository URL must be specified') @property - def repo_id(self): - return self._repo_id - - @property - def repo_name(self): - return self._repo_name + def name(self): + return self._name @property def clone_url(self): @@ -54,7 +53,7 @@ class Repo: return self.homepage if self.clone_url: return self.clone_url - return self.repo_name + return self.name @property def homepage(self): @@ -66,21 +65,32 @@ class Repo: class HostedRepo(Repo, abc.ABC): + @classmethod + def from_config(cls, cfg): + if 'id' not in cfg: + raise ValueError('every repository must have its id defined') + return cls(cfg['id'], owner=cfg.get('owner'), desc=cfg.get('desc'), + homepage=cfg.get('homepage')) + + @staticmethod + def split_repo_id(repo_id): + components = repo_id.split('/') + if len(components) != 2: + raise ValueError(f'repository ID must be in the USER/NAME format: {repo_id}') + user, name = components + return user, name + def __init__(self, repo_id, owner=None, desc=None, homepage=None, - user=None, via_ssh=True): - super().__init__(repo_id, clone_url=None, owner=owner, desc=desc, + via_ssh=True): + user, name = self.split_repo_id(repo_id) + super().__init__(name, clone_url=None, owner=owner, desc=desc, homepage=homepage) self._user = user self._via_ssh = via_ssh def fill_defaults(self, config): super().fill_defaults(config) - self._via_ssh = config.via_ssh - - def validate(self): - super().validate() - if self.user is None: - raise RuntimeError(f'neither explicit or default {self.provider_name} username was specified') + self._via_ssh = config.main.via_ssh @property def user(self): @@ -127,9 +137,7 @@ class GitHub(HostedRepo): def fill_defaults(self, config): super().fill_defaults(config) - if self._user is None: - self._user = config.github_username - self._access_token = config.github_access_token + self._access_token = config.github.access_token @property def provider_name(self): @@ -137,7 +145,7 @@ class GitHub(HostedRepo): @property def homepage(self): - return f'https://github.com/{self.user}/{self.repo_name}' + return f'https://github.com/{self.user}/{self.name}' @property def url_auth(self): @@ -147,11 +155,11 @@ class GitHub(HostedRepo): @property def clone_url_ssh(self): - return f'ssh://git@github.com/{self.user}/{self.repo_name}.git' + return f'ssh://git@github.com/{self.user}/{self.name}.git' @property def clone_url_https(self): - return f'https://github.com/{self.user}/{self.repo_name}.git' + return f'https://github.com/{self.user}/{self.name}.git' class Bitbucket(HostedRepo): @@ -161,9 +169,7 @@ class Bitbucket(HostedRepo): def fill_defaults(self, config): super().fill_defaults(config) - if self._user is None: - self._user = config.bitbucket_username - self._app_password = config.bitbucket_app_password + self._app_password = config.bitbucket.app_password @property def provider_name(self): @@ -171,7 +177,7 @@ class Bitbucket(HostedRepo): @property def homepage(self): - return f'https://bitbucket.org/{self.user}/{self.repo_name.lower()}' + return f'https://bitbucket.org/{self.user}/{self.name.lower()}' @property def url_auth(self): @@ -181,8 +187,8 @@ class Bitbucket(HostedRepo): @property def clone_url_ssh(self): - return f'ssh://git@bitbucket.org/{self.user}/{self.repo_name}.git' + return f'ssh://git@bitbucket.org/{self.user}/{self.name}.git' @property def clone_url_https(self): - return f'https://bitbucket.org/{self.user}/{self.repo_name}.git' + return f'https://bitbucket.org/{self.user}/{self.name}.git' |