Beispiel #1
0
 def representations(self):
     AssertRequest.is_type()
     AssertRequest.no_query()
     return jsonify({
         key: repository.representations()
         for key, repository in self.commit_context.repositories.items()
     })
Beispiel #2
0
 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])
Beispiel #3
0
    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
Beispiel #4
0
    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))
Beispiel #5
0
    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'))
Beispiel #6
0
    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,
        )
Beispiel #7
0
 def repositories(self):
     AssertRequest.is_type()
     AssertRequest.no_query()
     return jsonify(sorted(self.commit_context.repositories.keys()))