免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5082 | 回复: 11
打印 上一主题 下一主题

请教python分析groovy代码文件的写法 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2013-05-23 22:10 |显示全部楼层
回复 2# GhostFromHeaven


    太牛了,这正是我想要的结果。
再稍稍改进下就可以变成grep -n的那种结果了,也就是文件名:行号:行内容

论坛徽章:
0
2 [报告]
发表于 2013-05-23 22:14 |显示全部楼层
回复 2# GhostFromHeaven


    这样写能判定函数嵌套吗?
比如函数体这样定义的
def fuction1 = {
    something1
    something2
    def function = {
        something1
        something2
        something.save(test)
    }
    something.save(test)
}

论坛徽章:
0
3 [报告]
发表于 2013-05-24 09:48 |显示全部楼层
回复 5# GhostFromHeaven


    非常感谢,很有参考价值,最近才粗略的把python的基础看完,还没有一些实践课题,所以应用上有些困难,感谢提供这么有价值的参考代码

论坛徽章:
0
4 [报告]
发表于 2013-05-24 13:26 |显示全部楼层
回复 5# GhostFromHeaven


    发现有些代码中有switch-case语句,这样怎么判定呢?
switch(para) {
    case para1:
        something
        save(sth.)
        break
    case para2:
        something
        save(sth.)
        break
    default:
        something
        save(sth.)
}

论坛徽章:
0
5 [报告]
发表于 2013-05-24 15:12 |显示全部楼层
回复 8# GhostFromHeaven


    调用的时候肯定是xxx.save的,这个样例只是一个例子。实际代码如下:
switch (params.codeType){
                        case 'SJLX':
                                systemCodeInstance = new DataType(params)
                                result=systemCodeInstance.save(flush: true)                               
                                break
                        case 'SSY':
                                systemCodeInstance = new BelongDomain(params)
                                result=systemCodeInstance.save(flush: true)
                                break
                        case 'WLSX':
                                systemCodeInstance = new PhysicalProperty(params)
                                result=systemCodeInstance.save(flush: true)
                                break
                        case 'ItemDW':
                                systemCodeInstance = new ItemUnit(params)
                                systemCodeInstance.codeNum=PhysicalProperty.get(params.physicalProperty).codeName+'-'+params.codeName
                                result=systemCodeInstance.save(flush: true)
                                break
                        default:
                                systemCodeInstance = new BaudRate(params)
                                result=systemCodeInstance.save(flush: true)
                                break
                       
                }
需求上这几个save是不应该算进去的,每一条case语句中只有一个save方法,满足条件,不应该被筛选出来。
我是说这样的话正则应该怎么写呢?应该家进去一条语句判定

论坛徽章:
0
6 [报告]
发表于 2013-05-25 17:56 |显示全部楼层
本帖最后由 abcfy2 于 2013-05-25 17:57 编辑

回复 11# GhostFromHeaven


    需求是BOSS口头提出来的,并未形成统一的文档,所以暂时没有需求文档。
我将这个脚本整合到了系统的定时计划中,每天定时扫描所有的代码库,然后将结果以邮件的形式发送,发现哪里 有问题就改哪里。

上次我将你这个脚本改了一下,大致的邮件格式是这样的:

