返回类层次结构底部的值的策略

时间:2016-03-31 22:37:50

标签: python-2.7 oop gerrit

我正在使用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方法返回生成器对象。什么是最有效和可扩展的设计模式?

0 个答案:

没有答案