1 This.rubyforge_project = 'codeforpeople'
2 This.author = "Ara T. Howard"
3 This.email = "ara.t.howard@gmail.com"
4 This.homepage = "https://github.com/ahoward/#{ This.lib }"
7 open('LICENSE', 'w'){|fd| fd.puts "same as ruby's"}
11 puts((Rake::Task.tasks.map{|task| task.name.gsub(/::/,':')} - ['default']).sort)
19 task(:unit){ run_tests!(:unit) }
20 task(:functional){ run_tests!(:functional) }
21 task(:integration){ run_tests!(:integration) }
24 def run_tests!(which = nil)
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
33 test_rbs.each_with_index do |test_rb, index|
35 command = "#{ This.ruby } -I ./lib -I ./test/lib #{ test_rb }"
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)
45 say(line, :color => :cyan, :bold => true)
47 status = $?.exitstatus
50 say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
51 say("SUCCESS", :color => :green, :bold => true)
53 say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
54 say("FAILURE", :color => :red, :bold => true)
56 say(line, :color => :cyan, :bold => true)
58 exit(status) unless status.zero?
64 ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
65 ignore_directories = ['pkg']
66 ignore_files = ['test/log', 'a.rb']
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}
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}
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}
89 version = This.version
90 files = shiteless[Dir::glob("**/**")]
91 executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
92 #has_rdoc = true #File.exist?('doc')
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"
97 if This.extensions.nil?
99 extensions = This.extensions
100 %w( Makefile configure extconf.rb ).each do |ext|
101 extensions << ext if File.exists?(ext)
104 extensions = [extensions].flatten.compact
107 if test(?e, 'gemspec.erb')
108 Template{ IO.read('gemspec.erb') }
115 Gem::Specification::new do |spec|
116 spec.name = #{ lib.inspect }
117 spec.version = #{ version.inspect }
118 spec.platform = Gem::Platform::RUBY
119 spec.summary = #{ lib.inspect }
120 spec.description = #{ description.inspect }
122 spec.files =\n#{ files.sort.pretty_inspect }
123 spec.executables = #{ executables.inspect }
125 spec.require_path = "lib"
127 spec.test_files = #{ test_files.inspect }
129 ### spec.add_dependency 'lib', '>= version'
130 #### spec.add_dependency 'map'
132 spec.extensions.push(*#{ extensions.inspect })
134 spec.rubyforge_project = #{ This.rubyforge_project.inspect }
135 spec.author = #{ This.author.inspect }
136 spec.email = #{ This.email.inspect }
137 spec.homepage = #{ This.homepage.inspect }
143 Fu.mkdir_p(This.pkgdir)
144 gemspec = "#{ lib }.gemspec"
145 open(gemspec, "w"){|fd| fd.puts(template)}
146 This.gemspec = gemspec
149 task :gem => [:clean, :gemspec] do
150 Fu.mkdir_p(This.pkgdir)
151 before = Dir['*.gem']
152 cmd = "gem build #{ This.gemspec }"
155 gem = ((after - before).first || after.first) or abort('no gem!')
156 Fu.mv(gem, This.pkgdir)
157 This.gem = File.join(This.pkgdir, File.basename(gem))
164 version = This.version
166 Dir['sample*/*'].sort.each do |sample|
167 samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
169 cmd = "cat #{ sample }"
170 samples << Util.indent(prompt + cmd, 2) << "\n\n"
171 samples << Util.indent(`#{ cmd }`, 4) << "\n"
173 cmd = "ruby #{ sample }"
174 samples << Util.indent(prompt + cmd, 2) << "\n\n"
176 cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
177 samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
181 if test(?e, 'readme.erb')
182 Template{ IO.read('readme.erb') }
200 open("README", "w"){|fd| fd.puts template}
205 Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
209 task :release => [:clean, :gemspec, :gem] do
210 gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
211 raise "which one? : #{ gems.inspect }" if gems.size > 1
212 raise "no gems?" if gems.size < 1
214 cmd = "gem push #{ This.gem }"
218 abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
220 cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.gem }"
224 abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
232 # support for this rakefile
246 # cache a bunch of stuff about this rakefile/environment
248 This = OpenStruct.new
250 This.file = File.expand_path(__FILE__)
251 This.dir = File.dirname(This.file)
252 This.pkgdir = File.join(This.dir, 'pkg')
258 lib = File.basename(Dir.pwd).sub(/[-].*$/, '')
264 version = ENV['VERSION']
266 require "./lib/#{ This.lib }"
267 This.name = lib.capitalize
268 This.object = eval(This.name)
269 version = This.object.send(:version)
271 This.version = version
273 # we need to know the name of the lib an it's version
275 abort('no lib') unless This.lib
276 abort('no version') unless This.version
278 # discover full path to this ruby executable
280 c = begin; ::RbConfig::CONFIG; rescue NameError; ::Config::CONFIG; end
281 bindir = c["bindir"] || c['BINDIR']
282 ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
283 ruby_ext = c['EXEEXT'] || ''
284 ruby = File.join(bindir, (ruby_install_name + ruby_ext))
298 s.each_line do |line|
299 next if line =~ %r/^\s*$/
300 indent = line[%r/^\s*/] and break
302 indent ? s.gsub(%r/^#{ indent }/, "") : s
310 def initialize(&block)
312 @template = block.call.to_s
315 ERB.new(Util.unindent(@template)).result((b||@block).binding)
317 alias_method 'to_s', 'expand'
319 def Template(*args, &block) Template.new(*args, &block) end
321 # colored console output support
326 :erase_line => "\e[K",
327 :erase_char => "\e[P",
330 :underline => "\e[4m",
331 :underscore => "\e[4m",
334 :concealed => "\e[8m",
340 :magenta => "\e[35m",
343 :on_black => "\e[40m",
345 :on_green => "\e[42m",
346 :on_yellow => "\e[43m",
347 :on_blue => "\e[44m",
348 :on_magenta => "\e[45m",
349 :on_cyan => "\e[46m",
350 :on_white => "\e[47m"
352 def say(phrase, *args)
353 options = args.last.is_a?(Hash) ? args.pop : {}
354 options[:color] = args.shift.to_s.to_sym unless args.empty?
356 keys.each{|key| options[key.to_s.to_sym] = options.delete(key)}
358 color = options[:color]
359 bold = options.has_key?(:bold)
362 parts.unshift(This.ansi[color]) if color
363 parts.unshift(This.ansi[:bold]) if bold
364 parts.push(This.ansi[:clear]) if parts.size > 1
366 method = options[:method] || :puts
368 Kernel.send(method, parts.join)
371 # always run out of the project dir