-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathRakefile
232 lines (187 loc) · 5.78 KB
/
Rakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# Rakefile for RGL -*- ruby -*-
begin
require 'rubygems'
require 'rake/gempackagetask'
rescue Exception
nil
end
require 'rake/clean'
require 'rake/testtask'
require 'rake/rdoctask'
# Determine the current version of the software
rgl_version =
if %x(ruby -Ilib -rrgl/base -e'puts RGL_VERSION') =~ /\S+$/
$&
else
"0.0.0"
end
SUMMARY = "Ruby Graph Library"
SOURCES = FileList['lib/**/*.rb']
CLOBBER.include('TAGS', 'coverage')
RDOC_DIR = './rgl'
# The location for published documents to be copied.
remote_user = ENV['REMOTE_USER'] || ''
remote_host = ENV['REMOTE_HOST'] || 'rubyforge.org'
remote_path = ENV['REMOTE_PATH'] || '/var/www/gforge-projects/rgl'
remote_path += '/' unless remote_path[-1, 1] == '/'
REMOTE_RDOC_DIR = remote_path
REMOTE_RDOC_DIR.insert(
0,
remote_user + (remote_user.empty? ? '' : '@') + remote_host + ':'
) unless remote_host.empty?
# The default task is run if rake is given no explicit arguments.
desc "Default Task"
task :default => :test
# Define a test task.
Rake::TestTask.new { |t|
t.libs << "tests"
t.pattern = 'tests/Test*.rb'
t.verbose = true
}
task :test
# Define a test that will run all the test targets.
desc "Run all test targets"
task :testall => [:test ]
desc "Do code coverage with rcov"
task :rcov do
begin
sh 'rcov -Ilib:tests --exclude "tests/.*[tT]est.*.rb,usr.local" tests/Test*rb'
rescue Exception
nil
end
end
# Install rgl using the standard install.rb script.
desc "Install the library"
task :install do
ruby "install.rb"
end
# CVS Tasks ----------------------------------------------------------
desc "Tag all the CVS files with the latest release number (TAG=x)"
task :tag do
rel = "REL_" + rgl_version.gsub(/\./, '_')
rel << ENV['TAG'] if ENV['TAG']
puts rel
sh %{cvs commit -m 'pre-tag commit'}
sh %{cvs tag #{rel}}
end
desc "Accumulate changelog"
task :changelog do
sh %{cvs2cl --tags --utc --prune --accum}
end
# Create a task to build the RDOC documentation tree.
rd = Rake::RDocTask.new("rdoc") { |rdoc|
rdoc.rdoc_dir = RDOC_DIR
rdoc.template = 'doc/jamis.rb'
rdoc.title = SUMMARY
rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
rdoc.rdoc_files.include(SOURCES, 'README', 'ChangeLog', 'examples/examples.rb', 'rakelib/*.rake')
}
# ====================================================================
# Create a task that will package the rgl software into distributable
# tar, zip and gem files.
PKG_FILES = FileList[
'install.rb',
'[A-Z]*',
'tests/**/*.rb',
'examples/**/*',
'rakelib/*.rake'
] + SOURCES
if ! defined?(Gem)
puts "Package Target requires RubyGems"
else
spec = Gem::Specification.new do |s|
s.name = 'rgl'
s.version = rgl_version
s.summary = SUMMARY
s.description = <<-EOF
RGL is a framework for graph data structures and algorithms.
The design of the library is much influenced by the Boost Graph Library (BGL)
which is written in C++ heavily using its template mechanism.
RGL currently contains a core set of algorithm patterns:
* Breadth First Search
* Depth First Search
The algorithm patterns by themselves do not compute any meaningful quantities
over graphs, they are merely building blocks for constructing graph
algorithms. The graph algorithms in RGL currently include:
* Topological Sort
* Connected Components
* Strongly Connected Components
* Transitive Closure
* Transitive Reduction
* Graph Condensation
* Search cycles (contributed by Shawn Garbett)
EOF
#### Dependencies and requirements.
s.add_dependency('stream', '>= 0.5')
s.add_dependency 'rake'
s.requirements << "Stream library, v0.5 or later"
#### Which files are to be included in this gem? Everything! (Except CVS directories.)
s.files = PKG_FILES.to_a
#### Load-time details: library and application (you will need one or both).
s.require_path = 'lib' # Use these for libraries.
s.autorequire = 'rgl/base'
#### Documentation and testing.
s.has_rdoc = true
s.extra_rdoc_files = ['README']
s.rdoc_options <<
'--title' << 'RGL - Ruby Graph Library' <<
'--main' << 'README' <<
'--line-numbers'
#### Author and project details.
s.author = "Horst Duchene"
s.email = "[email protected]"
s.homepage = "http://rgl.rubyforge.org"
s.rubyforge_project = "rgl"
end
Rake::GemPackageTask.new(spec) do |pkg|
#pkg.need_zip = true
pkg.need_tar = true
end
end
# TAGS ---------------------------------------------------------------
file 'tags' => SOURCES do
print "Running ctags..."
sh %{ctags #{SOURCES.join(' ')}} # vi tags
puts "done."
end
file 'TAGS' => SOURCES do
sh %{ctags -e #{SOURCES.join(' ')}} # emacs TAGS
end
# Misc tasks =========================================================
def count_lines(filename)
lines = 0
codelines = 0
open(filename) { |f|
f.each do |line|
lines += 1
next if line =~ /^\s*$/
next if line =~ /^\s*#/
codelines += 1
end
}
[lines, codelines]
end
def show_line(msg, lines, loc)
printf "%6s %6s %s\n", lines.to_s, loc.to_s, msg
end
desc "Count lines in the main files"
task :lines do
total_lines = 0
total_code = 0
show_line("File Name", "LINES", "LOC")
SOURCES.each do |fn|
lines, codelines = count_lines(fn)
show_line(fn, lines, codelines)
total_lines += lines
total_code += codelines
end
show_line("TOTAL", total_lines, total_code)
end
desc "Copy rdoc html to rubyforge"
task :rdoc2rf => [:rdoc, :rcov, :changelog] do
cp_r 'coverage', RDOC_DIR
examples = File.join(RDOC_DIR, 'examples')
mkdir_p examples
cp Dir.glob('examples/*.jpg'), examples
sh "rsync -r --delete \"#{RDOC_DIR}\" \"#{REMOTE_RDOC_DIR}\""
end