2020软工第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020/
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 - 挑战人类极限
- 学会git的使用
- 了解命令行解析
- 了解json文件的解析
学号 031802214

一、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 60
Estimate 估计这个任务需要多少时间 180 180
Development 开发 120 180
Analysis 需求分析 (包括学习新技术) 150 180
Design Spec 生成设计文档 30 30
Design Review 设计复审 20 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 30
Design 具体设计 90 120
Coding 具体编码 60 90
Code Review 代码复审 60 60
Test 测试(自我测试,修改代码,提交修改) 30 60
Reporting 报告 30 30
Test Report 测试报告 10 10
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
合计 890 1100

二、解题思路

1.兴致勃勃的打开题目,但是第一眼看到题目,我直接开始怀疑人生,这是啥,这又是啥

2.对于题目本身无可奈何,只能先上 b 站学习git的使用众所周知,哔哩哔哩是个学习网站,学习了git的命令行,了解如何创建仓库、如何上传文件、同步仓库、从 github 上 clone 项目等等,算是初步掌握了git的使用。

3.后来在 dalao 和百度的帮助下,能看懂题目了,了解了大致步骤。

4.命令行的学习:GHAnalysis <--init|-i> <path to data>,了解了这玩意是命令行之后,就开始了学习如何用 python 处理这种命令 ——> python 的 argparse 模块 ——> 学习使用 argparse 模块。

  1. json 文件的解析:了解到要处理 json 文件需要 json模块 ——> 学习了 json 模块的使用以及如何处理 json 文件。

三、实现过程

四、代码说明

添加命令行参数

    def argInit(self):
        self.parser.add_argument('-i', '--init')
        self.parser.add_argument('-u', '--user')
        self.parser.add_argument('-r', '--repo')
        self.parser.add_argument('-e', '--event')

命令解析

    def analyse(self):
        if self.parser.parse_args().init:
            self.data = Data(self.parser.parse_args().init, 1)
            return 0
        else:
            if self.data is None:
                self.data = Data()
            if self.parser.parse_args().event:
                if self.parser.parse_args().user:
                    if self.parser.parse_args().repo:
                        res = self.data.getEventsUsersAndRepos(
                            self.parser.parse_args().user, self.parser.parse_args().repo, self.parser.parse_args().event)
                    else:
                        res = self.data.getEventsUsers(
                            self.parser.parse_args().user, self.parser.parse_args().event)
                elif self.parser.parse_args().repo:
                    res = self.data.getEventsRepos(
                        self.parser.parse_args().reop, self.parser.parse_args().event)
                else:
                    raise RuntimeError('error: argument -l or -c are required')
            else:
                raise RuntimeError('error: argument -e is required')
        return res

初始化

    def __init__(self, dict_address: int = None, reload: int = 0):
        if reload == 1:
            self.__init(dict_address)
        if dict_address is None and not os.path.exists('1.json') and not os.path.exists('2.json') and not os.path.exists('3.json'):
            raise RuntimeError('error: init failed')
        x = open('1.json', 'r', encoding='utf-8').read()
        self.__4Events4PerP = json.loads(x)
        x = open('2.json', 'r', encoding='utf-8').read()
        self.__4Events4PerR = json.loads(x)
        x = open('3.json', 'r', encoding='utf-8').read()
        self.__4Events4PerPPerR = json.loads(x)

    def __init(self, dict_address: str):
        self.__4Events4PerP = {}
        self.__4Events4PerR = {}
        self.__4Events4PerPPerR = {}
        for root, dic, files in os.walk(dict_address):
            for f in files:
                if f[-5:] == '.json':
                    json_list = []
                    json_path = f
                    x = open(dict_address+'\\'+json_path,
                             'r', encoding='utf-8').read()
                    str_list = [_x for _x in x.split('\n') if len(_x) > 0]
                    for i, _str in enumerate(str_list):
                        try:
                            json_list.append(json.loads(_str))
                        except:
                            pass
                    records = self.__listOfNestedDict2ListOfDict(json_list)
                    for i in records:
                        if not self.__4Events4PerP.get(i['actor__login'], 0):
                            self.__4Events4PerP.update({i['actor__login']: {}})
                            self.__4Events4PerPPerR.update({i['actor__login']: {}})
                        self.__4Events4PerP[i['actor__login']][i['type']
                                                    ] = self.__4Events4PerP[i['actor__login']].get(i['type'], 0)+1
                        if not self.__4Events4PerR.get(i['repo__name'], 0):
                            self.__4Events4PerR.update({i['repo__name']: {}})
                        self.__4Events4PerR[i['repo__name']][i['type']
                                                ] = self.__4Events4PerR[i['repo__name']].get(i['type'], 0)+1
                        if not self.__4Events4PerPPerR[i['actor__login']].get(i['repo__name'], 0):
                            self.__4Events4PerPPerR[i['actor__login']].update({i['repo__name']: {}})
                        self.__4Events4PerPPerR[i['actor__login']][i['repo__name']][i['type']
                                                        ] = self.__4Events4PerPPerR[i['actor__login']][i['repo__name']].get(i['type'], 0)+1
        with open('1.json', 'w', encoding='utf-8') as f:
            json.dump(self.__4Events4PerP,f)
        with open('2.json', 'w', encoding='utf-8') as f:
            json.dump(self.__4Events4PerR,f)
        with open('3.json', 'w', encoding='utf-8') as f:
            json.dump(self.__4Events4PerPPerR,f)

    def __parseDict(self, d: dict, prefix: str):
        _d = {}
        for k in d.keys():
            if str(type(d[k]))[-6:-2] == 'dict':
                _d.update(self.__parseDict(d[k], k))
            else:
                _k = f'{prefix}__{k}' if prefix != '' else k
                _d[_k] = d[k]
        return _d

    def __listOfNestedDict2ListOfDict(self, a: list):
        records = []
        for d in a:
            _d = self.__parseDict(d, '')
            records.append(_d)
        return records

    def getEventsUsers(self, username: str, event: str) -> int:
        if not self.__4Events4PerP.get(username,0):
            return 0
        else:
            return self.__4Events4PerP[username].get(event,0)

    def getEventsRepos(self, reponame: str, event: str) -> int:
        if not self.__4Events4PerR.get(reponame,0):
            return 0
        else:
            return self.__4Events4PerR[reponame].get(event,0)

    def getEventsUsersAndRepos(self, username: str, reponame: str, event: str) -> int:
        if not self.__4Events4PerP.get(username,0):
            return 0
        elif not self.__4Events4PerPPerR[username].get(reponame,0):
            return 0
        else:
            return self.__4Events4PerPPerR[username][reponame].get(event,0)

五、性能测试

六、代码规范

https://github.com/3xxxv5/2020-personal-python/blob/master/CodeStyle.md

七、总结

通过这次学习,还是学到了不少东西,不仅了解了git的使用,也对git这个工具有了个更加全面的认识。同时也对python更加的熟悉,像命令行的处理、json文件的解析,总的来说收获还是很多的。从最开始的一脸懵逼,到逐渐的掌握,但是,真的好累啊,一周多的时间要学一堆东西,人都裂开了,最后

posted @ 2020-09-17 20:19  3xxxv5  阅读(199)  评论(1编辑  收藏  举报