caffo (owner)

Revisions

gist: 2959 Download_button fork
public
Description:
sake task for syntax checking a ruby on rails project
Public Clone URL: git://gist.github.com/2959.git
Embed All Files: show embed
rails_check_syntax.rake #
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
# sake rails:check_syntax
# based on this rake task: http://moourl.com/s2dnw
# non-copyright (c) 2008 rodrigo franco <caffo@imap.cc>
 
namespace :rails do
  task :load_requirements_and do
    require 'erb'
    require 'open3'
    require 'yaml'
  end
 
  desc "Check all files"
  task :check_syntax => ["rails:check_ruby", "rails:check_erb", "rails:check_yaml"]
 
  desc "Check ERB files"
  task :check_erb => "rails:load_requirements_and" do
    puts "#{Time.now} - checking erb files..."
    (Dir["**/*.erb"] + Dir["**/*.rhtml"]).each do |file|
      next if file.match("vendor/rails")
      Open3.popen3('ruby -c') do |stdin, stdout, stderr|
        stdin.puts(ERB.new(File.read(file), nil, '-').src)
        stdin.close
        if (error||="") == ((stderr.readline rescue false))
          puts file + error[1..-1]
        end
        stdout.close rescue false
        stderr.close rescue false
      end
    end
  end
 
  desc "Check ruby files"
  task :check_ruby => "rails:load_requirements_and" do
    puts "#{Time.now} - checking ruby files..."
    Dir['**/*.rb'].each do |file|
      next if file.match("vendor/rails")
      next if file.match("vendor/plugins/.*/generators/.*/templates")
      Open3.popen3("ruby -c #{file}") do |stdin, stdout, stderr|
        puts("\t#{error}") if ((error ||= "") == stderr.readline rescue false)
        stdin.close rescue false
        stdout.close rescue false
        stderr.close rescue false
      end
    end
  end
 
  desc "Check YAML files"
  task :check_yaml => "rails:load_requirements_and" do
    puts "#{Time.now} - checking yaml files..."
    Dir['**/*.yml'].each do |file|
      next if file.match("vendor/rails")
      next if file.match("vendor/plugins/.*")
      begin
        YAML.load_file(file)
      rescue => e
        puts("\t#{file}:#{(e.message.match(/on line (\d+)/)[1] + ":") rescue nil} #{e.message}")
      end
    end
  end
end