Source code for esgprep.fetchtables.context

# -*- coding: utf-8 -*-

"""
    :platform: Unix
    :synopsis: Processing context used in this module.

"""

from constants import *
from esgprep.utils.collectors import FilterCollection
from esgprep.utils.context import GitHubBaseContext
from esgprep.utils.custom_print import *
from esgprep.utils.github import gh_request_content


[docs]class ProcessingContext(GitHubBaseContext): """ Encapsulates the processing context/information for main process. :param ArgumentParser args: The command-line arguments parser :returns: The processing context :rtype: *ProcessingContext* """ def __init__(self, args): super(ProcessingContext, self).__init__(args) # Fetching context self.tables_dir = os.path.realpath(os.path.normpath(args.tables_dir)) self.no_subfolder = args.no_subfolder self.url = GITHUB_CONTENT_API self.ref_url = GITHUB_REFS_API # Fetching behavior if args.tag: self.ref = args.tag self.ref_url += '/tags' elif args.tag_regex: self.ref_regex = args.tag_regex self.ref_url += '/tags' elif args.branch_regex: self.ref_regex = args.branch_regex self.ref_url += '/heads' else: # if not set with --branch default is "master" self.ref = args.branch self.ref_url += '/heads' # Fetching filters self.file_filter = FilterCollection() if args.include_file: for regex in args.include_file: self.file_filter.add(regex=regex, inclusive=True) else: # Default include all files self.file_filter.add(regex='^.*$', inclusive=True) if args.exclude_file: for regex in args.exclude_file: self.file_filter.add(regex=regex, inclusive=False) else: # Default exclude hidden files self.file_filter.add(regex='^\..*$', inclusive=False) def __enter__(self): super(ProcessingContext, self).__enter__() # Get the project list to retrieve r = gh_request_content(GITHUB_REPOS_API, auth=self.auth) repos = [repo['name'] for repo in r.json() if re.search(REPO_NAME_PATTERN, repo['name'])] # Get the list of project to fetch p_found = set([re.search(REPO_NAME_PATTERN, repo).group(1) for repo in repos]) if self.project: p = set(self.project) p_avail = p_found.intersection(p) if p.difference(p_avail): msg = 'No such project(s): {} -- '.format(', '.join(p.difference(p_avail))) msg += 'Available remote projects are: {}'.format(', '.join(list(p_found))) Print.warning(msg) self.project = p_avail else: self.project = p_found return self