# 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
分享到:
相关推荐
这通常意味着你需要准备项目在不同时期的源代码库,可能是两个不同的Git分支、版本号或时间点。导入过程可能通过拖放或者浏览文件夹来完成,确保工具能够识别和解析各版本的源代码。 一旦项目导入成功,接下来的...
这些差异可能源于不同开发者的工作,或是同一开发者在不同时期对代码的修改。通过清晰地显示这些差异,开发者可以快速定位问题,理解他人或自己之前的设计决策,并进行必要的修改。例如,当团队协作时,代码对比功能...
在财务管理中,现金流量表是一项重要的财务报表,用于展示企业在一个特定时期的现金流入和流出情况。Excel作为一种强大的电子表格工具,被广泛应用于财务数据分析和报表编制。本文将介绍如何巧妙利用Excel来编制现金...
所选期间的新增玩家,在其新增当日中最终玩到的等级分布情况 首周等级 所选期间的新增玩家,在其新增7日后玩到的等级分布情况 14日等级 所选期间的新增玩家,在其新增14日后玩到的等级分布情况 近7日等级变化 ...
付费用户 时间段内进行过付费行为的用户数 其次还有一个付费次数、不去重 新增付费用户(日、周、月) 活跃付费用户数 定义 统计时间段内,成功付费的用户数,一般以月为单位统计 活跃付费用户数=月活跃用户数*月付...
在财务管理中,现金流量表是一项重要的财务报表,用于展示企业在一定时期内现金的流入和流出情况,反映企业的经营、投资和筹资活动对现金流的影响。在实际操作中,使用Excel编制现金流量表能提高效率和准确性。以下...
2. **新增一级科目与报表公式的调整**:财务软件预设的财务报表基于预设科目设置,新增一级科目时,务必相应调整报表的计算公式,否则新科目的数据可能不会被正确统计。如果不熟悉如何调整,应及时咨询软件供应商。 ...
不同行业的销售额和资产总额计算方法可能有所不同,如工业企业的销售额以年产品销售收入代替,建筑业则以工程结算收入代替,批发和零售业、交通运输和邮政业、住宿和餐饮业的企业则根据各自的统计制度计算。...
统计年末台账是系统的重要功能之一,它汇总了一年内土地利用情况的年终统计数据,便于分析土地资源的使用效率和变化趋势。这一功能对于年度报告和决策支持至关重要。 增量库提取及维护是系统保持数据实时性和一致性...
在半导体行业领域,当前的景气度被看好,预计会维持在一个较高的水平上。半导体供应短缺的情况仍在持续,全球范围内的半导体器件和芯片供不应求,这对于整个行业的发展态势形成了支撑。Gartner的研究预测指出,全球...
广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...
广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...
广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...
广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...
广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图片,文字,代码,连接,flash等。 友情连接模块 ...
1. 队伍建设:集团办公室关注人力资源管理,对各子公司人员结构和社保缴纳情况进行详细统计,如XX公司、XX公司、容器公司和大气公司的员工人数及社保缴纳情况,确保人力资源的有效配置和合规管理。 2. 证照管理:...
- **AFBP**:用户可以通过该事务代码查询每个月的折旧情况,包括折旧额、剩余价值等。 #### 5.8 资产增减变动清单 (ZAMR003) 资产增减变动清单记录了资产的变动情况,对于资产变动管理非常有用。 - **ZAMR003**:...
广告模块 可以在后台新增广告组,广告组可以包含多个广告,生成广告调用代码后可以 在任意网站任意页面调用该广告,广告会自动分城市显示,可以发布多种广告形式,图 片,文字,代码,连接,flash等。 友情连接...
第三,针对市场占有率提升和新增门店的策略,我们需要构建一个考虑距离效应的优化模型。这里,我们既要考虑原有店面的销售能力提升20%,也要确定新门店的位置、数量和销售能力上限,使得全市销售量最大化。这可能...