Source code for IGitt.GitHub.GitHubOrganization
"""
Here you go: GitHub organizations can be used in IGitt.
"""
from functools import lru_cache
from typing import Set
from typing import Optional
from urllib.parse import quote_plus
from IGitt.GitHub import GitHubToken
from IGitt.GitHub import GH_INSTANCE_URL
from IGitt.GitHub import GitHubMixin
from IGitt.GitHub.GitHubIssue import GitHubIssue
from IGitt.GitHub.GitHubUser import GitHubUser
from IGitt.Interfaces import get
from IGitt.Interfaces.Organization import Organization
from IGitt.Interfaces.Repository import Repository
GH_ISSUE_STATE_TRANSLATION = {
'opened': 'open',
'closed': 'closed',
'all': 'all'
}
[docs]class GitHubOrganization(GitHubMixin, Organization):
"""
Represents an organization on GitHub.
"""
@property
def web_url(self):
return '{}/{}'.format(GH_INSTANCE_URL, self.name)
def __init__(self, token, name):
"""
:param name: Name of the org.
"""
self._token = token
self._name = name
self._url = '/orgs/{name}'.format(name=quote_plus(name))
@property
def identifier(self) -> int:
"""
Returns the identifier of the organization.
"""
return self.data['id']
@property
def description(self) -> str:
"""
Returns the description of this organization.
"""
return self.data['description']
@property
def billable_users(self) -> int:
"""
Number of paying/registered users on the organization.
"""
try:
return len(get(self._token, self.url + '/members'))
except RuntimeError:
return 1
@property
def owners(self) -> Set[GitHubUser]:
"""
Returns the user handles of all admin users.
"""
try:
return {
GitHubUser.from_data(user, self._token, user['login'])
for user in get(
self._token, self.url + '/members',
params={'role': 'admin'}
)
}
except RuntimeError:
return {GitHubUser(self._token, self.name)}
@property
def masters(self) -> Set[GitHubUser]:
"""
Gets all owners (because there's no masters role on GitHub).
"""
return self.owners
@property
def name(self) -> str:
"""
The name of the organization.
"""
return self._name
@property
def suborgs(self) -> Set[Organization]:
"""
Returns the sub-organizations within this repository.
"""
return set()
@property
@lru_cache(None)
def repositories(self) -> Set[Repository]:
"""
Returns the list of repositories contained in this organization.
"""
from IGitt.GitHub.GitHubRepository import GitHubRepository
return {GitHubRepository.from_data(repo, self._token, repo['id'])
for repo in get(self._token, self.url + '/repos')}
[docs] def filter_issues(self,
state: Optional[str]=None,
label: Optional[str]=None,
assignee: Optional[str]=None) -> Set[GitHubIssue]:
"""
Filters the issues in the organization based on properties
:param state: 'opened' or 'closed' or 'all'.
:param label: Label of the issue
:param assignee: username of issue assignee
:return: Set of GitHubIssue objects
"""
from IGitt.GitHub.GitHub import GitHub
query = 'user:' + self.name
if state:
query += ' state:' + GH_ISSUE_STATE_TRANSLATION[state]
if label:
query += ' label:' + label
if assignee:
query += ' assignee:' + assignee
return set(GitHub.raw_search(self._token, query))
@property
def issues(self) -> Set[GitHubIssue]:
"""
Returns the set of Issues in this organization.
"""
return self.filter_issues(state='opened')
[docs] @staticmethod
def create(token: GitHubToken,
name: str,
path: str,
parent_id: Optional[int]=None,
description: Optional[str]=None,
visibility: str='private',
lfs_enabled: bool=False,
request_access_enabled: bool=False) -> Organization:
"""
GitHub does not allow creating new organizations via the API.
"""
raise NotImplementedError('GitHub does not allow creating '
'new organizations via the API as of now.')