def __init__( self, repo: str = None, path: str = None, tag: str = None, branch: str = None, commit: str = None, ): if repo is None: raise SourceFileError("repo must be given") if not self.__class__.valid_repo.match(repo): raise SourceFileError( "repo {} is not a valid repo specification (must be given as owner/name)." ) _check_git_args(tag, branch, commit) if path is None: raise SourceFileError("path must be given") if not all( isinstance(item, str) for item in (repo, path, tag, branch, commit) if item is not None): raise SourceFileError("arguments must be given as str.") self.repo = repo self.tag = tag self.commit = commit self.branch = branch self.path = path.strip("/")
def infer_source_file(path_or_uri, basedir: SourceFile = None): if isinstance(path_or_uri, SourceFile): if basedir is None or isinstance(path_or_uri, HostingProviderFile): return path_or_uri else: path_or_uri = path_or_uri.get_path_or_uri() if isinstance(path_or_uri, Path): path_or_uri = str(path_or_uri) if not isinstance(path_or_uri, str): raise SourceFileError( "must be given as Python string or one of the predefined source file marker types (see docs)" ) if is_local_file(path_or_uri): # either local file or relative to some remote basedir for schema in ("file://", "file:"): if path_or_uri.startswith(schema): path_or_uri = path_or_uri[len(schema):] break if not os.path.isabs(path_or_uri) and basedir is not None: return basedir.join(path_or_uri) return LocalSourceFile(path_or_uri) if path_or_uri.startswith("git+file:"): try: root_path, file_path, ref = split_git_path(path_or_uri) except Exception as e: raise WorkflowError( f"Failed to read source {path_or_uri} from git repo.", e) return LocalGitFile(root_path, file_path, ref=ref) # something else return GenericSourceFile(path_or_uri)
def _check_git_args(tag: str = None, branch: str = None, commit: str = None): n_refs = sum(1 for ref in (tag, branch, commit) if ref is not None) if n_refs != 1: raise SourceFileError( "exactly one of tag, branch, or commit must be specified.")