`
zy8643954
  • 浏览: 23785 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

统计同一个项目在不同时期的代码新增情况

阅读更多

# encoding: utf-8
module ProjectCodeStatistics
   module FetchFile
      def recursion_fetch(dir=nil)
         dir = @base_dir if dir == nil
         Dir.foreach(dir).each do |file_dir|
           dir_path = File.join(dir,file_dir)
           if  File.directory?(dir_path)  then
               recursion_fetch(dir_path) unless file_dir =~ /^\./
           else
              if [/\.java$/,/\.jsp$/,/\.js$/,/\.xml$/].any?{|reg| reg=~file_dir}
                @all_file_with_row_number[dir_path.gsub(@base_dir,"")] = File.new(dir_path).readlines.size
              end
           end
         end
      end
   end

   class Calculate
      include FetchFile
      attr_reader :all_file_with_row_number

      def initialize(dir)
         @base_dir, @all_file_with_row_number = dir, {}
         recursion_fetch
      end
         # 分类统计所有文件数量
      def file_total_numbers()
          row_numbers(:xml,:js,:jsp,:java,@all_file_with_row_number)
      end

      # 分类统计新加入的文件代码行总量的
      def add_file_row_numbers(other)
        add_file_keys = @all_file_with_row_number.keys - other.all_file_with_row_number.keys
        add_file_hash = @all_file_with_row_number.find_all{|key,value| add_file_keys.include? key}
        row_numbers(:xml,:js,:jsp,:java,add_file_hash)
      end

      # 分类统计新加入的各种类型文件总量
      def compare_add_file_count(other)
         add_file_keys = @all_file_with_row_number.keys - other.all_file_with_row_number.keys
         file_numbers(:xml,:js,:jsp,:java,add_file_keys)
      end

      # 分类统计修改过的文件
      def compare_each_modify_file(other)
         file_hash = @all_file_with_row_number
         calculated_hash =other.all_file_with_row_number.find_all.inject({}) do |hash,item|
             hash[item[0]] = (file_hash[item[0]] - item[1]) if file_hash.include?(item[0]) && file_hash[item[0]] != item[1]
             hash
         end
         row_numbers(:xml,:js,:jsp,:java,calculated_hash)
      end

      def file_numbers(*parameter)
         last = parameter.reverse!.shift
         parameter.reverse.inject([]) do |total,type|
            regexp  =  eval('/' + type.to_s + '$/')
            total.push(last.find_all{|key,value| regexp =~ key}.size)
         end
      end

      def row_numbers(*parameter)
         last = parameter.reverse!.shift
         parameter.reverse.inject([]) do |total,type|
            regexp  =  eval('/' + type.to_s + '$/')
            total.push last.find_all{|key,value| regexp =~ key}.inject(0){|sum,item| sum + item[1] }
         end
      end
   end

   class Statistics
      def initialize(new_project,old_project,new_desc="新工程",old_desc="老工程")
         @new_project = Calculate.new(new_project)
         @old_project = Calculate.new(old_project)
         @new_desc,@old_desc = new_desc,old_desc
      end

      def print
         old_total = @old_project.file_total_numbers
         new_total = @new_project.file_total_numbers
         puts '系统代码统计'
         puts "#{@old_desc}代码总量统计,总计:#{old_total.reduce(:+)}行, java:#{old_total[3]}行,jsp: #{old_total[2]}行,js: #{old_total[1]}行,sql: #{old_total[0]}行 "
         puts "#{@new_desc}代码总量统计,总计:#{new_total.reduce(:+)}行,java:#{new_total[3]}行,jsp: #{new_total[2]}行,js: #{new_total[1]}行,sql: #{new_total[0]}行 "
         puts "新增总量 #{new_total.reduce(:+) - old_total.reduce(:+)}行"

         add_files = @new_project.compare_add_file_count(@old_project)
         new_rows = @new_project.add_file_row_numbers(@old_project)
         modify_rows = @new_project.compare_each_modify_file(@old_project)
         total_change = (new_rows.zip  modify_rows).inject([]) {|n,a|n<<a.reduce(:+)}
         puts
         puts  "新增加的文件数量,java:#{add_files[3]}个,jsp: #{add_files[2]}个,js: #{add_files[1]}个, sql: #{add_files[0]}个 "
         puts
         puts  "新增加的文件代码行,java:#{new_rows[3]}行,jsp: #{new_rows[2]}行,js: #{new_rows[1]}行, sql: #{new_rows[0]}行 "
         puts  "新增加的代码行,    java:#{modify_rows[3]}行,jsp: #{modify_rows[2]}行,js: #{modify_rows[1]}行, sql: #{modify_rows[0]}行 "
         puts  "新增加的代码行总计,java:#{total_change[3]}行,jsp: #{total_change[2]}行,js: #{total_change[1]}行, sql: #{total_change[0]}行 "
         puts  "新增总量 #{new_rows.reduce(:+) + modify_rows.reduce(:+)}行"
      end
   end
end

s = ProjectCodeStatistics::Statistics.new('D:\boss\Code\udrm\src','D:\boss\Code\digital20110726\src')
s.print
 
分享到:
评论

相关推荐

    代码统计工具code count tool

    这通常意味着你需要准备项目在不同时期的源代码库,可能是两个不同的Git分支、版本号或时间点。导入过程可能通过拖放或者浏览文件夹来完成,确保工具能够识别和解析各版本的源代码。 一旦项目导入成功,接下来的...

    代码对比软件 EXE

    这些差异可能源于不同开发者的工作,或是同一开发者在不同时期对代码的修改。通过清晰地显示这些差异,开发者可以快速定位问题,理解他人或自己之前的设计决策,并进行必要的修改。例如,当团队协作时,代码对比功能...

    财税实务:巧用EXCEL编制现金流量表-0.pdf

    在财务管理中,现金流量表是一项重要的财务报表,用于展示企业在一个特定时期的现金流入和流出情况。Excel作为一种强大的电子表格工具,被广泛应用于财务数据分析和报表编制。本文将介绍如何巧妙利用Excel来编制现金...

    数据运营思维导图

    所选期间的新增玩家,在其新增当日中最终玩到的等级分布情况 首周等级 所选期间的新增玩家,在其新增7日后玩到的等级分布情况 14日等级 所选期间的新增玩家,在其新增14日后玩到的等级分布情况 近7日等级变化 ...

    2019数据运营思维导图

    付费用户 时间段内进行过付费行为的用户数 其次还有一个付费次数、不去重 新增付费用户(日、周、月) 活跃付费用户数 定义 统计时间段内,成功付费的用户数,一般以月为单位统计 活跃付费用户数=月活跃用户数*月付...

    财税实务:如何用EXCEL编制现金流量表.pdf

    在财务管理中,现金流量表是一项重要的财务报表,用于展示企业在一定时期内现金的流入和流出情况,反映企业的经营、投资和筹资活动对现金流的影响。在实际操作中,使用Excel编制现金流量表能提高效率和准确性。以下...

    财务软件里科目设置的技巧【会计实务操作教程】.pptx

    2. **新增一级科目与报表公式的调整**:财务软件预设的财务报表基于预设科目设置,新增一级科目时,务必相应调整报表的计算公式,否则新科目的数据可能不会被正确统计。如果不熟悉如何调整,应及时咨询软件供应商。 ...

    在岗职工工资调查讲解ppt物业一分公司.pptx

    不同行业的销售额和资产总额计算方法可能有所不同,如工业企业的销售额以年产品销售收入代替,建筑业则以工程结算收入代替,批发和零售业、交通运输和邮政业、住宿和餐饮业的企业则根据各自的统计制度计算。...

    专题资料(2021-2022年)北京苍穹土地利用变更系统V3.0操作手册20160113资料.doc

    统计年末台账是系统的重要功能之一,它汇总了一年内土地利用情况的年终统计数据,便于分析土地资源的使用效率和变化趋势。这一功能对于年度报告和决策支持至关重要。 增量库提取及维护是系统保持数据实时性和一致性...

    机械设备行业第21周周报:半导体景气度有望维持高位,锂电设备企业在手订单充足.pdf

    在半导体行业领域,当前的景气度被看好,预计会维持在一个较高的水平上。半导体供应短缺的情况仍在持续,全球范围内的半导体器件和芯片供不应求,这对于整个行业的发展态势形成了支撑。Gartner的研究预测指出,全球...

    B2Bbuilder_v6.5.2.zip 电子商务行业网站内容管理系统!

    广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...

    Mallbuilder多用户商城

    广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...

    B2Bbuilder行业网站英文系统最新版

    广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...

    B2Bbuilder行业企业网站中英文最新版

    广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...

    b2b软件 b2b网站管理系统 b2bbuilder

    广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...

    集团办公室工作计划总结.doc

    1. 队伍建设:集团办公室关注人力资源管理,对各子公司人员结构和社保缴纳情况进行详细统计,如XX公司、XX公司、容器公司和大气公司的员工人数及社保缴纳情况,确保人力资源的有效配置和合规管理。 2. 证照管理:...

    SAP 财务查询清单

    - **AFBP**:用户可以通过该事务代码查询每个月的折旧情况,包括折旧额、剩余价值等。 #### 5.8 资产增减变动清单 (ZAMR003) 资产增减变动清单记录了资产的变动情况,对于资产变动管理非常有用。 - **ZAMR003**:...

    MallBuilder 多用户商城管理系统 v1.0 简体中文版

    广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以 在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图 片,文字,代码,连接,flash等。 友情连接...

    建模中的地址问题

    第三,针对市场占有率提升和新增门店的策略,我们需要构建一个考虑距离效应的优化模型。这里,我们既要考虑原有店面的销售能力提升20%,也要确定新门店的位置、数量和销售能力上限,使得全市销售量最大化。这可能...

Global site tag (gtag.js) - Google Analytics