def representations(self): AssertRequest.is_type() AssertRequest.no_query() return jsonify({ key: repository.representations() for key, repository in self.commit_context.repositories.items() })
def library(self, path): AssertRequest.no_query() AssertRequest.is_type() path_split = os.path.split(path) return send_from_directory( os.path.join(os.path.abspath(os.path.dirname(__file__)), 'static/library', *path_split[:-1]), path_split[-1])
def register(self, commit=None): is_endpoint = not bool(commit) if is_endpoint: AssertRequest.is_type(['POST']) AssertRequest.no_query() if is_endpoint: try: commit = request.form or json.loads(request.get_data()) if 'api_key' in commit: del commit['api_key'] except ValueError: abort(400, description='Expected uploaded data to be json') try: self.commit_context.register_commit(Commit.from_json(commit)) if is_endpoint: return jsonify({'status': 'ok'}) return Commit.from_json(commit) except ValueError: pass required_args = ['repository_id', 'id'] optional_args = ['branch'] for arg in required_args: if arg not in commit: abort(400, description=f"'{arg}' required to define commit") for arg in commit.keys(): if arg in required_args + optional_args: continue if arg in ['timestamp', 'order', 'committer', 'message']: abort( 400, description= 'Not enough arguments provided to define a commit, but too many to search for a commit' ) abort(400, description=f"'{arg}' is not valid for defining commits") try: commit = self.commit_context.register_commit_with_repo_and_id( repository_id=commit.get('repository_id'), branch=commit.get('branch'), commit_id=commit.get('id'), ) except (RuntimeError, SCMException) as error: abort(404, description=str(error)) if is_endpoint: return jsonify({'status': 'ok'}) return commit
def upload(self): if request.method == 'GET': return self.download() AssertRequest.is_type(['POST']) AssertRequest.no_query() with self.upload_context: try: data = request.form or json.loads(request.get_data()) except ValueError: abort(400, description='Expected uploaded data to be json') try: configuration = Configuration.from_json( data.get('configuration', {})) except (ValueError, TypeError): abort(400, description='Invalid configuration') suite = data.get('suite') if not suite: abort(400, description='No test suite specified') commits = [ self.commit_controller.register(commit=commit, fast=True) for commit in data.get('commits', []) ] test_results = data.get('test_results', {}) if not test_results: abort(400, description='No test results specified') timestamp = data.get('timestamp', time.time()) version = data.get('version', 0) try: self.upload_context.upload_test_results(configuration, commits, suite, test_results, timestamp, version=version) except (TypeError, ValueError) as error: abort(400, description=str(error)) processing_results = self.upload_context.process_test_results( configuration, commits, suite, test_results, timestamp) return jsonify(dict(status='ok', processing=processing_results))
def upload(self): AssertRequest.is_type(['POST']) AssertRequest.no_query() with self.archive_context: if 'file' not in request.files: abort(400, description='No archive provided') archive = io.BytesIO(request.files['file'].read()) try: data = request.form or json.loads(request.get_data()) except ValueError: abort(400, description='Expected meta-data to be json') try: configuration = Configuration.from_json(data.get('configuration', {})) except (ValueError, TypeError) as e: abort(400, description=f'Invalid configuration, error: {e}') suite = data.get('suite') if not suite: abort(400, description='No test suite specified') try: commits = [self.commit_controller.register(commit=commit) for commit in json.loads(data.get('commits', '[]'))] except ValueError: abort(400, description='Expected commit meta-data to be json') if not commits: abort(400, description='No commits provided') timestamp = data.get('timestamp', time.time()) try: self.archive_context.register(archive, configuration, commits, suite, timestamp) except (TypeError, ValueError) as error: abort(400, description=str(error)) return jsonify(dict(status='ok'))
def register(self, commit=None, fast=True): is_endpoint = not bool(commit) if is_endpoint: AssertRequest.is_type(['POST']) AssertRequest.no_query() if is_endpoint: try: commit = request.form or json.loads(request.get_data()) if 'api_key' in commit: del commit['api_key'] except ValueError: abort(400, description='Expected uploaded data to be json') try: candidate = ScmCommit.from_json(commit) # Commit needs to be sufficiently defined if candidate.repository_id and candidate.branch and candidate.timestamp and ( candidate.revision or candidate.hash): self.commit_context.register_commit(candidate) if is_endpoint: return jsonify({'status': 'ok'}) return candidate except ValueError: pass required_args = ['repository_id'] for arg in required_args: if arg not in commit: abort(400, description=f"'{arg}' required to define commit") has_ref = False one_of_args = ['id', 'ref', 'hash', 'revision', 'identifier'] for arg in one_of_args: if arg in commit: if has_ref: abort(400, description='Multiple commit references specified') has_ref = True if not has_ref: abort(400, description='No commit reference specified') for arg in commit.keys(): if arg in required_args or arg in one_of_args: continue if arg in ['branch', 'timestamp', 'order', 'committer', 'message']: abort( 400, description= 'Not enough arguments provided to define a commit, but too many to search for a commit' ) abort(400, description=f"'{arg}' is not valid for defining commits") try: commit = self.commit_context.register_partial_commit( repository_id=commit.get('repository_id'), ref=commit.get('id') or commit.get('ref'), hash=commit.get('hash'), revision=commit.get('revision'), identifier=commit.get('identifier'), fast=fast, ) except (RuntimeError, ScmBase.Exception) as error: abort(404, description=str(error)) if is_endpoint: return jsonify({'status': 'ok'}) return Commit( repository_id=commit.repository_id, id=commit.revision or commit.hash, branch=commit.branch, timestamp=commit.timestamp, order=commit.order, committer=commit.author.email if commit.author else None, message=commit.message, )
def repositories(self): AssertRequest.is_type() AssertRequest.no_query() return jsonify(sorted(self.commit_context.repositories.keys()))