bscofield (owner)

Forks

Revisions

gist: 10841 Download_button fork
public
Public Clone URL: git://gist.github.com/10841.git
Embed All Files: show embed
Text only #
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# module: audit
 
class Audit < Thor
  desc "all", "Run all audit tasks"
  def all
    %w(architecture database stats tests coverage flog roodi filesize).each do |task|
      log "\n*** reviewing #{task}", true
      log `thor audit:#{task}`, true
    end
  end
  
  desc "architecture", "Inspect and report on architectural decisions made for a given Rails application."
  def architecture
    log "\nRAILS", true
    if File.exists?("vendor/rails/railties/CHANGELOG")
      # TODO: determine revision of frozen Rails
      log " Frozen v"
    else
      gem_rails = `gem list --local | grep "^rails ("`.scan(/\((.+)\)/).flatten
      log " Gem v#{gem_rails}"
    end
 
    log "\nJAVASCRIPT", true
    log " Prototype" if File.exists?("public/javascripts/prototype.js")
    # TODO: get prototype version from first line
    log " jQuery" if File.exists?("public/javascripts/jquery.js")
    # TODO: get jquery version from second line
    
    log "\nTESTING FRAMEWORK", true
    log " Test::Unit" if true
    log " RSpec" if false
    
    log "\nPLUGINS", true
    plugins = Dir.glob('vendor/plugins/*')
    log " none" if plugins.empty?
    plugins.each do |plugin|
      log " #{plugin.sub('vendor/plugins/', '')}"
    end
    
    log "\nGEMS", true
    gems = `rake gems`.split(/\n/).select {|line| line =~ /^\[/}
    log " none" if gems.empty?
    gems.each do |gem|
      status = gem =~ /\[F\]/ ? 'frozen' : ''
      log " #{gem.gsub(/\[.\] /, '')} #{status}"
    end
  end
  
  desc "database", "Attempt to load database from scratch via migrations"
  # TODO: suppress errors in migrations
  def database
    created = `rake db:create:all`.chomp
    if created.split(/\n/).size == 1
      log "\nDATABASE MIGRATION", true
      migrated = `rake db:migrate`
      log migrated.gsub(/\n/, "\n ")
    else
      log "\nDATABASE CREATION FAILED"
    end
  end
 
  desc "stats", "Run rake stats for the application"
  def stats
    log `rake stats`
  end
  
  desc "tests", "Run tests for the application"
  def tests
    log `rake`
  end
  
  desc "coverage", "Run rcov for the application"
  def coverage
    log `rcov --rails -T --no-html --only-uncovered --sort coverage test/*/*_test.rb`
  end
  
  desc "flog", "Run flog on controllers and models"
  def flog
    controller_results = `find app/controllers -name \*.rb | xargs flagellate | grep ": ("`.select {|r| r.gsub(/.+\(/, '').sub(/\)/, '').to_i > 40.0}
    model_results = `find app/models -name \*.rb | xargs flagellate | grep ": ("`.select {|r| r.gsub(/.+\(/, '').sub(/\)/, '').to_i > 40.0}.join.chomp
    
    unless controller_results.empty?
      log "\nCONTROLLERS", true
      log ' ' + controller_results.join.chomp
    end
 
    unless model_results.empty?
      log "\nMODELS", true
      log ' ' + model_results.join.chomp
    end
  end
  
  desc "roodi", "Run roodi for the application"
  def roodi
    log `roodi "./app/**/*.rb"`
  end
  
  desc "filesize", "Check for abnormally large or small files"
  def filesize
    controllers = `find app/controllers -name *.rb | xargs wc -l`
    small_controllers = controllers.select {|m| m =~ / 2 app/}
    unless small_controllers.empty?
      log "\nUNMODIFIED CONTROLLERS", true
      log ' ' + small_controllers.map {|h| h.sub(/.+ app\/controllers\//, '')}.join.chomp
    end
 
    helpers = `find app/helpers -name *.rb | xargs wc -l`
    small_helpers = helpers.select {|m| m =~ / 2 app/}
    unless small_helpers.empty?
      log "\nUNMODIFIED HELPERS", true
      log ' ' + small_helpers.map {|h| h.sub(/.+ app\/helpers\//, '')}.join.chomp
    end
    
    models = `find app/models -name *.rb | xargs wc -l`
    small_models = models.select {|m| m =~ / 2 app/}
    unless small_models.empty?
      log "\nUNMODIFIED MODELS", true
      log ' ' + small_models.map {|h| h.sub(/.+ app\/models\//, '')}.join.chomp
    end
    
    large_controllers = controllers.select {|m| m.scan(/ (\d+) app/).flatten.first.to_i > 100}
    unless large_controllers.empty?
      log "\nLARGE CONTROLLERS", true
      log ' ' + large_controllers.map {|h| h.sub(/.+ app\/controllers\//, '')}.join.chomp
    end
 
    large_helpers = helpers.select {|m| m.scan(/ (\d+) app/).flatten.first.to_i > 100}
    unless large_helpers.empty?
      log "\nLARGE HELPERS", true
      log ' ' + large_helpers.map {|h| h.sub(/.+ app\/helpers\//, '')}.join.chomp
    end
 
    large_models = models.select {|m| m.scan(/ (\d+) app/).flatten.first.to_i > 100}
    unless large_models.empty?
      log "\nLARGE MODELS", true
      log ' ' + large_models.map {|h| h.sub(/.+ app\/models\//, '')}.join.chomp
    end
 
  end
  
  
  private
  def log(message, header = false)
    message = message.gsub(/\n/, "\n ") unless header
    puts message
    
    # logfile = 'audit.txt'
    #
    # @log ||= File.new(File.expand_path(logfile), 'w')
    # @log.puts message
  end
end