def unpack(self): return dict( commits=[ ScmCommit.from_json(element) for element in json.loads( UploadContext.from_zip(bytearray(self.commits))) ], sdk=None if self.sdk == '?' else self.sdk, test_results=json.loads( UploadContext.from_zip(bytearray(self.test_results))), timestamp=calendar.timegm(self.time_uploaded.timetuple()), version=self.upload_version, )
def test_find_range_uuid(self, client, **kwargs): self.register_all_commits(client) response = client.get( self.URL + '/api/commits?after_uuid=160166800000&before_uuid=160166800001') self.assertEqual(200, response.status_code) self.assertEqual( [Commit.from_json(element).hash for element in response.json()], [ 'bae5d1e90999d4f916a8a15810ccfa43f37a2fd6', 'd8bce26fa65c6fc8f39c17927abb77f69fab82fc', ], )
def test_register_with_partial_commit(self, client, **kwargs): with MockModelFactory.safari(), MockModelFactory.webkit( ), OutputCapture(): self.assertEqual( 200, client.post(self.URL + '/api/commits', data=dict(repository_id='safari', id='d8bce26fa65c')).status_code) response = client.get(self.URL + '/api/commits?repository_id=safari') self.assertEqual(200, response.status_code) self.assertEqual( Commit.from_json(response.json()[0]).message, 'Patch Series\n', ) self.assertEqual( 404, client.post(self.URL + '/api/commits', data=dict(repository_id='safari', id='aaaaaaaaaaaaa')).status_code) self.assertEqual( 200, client.post(self.URL + '/api/commits', data=dict(repository_id='webkit', id='6')).status_code) response = client.get(self.URL + '/api/commits?repository_id=webkit') self.assertEqual(200, response.status_code) self.assertEqual( Commit.from_json(response.json()[0]).message, '6th commit', ) self.assertEqual( 404, client.post(self.URL + '/api/commits', data=dict(repository_id='webkit', id='1234')).status_code)
def test_find_range_timestamp(self, client, **kwargs): self.register_all_commits(client) response = client.get( self.URL + '/api/commits?after_timestamp=1601637900&before_timestamp=1601639900' ) self.assertEqual(200, response.status_code) self.assertEqual( [ Commit.from_json(element).revision for element in response.json() ], [4, 6], )
def run_function_through_redis_cache(self, key, function): result = self.redis.get('commit_mapping:' + key) if result: try: result = [ Commit.from_json(element) for element in json.loads(result) ] except ValueError: result = None if result is None: result = function() if result: self.redis.set('commit_mapping:' + key, json.dumps(result, cls=Commit.Encoder), ex=self.cache_timeout) return result
def test_from_json_str(self): contributor = Contributor.from_scm_log( 'Author: [email protected] <*****@*****.**>') self.assertEqual( Commit.from_json('''{ "revision": 1, "hash": "c3bd784f8b88bd03f64467ddd3304ed8be28acbe", "identifier": "1@main", "timestamp": 1000, "author": "*****@*****.**", "message": "Message" }'''), Commit(revision=1, hash='c3bd784f8b88bd03f64467ddd3304ed8be28acbe', identifier='1@main', timestamp=1000, author=Contributor.Encoder().default(contributor), message='Message'), )
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, )