Rakefile in thorero-0.9.4.4 vs Rakefile in thorero-0.9.4.5

- old
+ new

@@ -1,185 +1,352 @@ -#!/usr/bin/env ruby -require 'pathname' -require 'rubygems' -require 'rake' +require "rake" require "rake/clean" require "rake/gempackagetask" +require "rake/rdoctask" +require "rake/testtask" +require "spec/rake/spectask" require "fileutils" -require Pathname('spec/rake/spectask') -require Pathname('lib/extlib/version') +require "extlib" -ROOT = Pathname(__FILE__).dirname.expand_path +def __DIR__ + File.dirname(__FILE__) +end +require __DIR__ + "/tools/rakehelp" +require __DIR__ + "/tools/annotation_extract" + +include FileUtils + +require "lib/merb-core/version" +require "lib/merb-core/test/run_specs" +require 'lib/merb-core/tasks/merb_rake_helper' + ############################################################################## # Package && release ############################################################################## RUBY_FORGE_PROJECT = "thorero" -PROJECT_URL = "http://thorero.rubyforge.org" -PROJECT_SUMMARY = "DataMapper and Merb support library." +PROJECT_URL = "http://merbivore.com" +PROJECT_SUMMARY = "Merb. Pocket rocket web framework." PROJECT_DESCRIPTION = PROJECT_SUMMARY AUTHOR = "test" -EMAIL = "test@gmail.com" +EMAIL = "test@test.test" GEM_NAME = "thorero" PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : '' -GEM_VERSION = Extlib::VERSION + PKG_BUILD +GEM_VERSION = Merb::VERSION + PKG_BUILD RELEASE_NAME = "REL #{GEM_VERSION}" -require "lib/extlib/tasks/release" +require "extlib/tasks/release" spec = Gem::Specification.new do |s| s.name = GEM_NAME s.version = GEM_VERSION s.platform = Gem::Platform::RUBY s.author = AUTHOR s.email = EMAIL s.homepage = PROJECT_URL s.summary = PROJECT_SUMMARY + s.bindir = "bin" s.description = PROJECT_DESCRIPTION + s.executables = %w( merb ) s.require_path = "lib" - s.files = ["LICENSE", "README.txt", "Rakefile"] + Dir["lib/**/*"] + s.files = %w( LICENSE README Rakefile TODO ) + Dir["{docs,bin,spec,lib,examples,app_generators,merb_generators,merb_default_generators,rspec_generators,test_unit_generators,script}/**/*"] # rdoc - s.has_rdoc = false - s.extra_rdoc_files = ["LICENSE", "README.txt"] + s.has_rdoc = true + s.extra_rdoc_files = %w( README LICENSE TODO ) + #s.rdoc_options += RDOC_OPTS + ["--exclude", "^(app|uploads)"] # Dependencies - s.add_dependency "english", ">=0.2.0" + s.add_dependency "extlib", ">=0.9.3" + s.add_dependency "erubis" + s.add_dependency "rake" + s.add_dependency "json_pure" + s.add_dependency "rspec" + s.add_dependency "rack" + s.add_dependency "mime-types" + # Requirements + s.requirements << "install the json gem to get faster json parsing" + s.required_ruby_version = ">= 1.8.4" end Rake::GemPackageTask.new(spec) do |package| package.gem_spec = spec end -desc 'Remove all package, docs and spec products' -task :clobber_all => %w[ clobber_package clobber_doc extlib:clobber_spec ] +desc "Run :package and install the resulting .gem" +task :install => :package do + sh %{#{sudo} gem install #{install_home} --local pkg/#{GEM_NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri} +end +desc "Run :package and install the resulting .gem with jruby" +task :jinstall => :package do + sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{NAME}-#{Merb::VERSION}.gem --no-rdoc --no-ri} +end + +desc "Run :clean and uninstall the .gem" +task :uninstall => :clean do + sh %{#{sudo} gem uninstall #{NAME}} +end + +CLEAN.include ["**/.*.sw?", "pkg", "lib/*.bundle", "*.gem", "doc/rdoc", ".config", "coverage", "cache"] + +desc "Run the specs." +task :default => :specs + +task :merb => [:clean, :rdoc, :package] + ############################################################################## -# Specs and continous integration +# Github ############################################################################## -task :default => 'extlib:spec' -task :spec => 'extlib:spec' +namespace :github do + desc "Update Github Gemspec" + task :update_gemspec do + skip_fields = %w(new_platform original_platform) + integer_fields = %w(specification_version) -namespace :extlib do - Spec::Rake::SpecTask.new(:spec) do |t| - t.spec_opts << '--format' << 'specdoc' << '--colour' - t.spec_opts << '--loadby' << 'random' - t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb') - - begin - t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true - t.rcov_opts << '--exclude' << 'spec' - t.rcov_opts << '--text-summary' - t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse' - rescue Exception - # rcov not installed + result = "Gem::Specification.new do |s|\n" + spec.instance_variables.each do |ivar| + value = spec.instance_variable_get(ivar) + name = ivar.split("@").last + next if skip_fields.include?(name) || value.nil? || value == "" || (value.respond_to?(:empty?) && value.empty?) + if name == "dependencies" + value.each do |d| + dep, *ver = d.to_s.split(" ") + result << " s.add_dependency #{dep.inspect}, #{ver.join(" ").inspect.gsub(/[()]/, "")}\n" + end + else + case value + when Array + value = name != "files" ? value.inspect : value.inspect.split(",").join(",\n") + when String + value = value.to_i if integer_fields.include?(name) + value = value.inspect + else + value = value.to_s.inspect + end + result << " s.#{name} = #{value}\n" + end end + result << "end" + File.open(File.join(File.dirname(__FILE__), "#{spec.name}.gemspec"), "w"){|f| f << result} end end - ############################################################################## # Documentation ############################################################################## -desc "Generate documentation" -task :doc do - begin - require 'yard' - exec 'yardoc' - rescue LoadError - puts 'You will need to install the latest version of Yard to generate the - documentation for extlib.' +task :doc => [:rdoc] +namespace :doc do + + Rake::RDocTask.new do |rdoc| + files = ["README", "LICENSE", "CHANGELOG", "lib/**/*.rb"] + rdoc.rdoc_files.add(files) + rdoc.main = "README" + rdoc.title = "Merb Docs" + rdoc.template = __DIR__ + "/tools/allison-2.0.2/lib/allison.rb" + rdoc.rdoc_dir = "doc/rdoc" + rdoc.options << "--line-numbers" << "--inline-source" end -end -WINDOWS = (RUBY_PLATFORM =~ /win32|mingw|bccwin|cygwin/) rescue nil -SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) + desc "run webgen" + task :webgen do + sh %{cd doc/site; webgen} + end + desc "rdoc to rubyforge" + task :rubyforge do + # sh %{rake doc} + sh %{#{sudo} chmod -R 755 doc} unless windows? + sh %{/usr/bin/scp -r -p doc/rdoc/* ezmobius@rubyforge.org:/var/www/gforge-projects/merb} + end -desc "Install #{GEM_NAME}" -task :install => :package do - sh %{#{SUDO} gem install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources} end -if WINDOWS - namespace :dev do - desc 'Install for development (for windows)' - task :winstall => :gem do - system %{gem install --no-rdoc --no-ri -l pkg/#{GEM_NAME}-#{GEM_VERSION}.gem} - end +############################################################################## +# rSpec & rcov +############################################################################## +desc "Run :specs, :rcov" +task :aok => [:specs, :rcov] + +# desc "Run all specs" +# Spec::Rake::SpecTask.new("specs") do |t| +# t.spec_opts = ["--format", "specdoc", "--colour"] +# t.spec_files = Dir["spec/**/*_spec.rb"].sort +# end + +def setup_specs(name, spec_cmd='spec', run_opts = "-c -f s") + desc "Run all specs (#{name})" + task "specs:#{name}" do + run_specs("spec/**/*_spec.rb", spec_cmd, ENV['RSPEC_OPTS'] || run_opts) end -end -namespace :ci do + desc "Run private specs (#{name})" + task "specs:#{name}:private" do + run_specs("spec/private/**/*_spec.rb", spec_cmd, ENV['RSPEC_OPTS'] || run_opts) + end - task :prepare do - rm_rf ROOT + "ci" - mkdir_p ROOT + "ci" - mkdir_p ROOT + "ci/doc" - mkdir_p ROOT + "ci/cyclomatic" - mkdir_p ROOT + "ci/token" + desc "Run public specs (#{name})" + task "specs:#{name}:public" do + run_specs("spec/public/**/*_spec.rb", spec_cmd, ENV['RSPEC_OPTS'] || run_opts) end - task :publish do - out = ENV['CC_BUILD_ARTIFACTS'] || "out" - mkdir_p out unless File.directory? out + # With profiling formatter + desc "Run all specs (#{name}) with profiling formatter" + task "specs:#{name}_profiled" do + run_specs("spec/**/*_spec.rb", spec_cmd, "-c -f o") + end - mv "ci/unit_rspec_report.html", "#{out}/unit_rspec_report.html" - mv "ci/unit_coverage", "#{out}/unit_coverage" - mv "ci/integration_rspec_report.html", "#{out}/integration_rspec_report.html" - mv "ci/integration_coverage", "#{out}/integration_coverage" - mv "ci/doc", "#{out}/doc" - mv "ci/cyclomatic", "#{out}/cyclomatic_complexity" - mv "ci/token", "#{out}/token_complexity" + desc "Run private specs (#{name}) with profiling formatter" + task "specs:#{name}_profiled:private" do + run_specs("spec/private/**/*_spec.rb", spec_cmd, "-c -f o") end + desc "Run public specs (#{name}) with profiling formatter" + task "specs:#{name}_profiled:public" do + run_specs("spec/public/**/*_spec.rb", spec_cmd, "-c -f o") + end +end - Spec::Rake::SpecTask.new("spec:unit" => :prepare) do |t| - t.spec_opts = ["--format", "specdoc", "--format", "html:#{ROOT}/ci/unit_rspec_report.html", "--diff"] - t.spec_files = Pathname.glob(ROOT + "spec/unit/**/*_spec.rb") - unless ENV['NO_RCOV'] - t.rcov = true - t.rcov_opts << '--exclude' << "spec,gems" - t.rcov_opts << '--text-summary' - t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse' - t.rcov_opts << '--only-uncovered' - end +setup_specs("mri", "spec") +setup_specs("jruby", "jruby -S spec") + +task "specs" => ["specs:mri"] +task "specs:private" => ["specs:mri:private"] +task "specs:public" => ["specs:mri:public"] + +desc "Run coverage suite" +task :rcov do + require 'fileutils' + FileUtils.rm_rf("coverage") if File.directory?("coverage") + FileUtils.mkdir("coverage") + path = File.expand_path(Dir.pwd) + files = Dir["spec/**/*_spec.rb"] + files.each do |spec| + puts "Getting coverage for #{File.expand_path(spec)}" + command = %{rcov #{File.expand_path(spec)} --aggregate #{path}/coverage/data.data --exclude ".*" --include-file "lib/merb-core(?!\/vendor)"} + command += " --no-html" unless spec == files.last + `#{command} 2>&1` end +end - Spec::Rake::SpecTask.new("spec:integration" => :prepare) do |t| - t.spec_opts = ["--format", "specdoc", "--format", "html:#{ROOT}/ci/integration_rspec_report.html", "--diff"] - t.spec_files = Pathname.glob(ROOT + "spec/integration/**/*_spec.rb") - unless ENV['NO_RCOV'] - t.rcov = true - t.rcov_opts << '--exclude' << "spec,gems" - t.rcov_opts << '--text-summary' - t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse' - t.rcov_opts << '--only-uncovered' - end +desc "Run a specific spec with TASK=xxxx" +Spec::Rake::SpecTask.new("spec") do |t| + t.spec_opts = ["--format", "specdoc", "--colour"] + t.libs = ["lib", "server/lib" ] + t.spec_files = (ENV["TASK"] || '').split(',').map do |task| + "spec/**/#{task}_spec.rb" end +end - task :spec do - Rake::Task["ci:spec:unit"].invoke - mv ROOT + "coverage", ROOT + "ci/unit_coverage" +desc "Run all specs output html" +Spec::Rake::SpecTask.new("specs_html") do |t| + t.spec_opts = ["--format", "html"] + t.libs = ["lib", "server/lib" ] + t.spec_files = Dir["spec/**/*_spec.rb"].sort +end - Rake::Task["ci:spec:integration"].invoke - mv ROOT + "coverage", ROOT + "ci/integration_coverage" +# desc "RCov" +# Spec::Rake::SpecTask.new("rcov") do |t| +# t.rcov_opts = ["--exclude", "gems", "--exclude", "spec"] +# t.spec_opts = ["--format", "specdoc", "--colour"] +# t.spec_files = Dir["spec/**/*_spec.rb"].sort +# t.libs = ["lib", "server/lib"] +# t.rcov = true +# end + +STATS_DIRECTORIES = [ + ['Code', 'lib/'], + ['Unit tests', 'spec'] +].collect { |name, dir| [ name, "./#{dir}" ] }. + select { |name, dir| File.directory?(dir) } + +desc "Report code statistics (KLOCs, etc) from the application" +task :stats do + require __DIR__ + "/tools/code_statistics" + # require "extra/stats" + verbose = true + CodeStatistics.new(*STATS_DIRECTORIES).to_s +end + +############################################################################## +# SYNTAX CHECKING +############################################################################## + +task :check_syntax do + `find . -name "*.rb" |xargs -n1 ruby -c |grep -v "Syntax OK"` + puts "* Done" +end + +############################################################################## +# SVN +############################################################################## +namespace :repo do + + desc "Add new files to repository" + task :add do + if File.directory?(".git") + system "git add *" + elsif File.directory?(".svn") + system "svn status | grep '^\?' | sed -e 's/? *//' | sed -e 's/ /\ /g' | xargs svn add" + end end - task :doc do - require 'yardoc' - sh 'yardoc' + desc "Fetch changes from master repository" + task :rebase do + if File.directory?(".git") + system "git stash ; git svn rebase ; git stash apply" + elsif File.directory?(".svn") + system "svn update" + end end - task :saikuro => :prepare do - system "saikuro -c -i lib -y 0 -w 10 -e 15 -o ci/cyclomatic" - mv 'ci/cyclomatic/index_cyclo.html', 'ci/cyclomatic/index.html' + desc "commit modified changes to the repository" + task :commit do + if File.directory?(".git") + system "git commit" + elsif File.directory?(".svn") + system "svn commit" + end + end - system "saikuro -t -i lib -y 0 -w 20 -e 30 -o ci/token" - mv 'ci/token/index_token.html', 'ci/token/index.html' +end + +# Run specific tests or test files. Searches nested spec directories as well. +# +# Based on a technique popularized by Geoffrey Grosenbach +rule "" do |t| + spec_cmd = (RUBY_PLATFORM =~ /java/) ? "jruby -S spec" : "spec" + # spec:spec_file:spec_name + if /spec:(.*)$/.match(t.name) + arguments = t.name.split(':') + + file_name = arguments[1] + spec_name = arguments[2..-1] + + spec_filename = "#{file_name}_spec.rb" + specs = Dir["spec/**/#{spec_filename}"] + + if path = specs.detect { |f| spec_filename == File.basename(f) } + run_file_name = path + else + puts "No specs found for #{t.name.inspect}" + exit + end + + example = " -e '#{spec_name}'" unless spec_name.empty? + + sh "#{spec_cmd} #{run_file_name} --format specdoc --colour #{example}" end end -task :ci => ["ci:spec", "ci:doc", "ci:saikuro", :install, :publish] + +namespace :tools do + namespace :tags do + desc "Generates Emacs tags using Exuberant Ctags." + task :emacs do + sh "ctags -e --Ruby-kinds=-f -o TAGS -R lib" + end + end +end