Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 395 lines (326 sloc) 10.164 kB
86d43db @ahoward rake-ify the project
authored
1 This.rubyforge_project = 'codeforpeople'
2 This.author = "Ara T. Howard"
3 This.email = "ara.t.howard@gmail.com"
97a4cd6 @ahoward gem desc
authored
4 This.homepage = "https://github.com/ahoward/#{ This.lib }"
86d43db @ahoward rake-ify the project
authored
5
97a4cd6 @ahoward gem desc
authored
6 task :license do
7 open('LICENSE', 'w'){|fd| fd.puts "same as ruby's"}
8 end
86d43db @ahoward rake-ify the project
authored
9
10 task :default do
97a4cd6 @ahoward gem desc
authored
11 puts((Rake::Task.tasks.map{|task| task.name.gsub(/::/,':')} - ['default']).sort)
12 end
13
14 task :test do
15 run_tests!
16 end
17
18 namespace :test do
19 task(:unit){ run_tests!(:unit) }
20 task(:functional){ run_tests!(:functional) }
21 task(:integration){ run_tests!(:integration) }
22 end
23
24 def run_tests!(which = nil)
25 which ||= '**'
26 test_dir = File.join(This.dir, "test")
27 test_glob ||= File.join(test_dir, "#{ which }/**_test.rb")
28 test_rbs = Dir.glob(test_glob).sort
29
30 div = ('=' * 119)
31 line = ('-' * 119)
32
33 test_rbs.each_with_index do |test_rb, index|
34 testno = index + 1
35 command = "#{ This.ruby } -w -I ./lib -I ./test/lib #{ test_rb }"
36
37 puts
38 say(div, :color => :cyan, :bold => true)
39 say("@#{ testno } => ", :bold => true, :method => :print)
40 say(command, :color => :cyan, :bold => true)
41 say(line, :color => :cyan, :bold => true)
42
43 system(command)
44
45 say(line, :color => :cyan, :bold => true)
46
47 status = $?.exitstatus
48
49 if status.zero?
50 say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
51 say("SUCCESS", :color => :green, :bold => true)
52 else
53 say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
54 say("FAILURE", :color => :red, :bold => true)
55 end
56 say(line, :color => :cyan, :bold => true)
57
58 exit(status) unless status.zero?
59 end
86d43db @ahoward rake-ify the project
authored
60 end
61
62
63 task :gemspec do
97a4cd6 @ahoward gem desc
authored
64 ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
65 ignore_directories = ['pkg']
66 ignore_files = ['test/log']
86d43db @ahoward rake-ify the project
authored
67
68 shiteless =
69 lambda do |list|
70 list.delete_if do |entry|
71 next unless test(?e, entry)
72 extension = File.basename(entry).split(%r/[.]/).last
73 ignore_extensions.any?{|ext| ext === extension}
74 end
75 list.delete_if do |entry|
76 next unless test(?d, entry)
77 dirname = File.expand_path(entry)
78 ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
79 end
97a4cd6 @ahoward gem desc
authored
80 list.delete_if do |entry|
81 next unless test(?f, entry)
82 filename = File.expand_path(entry)
83 ignore_files.any?{|file| File.expand_path(file) == filename}
84 end
86d43db @ahoward rake-ify the project
authored
85 end
86
87 lib = This.lib
97a4cd6 @ahoward gem desc
authored
88 object = This.object
86d43db @ahoward rake-ify the project
authored
89 version = This.version
90 files = shiteless[Dir::glob("**/**")]
91 executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
97a4cd6 @ahoward gem desc
authored
92 #has_rdoc = true #File.exist?('doc')
86d43db @ahoward rake-ify the project
authored
93 test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
97a4cd6 @ahoward gem desc
authored
94 summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
95 description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
96 license = object.respond_to?(:license) ? object.license : "same as ruby's"
86d43db @ahoward rake-ify the project
authored
97
97a4cd6 @ahoward gem desc
authored
98 if This.extensions.nil?
99 This.extensions = []
100 extensions = This.extensions
86d43db @ahoward rake-ify the project
authored
101 %w( Makefile configure extconf.rb ).each do |ext|
102 extensions << ext if File.exists?(ext)
103 end
104 end
105 extensions = [extensions].flatten.compact
106
e80518f @ahoward version
authored
107 if This.dependencies.nil?
108 dependencies = []
109 else
110 case This.dependencies
111 when Hash
112 dependencies = This.dependencies.values
113 when Array
114 dependencies = This.dependencies
115 end
116 end
117
86d43db @ahoward rake-ify the project
authored
118 template =
119 if test(?e, 'gemspec.erb')
120 Template{ IO.read('gemspec.erb') }
121 else
122 Template {
123 <<-__
e80518f @ahoward version
authored
124 ## <%= lib %>.gemspec
86d43db @ahoward rake-ify the project
authored
125 #
126
127 Gem::Specification::new do |spec|
e80518f @ahoward version
authored
128 spec.name = <%= lib.inspect %>
129 spec.version = <%= version.inspect %>
86d43db @ahoward rake-ify the project
authored
130 spec.platform = Gem::Platform::RUBY
e80518f @ahoward version
authored
131 spec.summary = <%= lib.inspect %>
132 spec.description = <%= description.inspect %>
133 spec.license = <%= license.inspect %>
86d43db @ahoward rake-ify the project
authored
134
e80518f @ahoward version
authored
135 spec.files =\n<%= files.sort.pretty_inspect %>
136 spec.executables = <%= executables.inspect %>
86d43db @ahoward rake-ify the project
authored
137
138 spec.require_path = "lib"
139
e80518f @ahoward version
authored
140 spec.test_files = <%= test_files.inspect %>
97a4cd6 @ahoward gem desc
authored
141
e80518f @ahoward version
authored
142 <% dependencies.each do |lib_version| %>
143 spec.add_dependency(*<%= Array(lib_version).flatten.inspect %>)
144 <% end %>
86d43db @ahoward rake-ify the project
authored
145
e80518f @ahoward version
authored
146 spec.extensions.push(*<%= extensions.inspect %>)
86d43db @ahoward rake-ify the project
authored
147
e80518f @ahoward version
authored
148 spec.rubyforge_project = <%= This.rubyforge_project.inspect %>
149 spec.author = <%= This.author.inspect %>
150 spec.email = <%= This.email.inspect %>
151 spec.homepage = <%= This.homepage.inspect %>
86d43db @ahoward rake-ify the project
authored
152 end
153 __
154 }
155 end
156
97a4cd6 @ahoward gem desc
authored
157 Fu.mkdir_p(This.pkgdir)
158 gemspec = "#{ lib }.gemspec"
159 open(gemspec, "w"){|fd| fd.puts(template)}
160 This.gemspec = gemspec
86d43db @ahoward rake-ify the project
authored
161 end
162
163 task :gem => [:clean, :gemspec] do
97a4cd6 @ahoward gem desc
authored
164 Fu.mkdir_p(This.pkgdir)
2c253d8 @ahoward more rakefile updates
authored
165 before = Dir['*.gem']
37e9685 @ahoward update rakefile
authored
166 cmd = "gem build #{ This.gemspec }"
167 `#{ cmd }`
2c253d8 @ahoward more rakefile updates
authored
168 after = Dir['*.gem']
169 gem = ((after - before).first || after.first) or abort('no gem!')
97a4cd6 @ahoward gem desc
authored
170 Fu.mv(gem, This.pkgdir)
171 This.gem = File.join(This.pkgdir, File.basename(gem))
86d43db @ahoward rake-ify the project
authored
172 end
173
174 task :readme do
175 samples = ''
176 prompt = '~ > '
177 lib = This.lib
178 version = This.version
179
180 Dir['sample*/*'].sort.each do |sample|
181 samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
182
183 cmd = "cat #{ sample }"
184 samples << Util.indent(prompt + cmd, 2) << "\n\n"
185 samples << Util.indent(`#{ cmd }`, 4) << "\n"
186
187 cmd = "ruby #{ sample }"
188 samples << Util.indent(prompt + cmd, 2) << "\n\n"
189
97a4cd6 @ahoward gem desc
authored
190 cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
86d43db @ahoward rake-ify the project
authored
191 samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
192 end
193
194 template =
97a4cd6 @ahoward gem desc
authored
195 if test(?e, 'README.erb')
196 Template{ IO.read('README.erb') }
86d43db @ahoward rake-ify the project
authored
197 else
198 Template {
199 <<-__
200 NAME
201 #{ lib }
202
203 DESCRIPTION
204
205 INSTALL
206 gem install #{ lib }
207
208 SAMPLES
209 #{ samples }
210 __
211 }
212 end
213
214 open("README", "w"){|fd| fd.puts template}
215 end
216
217
218 task :clean do
219 Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
220 end
221
222
223 task :release => [:clean, :gemspec, :gem] do
224 gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
225 raise "which one? : #{ gems.inspect }" if gems.size > 1
226 raise "no gems?" if gems.size < 1
97a4cd6 @ahoward gem desc
authored
227
228 cmd = "gem push #{ This.gem }"
229 puts cmd
230 puts
231 system(cmd)
232 abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
233
234 cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.gem }"
86d43db @ahoward rake-ify the project
authored
235 puts cmd
97a4cd6 @ahoward gem desc
authored
236 puts
237 system(cmd)
238 abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
86d43db @ahoward rake-ify the project
authored
239 end
240
241
242
243
244
245 BEGIN {
97a4cd6 @ahoward gem desc
authored
246 # support for this rakefile
247 #
86d43db @ahoward rake-ify the project
authored
248 $VERBOSE = nil
249
250 require 'ostruct'
251 require 'erb'
252 require 'fileutils'
97a4cd6 @ahoward gem desc
authored
253 require 'rbconfig'
254 require 'pp'
86d43db @ahoward rake-ify the project
authored
255
97a4cd6 @ahoward gem desc
authored
256 # fu shortcut
257 #
86d43db @ahoward rake-ify the project
authored
258 Fu = FileUtils
259
97a4cd6 @ahoward gem desc
authored
260 # cache a bunch of stuff about this rakefile/environment
261 #
86d43db @ahoward rake-ify the project
authored
262 This = OpenStruct.new
263
264 This.file = File.expand_path(__FILE__)
265 This.dir = File.dirname(This.file)
266 This.pkgdir = File.join(This.dir, 'pkg')
267
97a4cd6 @ahoward gem desc
authored
268 # grok lib
269 #
86d43db @ahoward rake-ify the project
authored
270 lib = ENV['LIB']
271 unless lib
97a4cd6 @ahoward gem desc
authored
272 lib = File.basename(Dir.pwd).sub(/[-].*$/, '')
86d43db @ahoward rake-ify the project
authored
273 end
274 This.lib = lib
275
97a4cd6 @ahoward gem desc
authored
276 # grok version
277 #
86d43db @ahoward rake-ify the project
authored
278 version = ENV['VERSION']
279 unless version
97a4cd6 @ahoward gem desc
authored
280 require "./lib/#{ This.lib }"
281 This.name = lib.capitalize
282 This.object = eval(This.name)
283 version = This.object.send(:version)
86d43db @ahoward rake-ify the project
authored
284 end
285 This.version = version
286
e80518f @ahoward version
authored
287 # see if dependencies are export by the module
288 #
289 if This.object.respond_to?(:dependencies)
290 This.dependencies = This.object.dependencies
291 end
292
97a4cd6 @ahoward gem desc
authored
293 # we need to know the name of the lib an it's version
294 #
86d43db @ahoward rake-ify the project
authored
295 abort('no lib') unless This.lib
296 abort('no version') unless This.version
297
97a4cd6 @ahoward gem desc
authored
298 # discover full path to this ruby executable
299 #
300 c = Config::CONFIG
301 bindir = c["bindir"] || c['BINDIR']
302 ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
303 ruby_ext = c['EXEEXT'] || ''
304 ruby = File.join(bindir, (ruby_install_name + ruby_ext))
305 This.ruby = ruby
306
307 # some utils
308 #
86d43db @ahoward rake-ify the project
authored
309 module Util
310 def indent(s, n = 2)
311 s = unindent(s)
312 ws = ' ' * n
313 s.gsub(%r/^/, ws)
314 end
315
316 def unindent(s)
317 indent = nil
97a4cd6 @ahoward gem desc
authored
318 s.each_line do |line|
86d43db @ahoward rake-ify the project
authored
319 next if line =~ %r/^\s*$/
320 indent = line[%r/^\s*/] and break
321 end
322 indent ? s.gsub(%r/^#{ indent }/, "") : s
323 end
324 extend self
325 end
326
97a4cd6 @ahoward gem desc
authored
327 # template support
328 #
86d43db @ahoward rake-ify the project
authored
329 class Template
330 def initialize(&block)
331 @block = block
332 @template = block.call.to_s
333 end
334 def expand(b=nil)
97a4cd6 @ahoward gem desc
authored
335 ERB.new(Util.unindent(@template)).result((b||@block).binding)
86d43db @ahoward rake-ify the project
authored
336 end
337 alias_method 'to_s', 'expand'
338 end
339 def Template(*args, &block) Template.new(*args, &block) end
340
97a4cd6 @ahoward gem desc
authored
341 # colored console output support
342 #
343 This.ansi = {
344 :clear => "\e[0m",
345 :reset => "\e[0m",
346 :erase_line => "\e[K",
347 :erase_char => "\e[P",
348 :bold => "\e[1m",
349 :dark => "\e[2m",
350 :underline => "\e[4m",
351 :underscore => "\e[4m",
352 :blink => "\e[5m",
353 :reverse => "\e[7m",
354 :concealed => "\e[8m",
355 :black => "\e[30m",
356 :red => "\e[31m",
357 :green => "\e[32m",
358 :yellow => "\e[33m",
359 :blue => "\e[34m",
360 :magenta => "\e[35m",
361 :cyan => "\e[36m",
362 :white => "\e[37m",
363 :on_black => "\e[40m",
364 :on_red => "\e[41m",
365 :on_green => "\e[42m",
366 :on_yellow => "\e[43m",
367 :on_blue => "\e[44m",
368 :on_magenta => "\e[45m",
369 :on_cyan => "\e[46m",
370 :on_white => "\e[47m"
371 }
372 def say(phrase, *args)
373 options = args.last.is_a?(Hash) ? args.pop : {}
374 options[:color] = args.shift.to_s.to_sym unless args.empty?
375 keys = options.keys
376 keys.each{|key| options[key.to_s.to_sym] = options.delete(key)}
377
378 color = options[:color]
379 bold = options.has_key?(:bold)
380
381 parts = [phrase]
382 parts.unshift(This.ansi[color]) if color
383 parts.unshift(This.ansi[:bold]) if bold
384 parts.push(This.ansi[:clear]) if parts.size > 1
385
386 method = options[:method] || :puts
387
388 Kernel.send(method, parts.join)
389 end
390
391 # always run out of the project dir
392 #
86d43db @ahoward rake-ify the project
authored
393 Dir.chdir(This.dir)
394 }
Something went wrong with that request. Please try again.