muding 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +17 -0
- data/MANIFEST +10 -1
- data/README +0 -9
- data/configs/boot.rb +45 -3
- data/configs/environment.rb +49 -0
- data/fresh_rakefile +5 -2
- data/helpers/test_helper.rb +2 -2
- data/lib/acts/container.rb +3 -2
- data/lib/code_statistics.rb +107 -0
- data/lib/commands/destroy.rb +3 -1
- data/lib/commands/generate.rb +1 -1
- data/lib/commands/server.rb +24 -2
- data/lib/commands/update.rb +1 -1
- data/lib/controller.rb +81 -26
- data/lib/handle.rb +8 -2
- data/lib/initializer.rb +612 -0
- data/lib/model.rb +0 -1
- data/lib/muding.rb +1 -1
- data/lib/muding_generator/base.rb +3 -3
- data/lib/muding_generator/commands.rb +7 -6
- data/lib/muding_generator/generators/applications/app/app_generator.rb +1 -0
- data/lib/muding_generator/generators/components/controller/controller_generator.rb +1 -1
- data/lib/muding_generator/generators/components/migration/migration_generator.rb +1 -1
- data/lib/muding_generator/generators/components/model/model_generator.rb +1 -1
- data/lib/muding_generator/lookup.rb +10 -10
- data/lib/muding_generator/scripts.rb +5 -5
- data/lib/tasks/databases.rake +169 -0
- data/lib/tasks/documentation.rake +55 -0
- data/lib/tasks/muding.rb +7 -0
- data/lib/tasks/statistics.rake +18 -0
- data/lib/tasks/testing.rake +102 -0
- data/lib/test_help.rb +19 -0
- data/lib/version.rb +11 -0
- metadata +12 -3
- data/lib/tasks/migrate.rake +0 -33
data/lib/model.rb
CHANGED
data/lib/muding.rb
CHANGED
@@ -26,8 +26,8 @@ module Muding
|
|
26
26
|
@source_root = options[:source] || File.join(spec.path, 'templates')
|
27
27
|
if options[:destination]
|
28
28
|
@destination_root = options[:destination]
|
29
|
-
elsif defined? ::
|
30
|
-
@destination_root = ::
|
29
|
+
elsif defined? ::MUDING_ROOT
|
30
|
+
@destination_root = ::MUDING_ROOT
|
31
31
|
end
|
32
32
|
|
33
33
|
# Silence the logger if requested.
|
@@ -101,7 +101,7 @@ module Muding
|
|
101
101
|
# If no name is provided, the generator raises a usage error with content
|
102
102
|
# optionally read from the USAGE file in the generator's base path.
|
103
103
|
#
|
104
|
-
# See
|
104
|
+
# See Muding::Generator::Base for a discussion of Manifests and Commands.
|
105
105
|
class NamedBase < Base
|
106
106
|
attr_reader :name, :class_name, :singular_name, :plural_name, :table_name
|
107
107
|
attr_reader :class_path, :file_path, :class_nesting, :class_nesting_depth
|
@@ -2,6 +2,7 @@ require 'delegate'
|
|
2
2
|
require 'optparse'
|
3
3
|
require 'fileutils'
|
4
4
|
require 'erb'
|
5
|
+
require 'version'
|
5
6
|
|
6
7
|
module Muding
|
7
8
|
module Generator
|
@@ -23,14 +24,14 @@ module Muding
|
|
23
24
|
end
|
24
25
|
|
25
26
|
|
26
|
-
# Generator commands delegate
|
27
|
+
# Generator commands delegate Muding::Generator::Base and implement
|
27
28
|
# a standard set of actions. Their behavior is defined by the way
|
28
29
|
# they respond to these actions: Create brings life; Destroy brings
|
29
30
|
# death; List passively observes.
|
30
31
|
#
|
31
32
|
# Commands are invoked by replaying (or rewinding) the generator's
|
32
|
-
# manifest of actions. See
|
33
|
-
#
|
33
|
+
# manifest of actions. See Muding::Generator::Manifest and
|
34
|
+
# Muding::Generator::Base#manifest method that generator subclasses
|
34
35
|
# are required to override.
|
35
36
|
#
|
36
37
|
# Commands allows generators to "plug in" invocation behavior, which
|
@@ -133,7 +134,7 @@ module Muding
|
|
133
134
|
class Create < Base
|
134
135
|
|
135
136
|
# Check whether the given class names are already taken by
|
136
|
-
# Ruby or
|
137
|
+
# Ruby or Muding. In the future, expand to check other namespaces
|
137
138
|
# such as the rest of the user's app.
|
138
139
|
def class_collisions(*class_names)
|
139
140
|
class_names.flatten.each do |class_name|
|
@@ -252,7 +253,7 @@ module Muding
|
|
252
253
|
source == destination
|
253
254
|
end
|
254
255
|
|
255
|
-
# Generate a file for a
|
256
|
+
# Generate a file for a Muding application using an ERuby template.
|
256
257
|
# Looks up and evalutes a template by name and writes the result.
|
257
258
|
#
|
258
259
|
# The ERB template uses explicit trim mode to best control the
|
@@ -321,7 +322,7 @@ module Muding
|
|
321
322
|
# Thanks to Florian Gross (flgr).
|
322
323
|
def raise_class_collision(class_name)
|
323
324
|
message = <<end_message
|
324
|
-
The name '#{class_name}' is reserved by
|
325
|
+
The name '#{class_name}' is reserved by Muding.
|
325
326
|
Please choose an alternative and run this generator again.
|
326
327
|
end_message
|
327
328
|
if suggest = find_synonyms(class_name)
|
@@ -43,6 +43,7 @@ class AppGenerator < Muding::Generator::Base
|
|
43
43
|
#m.template "configs/routes.rb", "config/routes.rb"
|
44
44
|
#m.template "configs/apache.conf", "public/.htaccess"
|
45
45
|
m.file "configs/boot.rb", "config/boot.rb"
|
46
|
+
m.template "configs/environment.rb", "config/environment.rb", :assigns => { :freeze => options[:freeze] }
|
46
47
|
|
47
48
|
# Environments
|
48
49
|
|
@@ -4,7 +4,7 @@ class Object
|
|
4
4
|
class << self
|
5
5
|
# Lookup missing generators using const_missing. This allows any
|
6
6
|
# generator to reference another without having to know its location:
|
7
|
-
# RubyGems, ~/.
|
7
|
+
# RubyGems, ~/.muding/generators, and MUDING_ROOT/generators.
|
8
8
|
def lookup_missing_generator(class_id)
|
9
9
|
if md = /(.+)Generator$/.match(class_id.to_s)
|
10
10
|
name = md.captures.first.demodulize.underscore
|
@@ -90,20 +90,20 @@ module Muding
|
|
90
90
|
end
|
91
91
|
|
92
92
|
# Use component generators (model, controller, etc).
|
93
|
-
# 1.
|
94
|
-
# generating in the context of a
|
95
|
-
#
|
96
|
-
# 2. User home directory. Search ~/.
|
93
|
+
# 1. muding application. If MUDING_ROOT is defined we know we're
|
94
|
+
# generating in the context of a muding application, so search
|
95
|
+
# MUDING_ROOT/generators.
|
96
|
+
# 2. User home directory. Search ~/.muding/generators.
|
97
97
|
# 3. RubyGems. Search for gems named *_generator.
|
98
98
|
# 4. Builtins. Model, controller, mailer, scaffold.
|
99
99
|
def use_component_sources!
|
100
100
|
reset_sources
|
101
|
-
if defined? ::
|
102
|
-
sources << PathSource.new(:lib, "#{::
|
103
|
-
sources << PathSource.new(:vendor, "#{::
|
104
|
-
sources << PathSource.new(:plugins, "#{::
|
101
|
+
if defined? ::MUDING_ROOT
|
102
|
+
sources << PathSource.new(:lib, "#{::MUDING_ROOT}/lib/generators")
|
103
|
+
sources << PathSource.new(:vendor, "#{::MUDING_ROOT}/vendor/generators")
|
104
|
+
sources << PathSource.new(:plugins, "#{::MUDING_ROOT}/vendor/plugins/**/generators")
|
105
105
|
end
|
106
|
-
sources << PathSource.new(:user, "#{Dir.user_home}/.
|
106
|
+
sources << PathSource.new(:user, "#{Dir.user_home}/.muding/generators")
|
107
107
|
sources << GemSource.new if Object.const_defined?(:Gem)
|
108
108
|
sources << PathSource.new(:builtin, "#{File.dirname(__FILE__)}/generators/components")
|
109
109
|
end
|
@@ -51,15 +51,15 @@ module Muding
|
|
51
51
|
|
52
52
|
usage << <<end_blurb
|
53
53
|
|
54
|
-
More are available at http://
|
54
|
+
More are available at http://muding.rubyforge.org
|
55
55
|
1. Download, for example, login_generator.zip
|
56
|
-
2. Unzip to directory #{Dir.user_home}/.
|
57
|
-
to use the generator with all your
|
56
|
+
2. Unzip to directory #{Dir.user_home}/.muding/generators/login
|
57
|
+
to use the generator with all your muding apps
|
58
58
|
end_blurb
|
59
59
|
|
60
|
-
if Object.const_defined?(:
|
60
|
+
if Object.const_defined?(:MUDING_ROOT)
|
61
61
|
usage << <<end_blurb
|
62
|
-
or to #{File.expand_path(
|
62
|
+
or to #{File.expand_path(MUDING_ROOT)}/generators/login
|
63
63
|
to use with this app only.
|
64
64
|
end_blurb
|
65
65
|
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
|
3
|
+
task :migrate => :environment do
|
4
|
+
ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
5
|
+
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
6
|
+
end
|
7
|
+
|
8
|
+
namespace :fixtures do
|
9
|
+
desc "Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y"
|
10
|
+
task :load => :environment do
|
11
|
+
require 'active_record/fixtures'
|
12
|
+
ActiveRecord::Base.establish_connection(MUDING_ENV.to_sym)
|
13
|
+
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'test', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
|
14
|
+
Fixtures.create_fixtures('test/fixtures', File.basename(fixture_file, '.*'))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
namespace :schema do
|
20
|
+
desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
|
21
|
+
task :dump => :environment do
|
22
|
+
require 'active_record/schema_dumper'
|
23
|
+
File.open(ENV['SCHEMA'] || "db/schema.rb", "w") do |file|
|
24
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Load a schema.rb file into the database"
|
29
|
+
task :load => :environment do
|
30
|
+
file = ENV['SCHEMA'] || "db/schema.rb"
|
31
|
+
load(file)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace :structure do
|
36
|
+
desc "Dump the database structure to a SQL file"
|
37
|
+
task :dump => :environment do
|
38
|
+
abcs = ActiveRecord::Base.configurations
|
39
|
+
case abcs[MUDING_ENV]["adapter"]
|
40
|
+
when "mysql", "oci"
|
41
|
+
ActiveRecord::Base.establish_connection(abcs[MUDING_ENV])
|
42
|
+
File.open("db/#{MUDING_ENV}_structure.sql", "w+") { |f| f <<
|
43
|
+
ActiveRecord::Base.connection.structure_dump }
|
44
|
+
when "postgresql"
|
45
|
+
ENV['PGHOST'] = abcs[MUDING_ENV]["host"] if abcs[MUDING_ENV]["host"]
|
46
|
+
ENV['PGPORT'] = abcs[MUDING_ENV]["port"].to_s if abcs[MUDING_ENV]["port"]
|
47
|
+
ENV['PGPASSWORD'] = abcs[MUDING_ENV]["password"].to_s if abcs[MUDING_ENV]["password"]
|
48
|
+
search_path = abcs[MUDING_ENV]["schema_search_path"]
|
49
|
+
search_path = "--schema=#{search_path}" if search_path
|
50
|
+
`pg_dump -i -U "#{abcs[MUIDING_ENV]["username"]}" -s -x -O -f db/#{MUDING_ENV}_structure.sql
|
51
|
+
#{search_path} #{abcs[MUDING_ENV]["database"]}`
|
52
|
+
raise "Error dumping database" if $?.exitstatus == 1
|
53
|
+
when "sqlite", "sqlite3"
|
54
|
+
dbfile = abcs[MUDING_ENV]["database"] || abcs[MUDING_ENV]["dbfile"]
|
55
|
+
`#{abcs[MUDING_ENV]["adapter"]} #{dbfile} .schema > db/#{MUDING_ENV}_structure.sql`
|
56
|
+
when "sqlserver"
|
57
|
+
`scptxfr /s #{abcs[MUDING_ENV]["host"]} /d #{abcs[MUDING_ENV]["database"]} /I /f
|
58
|
+
db\\#{MUDING_ENV}_structure.sql /q /A /r`
|
59
|
+
`scptxfr /s #{abcs[MUDING_ENV]["host"]} /d #{abcs[MUDING_ENV]["database"]} /I /F db\ /q /A
|
60
|
+
/r`
|
61
|
+
else
|
62
|
+
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
|
63
|
+
end
|
64
|
+
|
65
|
+
if ActiveRecord::Base.connection.supports_migrations?
|
66
|
+
File.open("db/#{MUDING_ENV}_structure.sql", "a") { |f| f <<
|
67
|
+
ActiveRecord::Base.connection.dump_schema_information }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
namespace :test do
|
73
|
+
desc "Recreate the test database from the current environment's database schema"
|
74
|
+
task :clone => "db:schema:dump" do
|
75
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
|
76
|
+
ActiveRecord::Schema.verbose = false
|
77
|
+
Rake::Task["db:schema:load"].invoke
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
desc "Recreate the test databases from the development structure"
|
82
|
+
task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
|
83
|
+
abcs = ActiveRecord::Base.configurations
|
84
|
+
case abcs["test"]["adapter"]
|
85
|
+
when "mysql"
|
86
|
+
ActiveRecord::Base.establish_connection(:test)
|
87
|
+
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
|
88
|
+
IO.readlines("db/#{MUDING_ENV}_structure.sql").join.split("\n\n").each do |table|
|
89
|
+
ActiveRecord::Base.connection.execute(table)
|
90
|
+
end
|
91
|
+
when "postgresql"
|
92
|
+
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
|
93
|
+
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
|
94
|
+
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
|
95
|
+
`psql -U "#{abcs["test"]["username"]}" -f db/#{MUDING_ENV}_structure.sql
|
96
|
+
#{abcs["test"]["database"]}`
|
97
|
+
when "sqlite", "sqlite3"
|
98
|
+
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
|
99
|
+
`#{abcs["test"]["adapter"]} #{dbfile} < db/#{MUDING_ENV}_structure.sql`
|
100
|
+
when "sqlserver"
|
101
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i
|
102
|
+
db\\#{MUDING_ENV}_structure.sql`
|
103
|
+
when "oci"
|
104
|
+
ActiveRecord::Base.establish_connection(:test)
|
105
|
+
IO.readlines("db/#{MUDING_ENV}_structure.sql").join.split(";\n\n").each do |ddl|
|
106
|
+
ActiveRecord::Base.connection.execute(ddl)
|
107
|
+
end
|
108
|
+
else
|
109
|
+
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
desc "Empty the test database"
|
114
|
+
task :purge => :environment do
|
115
|
+
abcs = ActiveRecord::Base.configurations
|
116
|
+
case abcs["test"]["adapter"]
|
117
|
+
when "mysql"
|
118
|
+
ActiveRecord::Base.establish_connection(:test)
|
119
|
+
ActiveRecord::Base.connection.recreate_database(abcs["test"]["database"])
|
120
|
+
when "postgresql"
|
121
|
+
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
|
122
|
+
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
|
123
|
+
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
|
124
|
+
enc_option = "-E #{abcs["test"]["encoding"]}" if abcs["test"]["encoding"]
|
125
|
+
`dropdb -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
|
126
|
+
`createdb #{enc_option} -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
|
127
|
+
when "sqlite","sqlite3"
|
128
|
+
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
|
129
|
+
File.delete(dbfile) if File.exist?(dbfile)
|
130
|
+
when "sqlserver"
|
131
|
+
dropfkscript = "#{abcs["test"]["host"]}.#{abcs["test"]["database"]}.DP1".gsub(/\\/,'-')
|
132
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{dropfkscript}`
|
133
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i
|
134
|
+
db\\#{MUDING_ENV}_structure.sql`
|
135
|
+
when "oci"
|
136
|
+
ActiveRecord::Base.establish_connection(:test)
|
137
|
+
ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
|
138
|
+
ActiveRecord::Base.connection.execute(ddl)
|
139
|
+
end
|
140
|
+
else
|
141
|
+
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
desc 'Prepare the test database and load the schema'
|
146
|
+
task :prepare => :environment do
|
147
|
+
Rake::Task[{ :sql => "db:test:clone_structure", :ruby => "db:test:clone" }[ActiveRecord::Base.schema_format]].invoke
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
namespace :sessions do
|
152
|
+
desc "Creates a sessions table for use with CGI::Session::ActiveRecordStore"
|
153
|
+
task :create => :environment do
|
154
|
+
raise "Task unavailable to this database (no migration support)" unless ActiveRecord::Base.connection.supports_migrations?
|
155
|
+
require 'rails_generator'
|
156
|
+
require 'rails_generator/scripts/generate'
|
157
|
+
Rails::Generator::Scripts::Generate.new.run(["session_migration", ENV["MIGRATION"] || "AddSessions"])
|
158
|
+
end
|
159
|
+
|
160
|
+
desc "Clear the sessions table"
|
161
|
+
task :clear => :environment do
|
162
|
+
ActiveRecord::Base.connection.execute "DELETE FROM sessions"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def session_table_name
|
168
|
+
ActiveRecord::Base.pluralize_table_names ? :sessions : :session
|
169
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
namespace :doc do
|
2
|
+
desc "Generate documentation for the application"
|
3
|
+
Rake::RDocTask.new("app") { |rdoc|
|
4
|
+
rdoc.rdoc_dir = 'doc/app'
|
5
|
+
rdoc.title = "Muding Application Documentation"
|
6
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
7
|
+
rdoc.rdoc_files.include('doc/README_FOR_APP')
|
8
|
+
rdoc.rdoc_files.include('app/**/*.rb')
|
9
|
+
}
|
10
|
+
|
11
|
+
desc "Generate documentation for the muding framework"
|
12
|
+
Rake::RDocTask.new("muding") { |rdoc|
|
13
|
+
rdoc.rdoc_dir = 'doc/api'
|
14
|
+
rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
15
|
+
rdoc.title = "muding Framework Documentation"
|
16
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
17
|
+
rdoc.rdoc_files.include('README')
|
18
|
+
}
|
19
|
+
|
20
|
+
plugins = FileList['vendor/plugins/**'].collect { |plugin| File.basename(plugin) }
|
21
|
+
|
22
|
+
desc "Generate documation for all installed plugins"
|
23
|
+
task :plugins => plugins.collect { |plugin| "doc:plugins:#{plugin}" }
|
24
|
+
|
25
|
+
desc "Remove plugin documentation"
|
26
|
+
task :clobber_plugins do
|
27
|
+
rm_rf 'doc/plugins' rescue nil
|
28
|
+
end
|
29
|
+
|
30
|
+
namespace :plugins do
|
31
|
+
# Define doc tasks for each plugin
|
32
|
+
plugins.each do |plugin|
|
33
|
+
task(plugin => :environment) do
|
34
|
+
plugin_base = "vendor/plugins/#{plugin}"
|
35
|
+
options = []
|
36
|
+
files = Rake::FileList.new
|
37
|
+
options << "-o doc/plugins/#{plugin}"
|
38
|
+
options << "--title '#{plugin.titlecase} Plugin Documentation'"
|
39
|
+
options << '--line-numbers' << '--inline-source'
|
40
|
+
options << '-T html'
|
41
|
+
|
42
|
+
files.include("#{plugin_base}/lib/**/*.rb")
|
43
|
+
if File.exists?("#{plugin_base}/README")
|
44
|
+
files.include("#{plugin_base}/README")
|
45
|
+
options << "--main '#{plugin_base}/README'"
|
46
|
+
end
|
47
|
+
files.include("#{plugin_base}/CHANGELOG") if File.exists?("#{plugin_base}/CHANGELOG")
|
48
|
+
|
49
|
+
options << files.to_s
|
50
|
+
|
51
|
+
sh %(rdoc #{options * ' '})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/tasks/muding.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
STATS_DIRECTORIES = [
|
2
|
+
%w(Helpers mud/helpers),
|
3
|
+
%w(Controllers mud/controllers),
|
4
|
+
%w(APIs mud/apis),
|
5
|
+
%w(Components components),
|
6
|
+
%w(Functional\ tests test/functional),
|
7
|
+
%w(Models mud/models),
|
8
|
+
%w(Unit\ tests test/unit),
|
9
|
+
%w(Libraries lib/),
|
10
|
+
%w(Integration\ tests test/integration)
|
11
|
+
].collect { |name, dir| [ name, "#{MUDING_ROOT}/#{dir}" ] }.select {
|
12
|
+
|name, dir| File.directory?(dir) }
|
13
|
+
|
14
|
+
desc "Report code statistics (KLOCs, etc) from the application"
|
15
|
+
task :stats do
|
16
|
+
require 'code_statistics'
|
17
|
+
CodeStatistics.new(*STATS_DIRECTORIES).to_s
|
18
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
TEST_CHANGES_SINCE = Time.now - 600
|
2
|
+
|
3
|
+
# Look up tests for recently modified sources.
|
4
|
+
def recent_tests(source_pattern, test_path, touched_since = 10.minutes.ago)
|
5
|
+
FileList[source_pattern].map do |path|
|
6
|
+
if File.mtime(path) > touched_since
|
7
|
+
test = "#{test_path}/#{File.basename(path, '.rb')}_test.rb"
|
8
|
+
test if File.exists?(test)
|
9
|
+
end
|
10
|
+
end.compact
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Recreated here from ActiveSupport because :uncommitted needs it before Rails is available
|
15
|
+
module Kernel
|
16
|
+
def silence_stderr
|
17
|
+
old_stderr = STDERR.dup
|
18
|
+
STDERR.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
19
|
+
STDERR.sync = true
|
20
|
+
yield
|
21
|
+
ensure
|
22
|
+
STDERR.reopen(old_stderr)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Test all units and functionals'
|
27
|
+
task :test do
|
28
|
+
Rake::Task["test:units"].invoke rescue got_error = true
|
29
|
+
Rake::Task["test:functionals"].invoke rescue got_error = true
|
30
|
+
|
31
|
+
if File.exist?("test/integration")
|
32
|
+
#Rake::Task["test:integration"].invoke rescue got_error = true
|
33
|
+
end
|
34
|
+
|
35
|
+
raise "Test failures" if got_error
|
36
|
+
end
|
37
|
+
|
38
|
+
namespace :test do
|
39
|
+
desc 'Test recent changes'
|
40
|
+
Rake::TestTask.new(:recent => "db:test:prepare") do |t|
|
41
|
+
since = TEST_CHANGES_SINCE
|
42
|
+
touched = FileList['test/**/*_test.rb'].select { |path| File.mtime(path) > since } +
|
43
|
+
recent_tests('app/models/*.rb', 'test/unit', since) +
|
44
|
+
recent_tests('app/controllers/*.rb', 'test/functional', since)
|
45
|
+
|
46
|
+
t.libs << 'test'
|
47
|
+
t.verbose = true
|
48
|
+
t.test_files = touched.uniq
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'Test changes since last checkin (only Subversion)'
|
52
|
+
Rake::TestTask.new(:uncommitted => "db:test:prepare") do |t|
|
53
|
+
def t.file_list
|
54
|
+
changed_since_checkin = silence_stderr { `svn status` }.map { |path| path.chomp[7 .. -1] }
|
55
|
+
|
56
|
+
models = changed_since_checkin.select { |path| path =~ /app\/models\/.*\.rb/ }
|
57
|
+
controllers = changed_since_checkin.select { |path| path =~ /app\/controllers\/.*\.rb/ }
|
58
|
+
|
59
|
+
unit_tests = models.map { |model| "test/unit/#{File.basename(model, '.rb')}_test.rb" }
|
60
|
+
functional_tests = controllers.map { |controller| "test/functional/#{File.basename(controller, '.rb')}_test.rb" }
|
61
|
+
|
62
|
+
unit_tests.uniq + functional_tests.uniq
|
63
|
+
end
|
64
|
+
|
65
|
+
t.libs << 'test'
|
66
|
+
t.verbose = true
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Run the unit tests in test/unit"
|
70
|
+
Rake::TestTask.new(:units => "db:test:prepare") do |t|
|
71
|
+
t.libs << "test"
|
72
|
+
t.pattern = 'test/unit/**/*_test.rb'
|
73
|
+
t.verbose = true
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "Run the functional tests in test/functional"
|
77
|
+
Rake::TestTask.new(:functionals => "db:test:prepare") do |t|
|
78
|
+
t.libs << "test"
|
79
|
+
t.pattern = 'test/functional/**/*_test.rb'
|
80
|
+
t.verbose = true
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Run the integration tests in test/integration"
|
84
|
+
Rake::TestTask.new(:integration => "db:test:prepare") do |t|
|
85
|
+
t.libs << "test"
|
86
|
+
t.pattern = 'test/integration/**/*_test.rb'
|
87
|
+
t.verbose = true
|
88
|
+
end
|
89
|
+
|
90
|
+
desc "Run the plugin tests in vendor/plugins/**/test (or specify with PLUGIN=name)"
|
91
|
+
Rake::TestTask.new(:plugins => :environment) do |t|
|
92
|
+
t.libs << "test"
|
93
|
+
|
94
|
+
if ENV['PLUGIN']
|
95
|
+
t.pattern = "vendor/plugins/#{ENV['PLUGIN']}/test/**/*_test.rb"
|
96
|
+
else
|
97
|
+
t.pattern = 'vendor/plugins/**/test/**/*_test.rb'
|
98
|
+
end
|
99
|
+
|
100
|
+
t.verbose = true
|
101
|
+
end
|
102
|
+
end
|