我正在使用Gerrit REST API
,并负责定期解析所有提交的内容并将其放入AWS
数据库进行分析。要获得提交,我首先需要获取所有项目的列表,然后在这些项目中获取每个更改的所有更改和修订的列表,最后我可以使用该信息来获取单个提交。
为了解决这个问题,我创建了一个类的层次结构,其中Project
包含1到多个Change
,其中包含1到多个Commit
' s 。每个Commit
都有write_data
方法,因此我可以轻松地将它们写入平面文件以上传到S3
。我正在寻找一些策略,我可以最有效地解析并创建一个"级联"我为每个项目启动一个单独的线程,然后填充每个更改,然后填充一个提交列表,然后每个线程将返回一个包含提交对象的列表,以便于编写。以下是三个类:
class Project(object):
def __init__(self, name):
self.name = name
self.changes = []
def add_changes(self, changes_list):
for change in changes_list:
self.changes.append(Change(
project=self.name,
change_id=change['change_id'],
_id=change['id'],
revision_list=change['revisions']
))
def return_results(self, ger_obj, start=0):
while True:
endpoint = (r'/changes/?q=project:{project}&o=ALL_REVISIONS&'
r'S={num}'.format(
project=self.name,
num=start
))
print 'Endpoint: {}'.format(endpoint)
try:
changes = ger_obj.get(endpoint)
self.add_changes(changes_list=changes)
except HTTPError:
break
start += 500
try:
if not changes[-1].get('_more_changes'):
break
except IndexError:
break
class Change(object):
def __init__(self, project, change_id, _id, revision_list):
self.project = project
self.change_id = change_id
logging.info('Change id is', self.change_id)
self.id = _id
self.commits = [Commit(rid, change_id)
for rid in revision_list.keys()]
def _return_commits(self):
return self.commits
class Commit(object):
def __init__(self, rev_id, change_id):
self.rev_id = rev_id
self.change_id = change_id
def return_results(self, ger_obj):
endpoint = (r'/changes/{c_id}/revisions/{r_id}/commit'.format(
c_id=self.change_id,
r_id=self.rev_id
))
logging.info('Endpoint: {}'.format(endpoint))
self.data = ger_obj.get(endpoint)
def write_data(self, writer):
self.data['message'].encode('string_escape').replace('|', '[pipe]')
writer.writerow(self.data)
我在想,聚合所有提交的最佳时机可能是让每个Change
对象在填充后返回它的提交,然后我可以在线程完成时继续添加它们。或者我想要甚至不在每个Change
中存储Project
,并且可能从add_changes
方法返回生成器对象。什么是最有效和可扩展的设计模式?