*Controller.groovy同时保存多domain class扫描结果:
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:58:                                result=systemCodeInstance.save(flush: true)
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:62:                                result=systemCodeInstance.save(flush: true)
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:67:                                result=systemCodeInstance.save(flush: true)
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:71:                                result=systemCodeInstance.save(flush: true)
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/support/AlarmCodeController.groovy:63:                                result=alarmCodeInstance.save(flush: true)
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/support/AlarmCodeController.groovy:70:                                result=alarmCodeInstance.save(flush: true)
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/knowledge/RuleController.groovy:112:                if (ruleInstance.save(flush: true)) {
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/knowledge/RuleController.groovy:189:                        if(ruleInstance .validate() && ruleInstance .save()) {
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/service/ServicePlanController.groovy:295:                if (!serviceRequest.save(flush: true)) {
CISJOB/workspace/cis/grails-app/controllers/com/si/ciots/crm/ContractCompressorController.groovy:189:        if(contractCompressor.save()){
CISJOB/workspace/cis/grails-app/controllers/com/si/c2/business/DeliveryAddressController.groovy:44:                if (deliveryAddressInstance.save(flush: true)){
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/compressor/CompressorController.groovy:1474:            if(compressor .validate() && compressor .save()) {
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/compressor/CompressorController.groovy:1485:            if(compressor .validate() && compressor .save()) {
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/compressor/SamplerController.groovy:131:            if(sampler.validate() && sampler.save()) {
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:57:                                result=systemCodeInstance.save(flush: true)
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:61:                                result=systemCodeInstance.save(flush: true)
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:66:                                result=systemCodeInstance.save(flush: true)
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/support/SystemCodeController.groovy:70:                                result=systemCodeInstance.save(flush: true)
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/support/AlarmCodeController.groovy:63:                                result=alarmCodeInstance.save(flush: true)
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/support/AlarmCodeController.groovy:70:                                result=alarmCodeInstance.save(flush: true)
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/knowledge/RuleController.groovy:112:                if (ruleInstance.save(flush: true)) {
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/knowledge/RuleController.groovy:189:                        if(ruleInstance .validate() && ruleInstance .save()) {
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/service/ServicePlanController.groovy:292:                if (!serviceRequest.save(flush: true)) {
KaishanCis/workspace/lgcis/grails-app/controllers/com/si/ciots/crm/ContractCompressorController.groovy:190:        if(contractCompressor.save()){
c2/workspace/grails-app/controllers/com/si/c2/business/PayRecordController.groovy:50:                    if(payRecordInstance.save()){


目前发现的问题是这样,那几个result实际上是switch-case语句中的,不应该被筛选出来,还有就是if中的save()方法如果是空参也不筛选出来。

论坛徽章:
0
7 [报告]
发表于 2013-05-26 09:44 |显示全部楼层
回复 13# GhostFromHeaven


    所以程序还需要慢慢修,因为groovy代码我懂的也不是很多,可以说几乎不懂。
BOSS是为了要代码可读性更高,提出来的一类需求,然后用脚本去扫描代码,所以不一定要尽善尽美,反正扫描出来还是需要人为去修改的。
BOSS的意思也就是说先扫描,然后让程序猿们去改,发现扫描结果不对再反馈。至于第二种if情况暂不考虑,先把比较明显的扫描问题先解决了就行了。
比如switch-case语句和if(xxxx.save())语句。至于if-else语句,暂时不清楚BOSS怎么算的,这个等我跟BOSS沟通一下吧。

论坛徽章:
0
8 [报告]
发表于 2013-05-27 13:17 |显示全部楼层
回复 15# GhostFromHeaven


    多谢给出参考。这个脚本是在linux服务器运行的,你这个是在windows下写的,换行符不一样,一开始执行不了,我已经用dos2unix转换换行符了,执行没有问题,稍微修改了一下,如下。
开头加上了命令解释器
#!/usr/bin/python

最后改成了

def help():
    print """用法:
    sys.argv[0] dir1 [dir2] [dir3] ..."""

if __name__ == "__main__":
    if len(sys.argv) <= 1:
        help()
        exit(1)
    else:
        for dir in sys.argv[1:]:
            filelist = os.popen('find '+ dir + ' -type f -name *Controller.groovy').read().rstrip('\n').split('\n')
        if filelist != ['']:
            gp = GroovyParser()
            gp.parse(filelist)
调用系统中的find命令查找这一类文件,find将查找到的结果以\n为分隔符换行显示在终端上,转换为列表递给程序,执行起来基本没什么问题,感谢辛苦了

论坛徽章:
0
9 [报告]
发表于 2013-05-27 14:49 |显示全部楼层
本帖最后由 abcfy2 于 2013-05-27 14:49 编辑

回复 11# GhostFromHeaven


    结果还是有点问题啊,原本筛选出那么多,这次一个都筛选不出来了。
我在你那个测试样例加了下面一段:
  1.   def handlePayFinish(String tradeNo, String orderNo, double totalFee, String alipayAccount){
  2.         log.debug("handlerAlipayReturn: tradeNo= ${tradeNo}, orderNo= ${orderNo}, totalFee= ${totalFee}, alipayAccount= ${alipayAccount}")
  3.         if(!PayRecord.countByAlipayTradeNo(tradeNo)){
  4.         log.info("handlerAlipayReturn: begin add PayRecord")
  5.                def goodsOrder = GoodsOrder.findByOrderNo(orderNo)
  6.                      def payRecord = new PayRecord(alipayAccount:alipayAccount
  7.                                                     ,  goodsOrder:goodsOrder
  8.                                                     ,  alipayTradeNo:tradeNo
  9.                                                     ,  amount:totalFee
  10.                                                     ,  payDate:new Date()
  11.                                                     ,  type:PayType.findByCodeNum('JSDZ'))
  12.                    payRecord.save(flush:true)
  13.                    goodsOrder.orderStatus = OrderStatus.findByCodeNum("YFK")
  14.                    goodsOrder.payDate = payRecord.payDate
  15.                    goodsOrder.save(flush: true)
  16.                    log.info("handlerAlipayReturn: finish add PayRecord")
  17.          }else{
  18.       log.debug("the payRecord which tradeNo is ${tradeNo} already exists !")
  19.       }   
复制代码
明显在def payRecord = 这段中有两个save方法 payRecord.save(flush:true)和goodsOrder.save(flush: true),但是没有被筛选出来。

论坛徽章:
0
10 [报告]
发表于 2013-05-27 16:52 |显示全部楼层
回复 18# GhostFromHeaven


    还是有一些问题
发现扫出来的结果中有vulcan/javadoc/vulcan/grails-app/controllers/com/si/vulcan/ProjectController.groovy:1355:                !projectInstance.save(flush: true)?renderMsg('放弃连杆校验,请联系管理员!'):renderSuccess()
打开了一下代码文件,这段代码块是这样的,只有一个save()方法,为什么会被扫出来?
  1.    def giveUpConnectingRod(){
  2.         withPersonalProject{projectInstance->
  3.             try {
  4.                 ConnectingRod rod=projectInstance.connectingRod
  5.                 if (rod) {
  6.                     projectInstance.connectingRod=null
  7.                     rod.delete()
  8.                 }   
  9.                 projectInstance.rodStep=0
  10.                 !projectInstance.save(flush: true)?renderMsg('放弃连杆校验,请联系管理员!'):renderSuccess()
  11.             }catch (VulcanCustomeException e) {
  12.                 renderMsg('放弃连杆失败,请联系管理员!')
  13.             }   
  14.         }   
  15.     }   
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP