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
78a9159 @ahoward import
authored
1 This.rubyforge_project = 'codeforpeople'
2 This.author = "Ara T. Howard"
3 This.email = "ara.t.howard@gmail.com"
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
4 This.homepage = "https://github.com/ahoward/#{ This.lib }"
78a9159 @ahoward import
authored
5
ef9ffc1 @ahoward add license
authored
6 task :license do
7 open('LICENSE', 'w'){|fd| fd.puts "same as ruby's"}
8 end
78a9159 @ahoward import
authored
9
10 task :default do
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
5ad387b @copiousfreetime Make Map ruby 1.9 -w clean.
copiousfreetime authored
35 command = "#{ This.ruby } -w -I ./lib -I ./test/lib #{ test_rb }"
78a9159 @ahoward import
authored
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
60 end
61
62
63 task :gemspec do
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
64 ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
65 ignore_directories = ['pkg']
66 ignore_files = ['test/log']
78a9159 @ahoward import
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
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
85 end
86
87 lib = This.lib
88 object = This.object
89 version = This.version
90 files = shiteless[Dir::glob("**/**")]
91 executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
92 #has_rdoc = true #File.exist?('doc')
78a9159 @ahoward import
authored
93 test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
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"
42330c2 @ahoward gem desc
authored
96 license = object.respond_to?(:license) ? object.license : "same as ruby's"
78a9159 @ahoward import
authored
97
98 if This.extensions.nil?
99 This.extensions = []
100 extensions = This.extensions
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
fdc0d13 @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
78a9159 @ahoward import
authored
118 template =
119 if test(?e, 'gemspec.erb')
120 Template{ IO.read('gemspec.erb') }
121 else
122 Template {
123 <<-__
fdc0d13 @ahoward version
authored
124 ## <%= lib %>.gemspec
78a9159 @ahoward import
authored
125 #
126
127 Gem::Specification::new do |spec|
fdc0d13 @ahoward version
authored
128 spec.name = <%= lib.inspect %>
129 spec.version = <%= version.inspect %>
78a9159 @ahoward import
authored
130 spec.platform = Gem::Platform::RUBY
fdc0d13 @ahoward version
authored
131 spec.summary = <%= lib.inspect %>
132 spec.description = <%= description.inspect %>
133 spec.license = <%= license.inspect %>
78a9159 @ahoward import
authored
134
fdc0d13 @ahoward version
authored
135 spec.files =\n<%= files.sort.pretty_inspect %>
136 spec.executables = <%= executables.inspect %>
78a9159 @ahoward import
authored
137
138 spec.require_path = "lib"
139
fdc0d13 @ahoward version
authored
140 spec.test_files = <%= test_files.inspect %>
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
141
fdc0d13 @ahoward version
authored
142 <% dependencies.each do |lib_version| %>
143 spec.add_dependency(*<%= Array(lib_version).flatten.inspect %>)
144 <% end %>
78a9159 @ahoward import
authored
145
fdc0d13 @ahoward version
authored
146 spec.extensions.push(*<%= extensions.inspect %>)
78a9159 @ahoward import
authored
147
fdc0d13 @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 %>
78a9159 @ahoward import
authored
152 end
153 __
154 }
155 end
156
d813ba5 @ahoward cleanup contructor. add Map.for. bump version. release.
authored
157 Fu.mkdir_p(This.pkgdir)
98e010f @ahoward super 'up correctly in method_missing. bundler friendly gemspec. re…
authored
158 gemspec = "#{ lib }.gemspec"
d813ba5 @ahoward cleanup contructor. add Map.for. bump version. release.
authored
159 open(gemspec, "w"){|fd| fd.puts(template)}
160 This.gemspec = gemspec
78a9159 @ahoward import
authored
161 end
162
163 task :gem => [:clean, :gemspec] do
d813ba5 @ahoward cleanup contructor. add Map.for. bump version. release.
authored
164 Fu.mkdir_p(This.pkgdir)
78a9159 @ahoward import
authored
165 before = Dir['*.gem']
166 cmd = "gem build #{ This.gemspec }"
167 `#{ cmd }`
168 after = Dir['*.gem']
169 gem = ((after - before).first || after.first) or abort('no gem!')
d813ba5 @ahoward cleanup contructor. add Map.for. bump version. release.
authored
170 Fu.mv(gem, This.pkgdir)
171 This.gem = File.join(This.pkgdir, File.basename(gem))
78a9159 @ahoward import
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
190 cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
191 samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
192 end
193
194 template =
42330c2 @ahoward gem desc
authored
195 if test(?e, 'README.erb')
196 Template{ IO.read('README.erb') }
78a9159 @ahoward import
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
d813ba5 @ahoward cleanup contructor. add Map.for. bump version. release.
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 }"
78a9159 @ahoward import
authored
235 puts cmd
d813ba5 @ahoward cleanup contructor. add Map.for. bump version. release.
authored
236 puts
237 system(cmd)
238 abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
78a9159 @ahoward import
authored
239 end
240
241
242
243
244
245 BEGIN {
246 # support for this rakefile
247 #
248 $VERBOSE = nil
249
250 require 'ostruct'
251 require 'erb'
252 require 'fileutils'
253 require 'rbconfig'
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
254 require 'pp'
78a9159 @ahoward import
authored
255
256 # fu shortcut
257 #
258 Fu = FileUtils
259
260 # cache a bunch of stuff about this rakefile/environment
261 #
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
268 # grok lib
269 #
270 lib = ENV['LIB']
271 unless lib
272 lib = File.basename(Dir.pwd).sub(/[-].*$/, '')
273 end
274 This.lib = lib
275
276 # grok version
277 #
278 version = ENV['VERSION']
279 unless version
280 require "./lib/#{ This.lib }"
281 This.name = lib.capitalize
282 This.object = eval(This.name)
283 version = This.object.send(:version)
284 end
285 This.version = version
286
fdc0d13 @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
78a9159 @ahoward import
authored
293 # we need to know the name of the lib an it's version
294 #
295 abort('no lib') unless This.lib
296 abort('no version') unless This.version
297
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 #
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
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
318 s.each_line do |line|
78a9159 @ahoward import
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
327 # template support
328 #
329 class Template
330 def initialize(&block)
331 @block = block
332 @template = block.call.to_s
333 end
334 def expand(b=nil)
fbf1c14 @ahoward update Rakefile for 1.9.2
authored
335 ERB.new(Util.unindent(@template)).result((b||@block).binding)
78a9159 @ahoward import
authored
336 end
337 alias_method 'to_s', 'expand'
338 end
339 def Template(*args, &block) Template.new(*args, &block) end
340
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 #
393 Dir.chdir(This.dir)
394 }
Something went wrong with that request. Please try again.