Everyday Scripting with Ruby 读书笔记(2)

[size=small]---
Churn项目:轻松编写脚本
The Churn Project: Writing Scripts without Fuss
---[/size]

subversion安装包下载:[url=http://www.rayfile.com/zh-cn/files/b0d00902-a431-11dd-a9c3-0014221b798a/]svn-1.4.5-setup.rar[/url] [img]http://static.rayfile.com/media/img/icon_download.gif[/img]

#---
# Excerpted from "Everyday Scripting in Ruby"
# We make no guarantees that this code is fit for any purpose.
# Visit http://www.pragmaticprogrammer.com/titles/bmsft for more book information.
#---

# This is the same as churn.v7.rb. It's a different file because
# of the mechanics of book production.

# 处理时间(过去一个月)
def month_before(a_time)
a_time - 28 * 24 * 60 * 60
end

# 处理打印标题信息
def header(an_svn_date)
"Changes since #{an_svn_date}:"
end

# 组成打印主体信息(参数:子项目,修改次数)
def subsystem_line(subsystem_name, change_count)
asterisks = asterisks_for(change_count)
# 注释②
"#{subsystem_name.rjust(14)} #{asterisks} (#{change_count})"
end

# 计算星号
def asterisks_for(an_integer)
'*' * (an_integer / 5.0).round
end

# 计算修改次数
def change_count_for(name, start_date)
extract_change_count_from(svn_log(name, start_date))
end

# 根据文本信息(解析字符串)
def extract_change_count_from(log_text)
lines = log_text.split("\n")
dashed_lines = lines.find_all do | line | # 注释③
line.include?('--------')
end
dashed_lines.length - 1
end

# 使用外部程序获取文本信息
def svn_log(subsystem, start_date)
timespan = "--revision HEAD:{#{start_date}}"
root = "svn://rubyforge.org//var/svn/churn-demo"

`svn log #{timespan} #{root}/#{subsystem}`
end

# 格式化时间
def svn_date(a_time)
a_time.strftime("%Y-%m-%d") # 注释①
end

if $0 == __FILE__
subsystem_names = ['audit', 'fulfillment', 'persistence',
'ui', 'util', 'inventory']
start_date = svn_date(month_before(Time.mktime(2005,9,2,0,0,0,0)))

puts header(start_date)
subsystem_names.each do | name |
puts subsystem_line(name, change_count_for(name, start_date))
end
end


[color=blue][b]** 运行结果 **[/b][/color]
>ruby churn.v7copy.rb
Changes since 2005-08-05:
audit * (5)
fulfillment (2)
persistence * (3)
ui ** (8)
util * (4)
inventory (2)
>Exit code: 0
[color=blue][b]** **[/b][/color]


[color=indigo][b]① Time对象的strftime用于格式化时间..[/b][/color]
irb(main):005:0> Time.now.strftime('%m-%d %Y')
=> "10-28 2008"

[color=indigo][b]② rjust用于实现右对齐..[/b][/color]
irb(main):007:0> 'right'.rjust(2)
=> "right"
irb(main):008:0> 'right'.rjust(8)
=> " right"

[color=indigo][b]③ find_all: 获取代码块返回为真的所有元素, 然后放入一个新的数组作为返回值..[/b][/color]
irb(main):009:0> ['abxc', 'xx', 'b', 'ycx'].find_all do | ele |
irb(main):010:1* ele.include?('x')
irb(main):011:1> end
=> ["abxc", "xx", "ycx"]

require 'test/unit'
require 'churn.v7copy'

class ChurnMyTests < Test::Unit::TestCase

def test_month_before
assert_equal(Time.local(2008,9,30), month_before(Time.local(2008,10,28)))
end

def test_svn_date
assert_equal("2008-10-28",svn_date(Time.now))
end

def test_header
assert_equal("Changes since 2008-10-28:", header(svn_date(Time.mktime(2008,10,28,0,0,0,0))))
end

def test_extract_change_count_from
assert_equal(2,extract_change_count_from("------------------------------------------------------------------------
r2 | marick | 2005-08-07 14:26:21 -0500 (Mon, 07 Aug 2005) | 1 line

added code to handle merger
------------------------------------------------------------------------
r1 | marick | 2005-08-07 14:21:47 -0500 (Mon, 07 Aug 2005) | 1 line

first touches
No commit for revision 0.
------------------------------------------------------------------------"))
end

def test_asterisks_for
assert_equal("*********", asterisks_for(46))
end

end


[color=blue][b]** 运行结果 **[/b][/color]
>ruby churn-mytest-v7copy.rb
Loaded suite churn-mytest-v7copy
Started
.....
Finished in 0.0 seconds.

5 tests, 5 assertions, 0 failures, 0 errors
>Exit code: 0
[color=blue][b]** **[/b][/color]

# Exercises

# 处理时间(过去一个月)
def month_before(a_time)
a_time - 28 * 24 * 60 * 60
end

# 处理打印标题信息
def header(an_svn_start_date, an_svn_today_date)
"Changes between #{an_svn_start_date} and #{an_svn_today_date}:"
end

# 组成打印主体信息(参数:子项目,修改次数)
def subsystem_line(subsystem_name, change_count)
asterisks = asterisks_for(change_count)
change_text = change_text_from(change_count)
unless change_count == 0
return "#{subsystem_name.ljust(14)} #{change_text.ljust(14)} #{asterisks}"
end
return "#{subsystem_name.ljust(14)} #{'-'.ljust(14)} -"
end

# 计算星号
def asterisks_for(an_integer)
if(an_integer < 3)
'*'
else
'*' * (an_integer / 5.0).round
end
end

# 处理修改次数信息
def change_text_from(an_integer)
return "(#{an_integer} changes)"
end

# 计算修改次数
def change_count_for(name, start_date)
extract_change_count_from(svn_log(name, start_date))
end

# 根据文本信息(解析字符串)
def extract_change_count_from(log_text)
lines = log_text.split("\n")
dashed_lines = lines.find_all do | line |
line.include?('--------')
end
dashed_lines.length - 1
end

# 使用外部程序获取文本信息
def svn_log(subsystem, start_date)
timespan = "--revision HEAD:{#{start_date}}"
root = "svn://rubyforge.org//var/svn/churn-demo"

`svn log #{timespan} #{root}/#{subsystem}`
end

# 格式化时间
def svn_date(a_time)
a_time.strftime("%Y-%m-%d")
end

if $0 == __FILE__
subsystem_names = ['audit', 'fulfillment', 'persistence',
'ui', 'util', 'inventory']
start_date = svn_date(month_before(Time.mktime(2005,9,2,0,0,0,0)))
today_date = svn_date(Time.now)

puts header(start_date, today_date)
subsystem_names.each do | name |
puts subsystem_line(name, change_count_for(name, start_date))
end
end


[color=blue][b]** 运行结果 **[/b][/color]
>ruby churn.v7copy.rb
Changes between 2005-08-05 and 2008-10-28:
audit (5 changes) *
fulfillment (2 changes) *
persistence (3 changes) *
ui (8 changes) **
util (4 changes) *
inventory (2 changes) *
>Exit code: 0
[color=blue][b]** **[/b][/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值