rails 1.2.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rails might be problematic. Click here for more details.
- data/CHANGELOG +491 -12
- data/MIT-LICENSE +1 -1
- data/README +17 -25
- data/Rakefile +41 -18
- data/bin/about +1 -1
- data/bin/console +1 -1
- data/bin/destroy +1 -1
- data/bin/generate +1 -1
- data/bin/performance/request +3 -0
- data/bin/plugin +1 -1
- data/bin/runner +1 -1
- data/bin/server +1 -1
- data/builtin/rails_info/rails/info.rb +2 -2
- data/configs/apache.conf +1 -1
- data/configs/databases/mysql.yml +9 -3
- data/configs/databases/postgresql.yml +16 -12
- data/configs/initializers/inflections.rb +10 -0
- data/configs/initializers/mime_types.rb +5 -0
- data/configs/routes.rb +23 -11
- data/doc/README_FOR_APP +1 -1
- data/environments/boot.rb +95 -26
- data/environments/development.rb +2 -5
- data/environments/environment.rb +24 -25
- data/environments/test.rb +4 -1
- data/helpers/application.rb +5 -2
- data/helpers/test_helper.rb +10 -0
- data/html/422.html +30 -0
- data/html/500.html +1 -1
- data/html/index.html +2 -2
- data/html/javascripts/controls.js +484 -354
- data/html/javascripts/dragdrop.js +88 -58
- data/html/javascripts/effects.js +396 -364
- data/html/javascripts/prototype.js +2817 -1107
- data/html/robots.txt +5 -1
- data/lib/commands/console.rb +12 -5
- data/lib/commands/performance/request.rb +6 -0
- data/lib/commands/plugin.rb +15 -10
- data/lib/commands/process/spawner.rb +14 -4
- data/lib/commands/servers/base.rb +12 -0
- data/lib/commands/servers/mongrel.rb +5 -1
- data/lib/commands/servers/webrick.rb +14 -7
- data/lib/console_app.rb +5 -2
- data/lib/console_with_helpers.rb +5 -2
- data/lib/dispatcher.rb +3 -151
- data/lib/fcgi_handler.rb +79 -81
- data/lib/initializer.rb +125 -169
- data/lib/rails/plugin.rb +84 -0
- data/lib/rails/plugin/loader.rb +150 -0
- data/lib/rails/plugin/locator.rb +78 -0
- data/lib/rails/version.rb +3 -3
- data/lib/rails_generator/base.rb +11 -9
- data/lib/rails_generator/commands.rb +20 -10
- data/lib/rails_generator/generators/applications/app/USAGE +0 -7
- data/lib/rails_generator/generators/applications/app/app_generator.rb +25 -6
- data/lib/rails_generator/generators/components/controller/USAGE +11 -12
- data/lib/rails_generator/generators/components/controller/controller_generator.rb +2 -2
- data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +1 -11
- data/lib/rails_generator/generators/components/controller/templates/{view.rhtml → view.html.erb} +0 -0
- data/lib/rails_generator/generators/components/integration_test/USAGE +5 -11
- data/lib/rails_generator/generators/components/mailer/USAGE +8 -10
- data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +3 -3
- data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -3
- data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +8 -24
- data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -3
- data/lib/rails_generator/generators/components/migration/USAGE +23 -8
- data/lib/rails_generator/generators/components/migration/migration_generator.rb +15 -2
- data/lib/rails_generator/generators/components/migration/templates/migration.rb +6 -2
- data/lib/rails_generator/generators/components/model/USAGE +15 -14
- data/lib/rails_generator/generators/components/model/model_generator.rb +10 -3
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +11 -3
- data/lib/rails_generator/generators/components/model/templates/migration.rb +4 -1
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +1 -3
- data/lib/rails_generator/generators/components/observer/USAGE +5 -7
- data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +0 -2
- data/lib/rails_generator/generators/components/plugin/USAGE +8 -18
- data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
- data/lib/rails_generator/generators/components/plugin/templates/README +10 -1
- data/lib/rails_generator/generators/components/plugin/templates/USAGE +1 -1
- data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -1
- data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -1
- data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +1 -1
- data/lib/rails_generator/generators/components/resource/USAGE +23 -0
- data/lib/rails_generator/generators/components/resource/resource_generator.rb +13 -15
- data/lib/rails_generator/generators/components/resource/templates/controller.rb +1 -1
- data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +2 -14
- data/lib/rails_generator/generators/components/scaffold/USAGE +24 -31
- data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +45 -146
- data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +64 -37
- data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +23 -80
- data/lib/rails_generator/generators/components/scaffold/templates/{layout.rhtml → layout.html.erb} +0 -0
- data/lib/rails_generator/generators/components/scaffold/templates/style.css +1 -1
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_edit.rhtml → scaffold/templates/view_edit.html.erb} +4 -4
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_index.rhtml → scaffold/templates/view_index.html.erb} +4 -4
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_new.rhtml → scaffold/templates/view_new.html.erb} +3 -3
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_show.rhtml → scaffold/templates/view_show.html.erb} +1 -1
- data/lib/rails_generator/generators/components/session_migration/USAGE +6 -11
- data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +3 -3
- data/lib/rails_generator/lookup.rb +45 -10
- data/lib/rails_generator/scripts.rb +6 -3
- data/lib/rails_generator/scripts/destroy.rb +23 -0
- data/lib/rails_generator/secret_key_generator.rb +160 -0
- data/lib/rails_generator/spec.rb +1 -1
- data/lib/source_annotation_extractor.rb +62 -0
- data/lib/tasks/annotations.rake +23 -0
- data/lib/tasks/databases.rake +249 -83
- data/lib/tasks/documentation.rake +11 -13
- data/lib/tasks/framework.rake +1 -1
- data/lib/tasks/rails.rb +1 -1
- data/lib/tasks/testing.rake +5 -7
- data/lib/test_help.rb +4 -3
- data/lib/webrick_server.rb +3 -4
- metadata +31 -49
- data/bin/breakpointer +0 -3
- data/lib/binding_of_caller.rb +0 -85
- data/lib/breakpoint.rb +0 -553
- data/lib/breakpoint_client.rb +0 -196
- data/lib/commands/breakpointer.rb +0 -1
- data/lib/rails_generator/generators/components/resource/templates/USAGE +0 -18
- data/lib/rails_generator/generators/components/resource/templates/fixtures.yml +0 -11
- data/lib/rails_generator/generators/components/resource/templates/migration.rb +0 -13
- data/lib/rails_generator/generators/components/resource/templates/model.rb +0 -2
- data/lib/rails_generator/generators/components/resource/templates/unit_test.rb +0 -10
- data/lib/rails_generator/generators/components/scaffold/templates/form.rhtml +0 -3
- data/lib/rails_generator/generators/components/scaffold/templates/form_scaffolding.rhtml +0 -1
- data/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml +0 -9
- data/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml +0 -27
- data/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml +0 -8
- data/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml +0 -8
- data/lib/rails_generator/generators/components/scaffold_resource/USAGE +0 -29
- data/lib/rails_generator/generators/components/scaffold_resource/scaffold_resource_generator.rb +0 -93
- data/lib/rails_generator/generators/components/scaffold_resource/templates/controller.rb +0 -79
- data/lib/rails_generator/generators/components/scaffold_resource/templates/fixtures.yml +0 -11
- data/lib/rails_generator/generators/components/scaffold_resource/templates/functional_test.rb +0 -57
- data/lib/rails_generator/generators/components/scaffold_resource/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold_resource/templates/layout.rhtml +0 -17
- data/lib/rails_generator/generators/components/scaffold_resource/templates/migration.rb +0 -13
- data/lib/rails_generator/generators/components/scaffold_resource/templates/model.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold_resource/templates/style.css +0 -74
- data/lib/rails_generator/generators/components/scaffold_resource/templates/unit_test.rb +0 -10
- data/lib/rails_generator/generators/components/web_service/USAGE +0 -28
- data/lib/rails_generator/generators/components/web_service/templates/api_definition.rb +0 -5
- data/lib/rails_generator/generators/components/web_service/templates/controller.rb +0 -8
- data/lib/rails_generator/generators/components/web_service/templates/functional_test.rb +0 -19
- data/lib/rails_generator/generators/components/web_service/web_service_generator.rb +0 -29
- data/lib/tasks/pre_namespace_aliases.rake +0 -53
@@ -43,9 +43,12 @@ module Rails
|
|
43
43
|
|
44
44
|
def usage_message
|
45
45
|
usage = "\nInstalled Generators\n"
|
46
|
-
Rails::Generator::Base.sources.
|
46
|
+
Rails::Generator::Base.sources.inject({}) do |mem, source|
|
47
47
|
label = source.label.to_s.capitalize
|
48
|
-
|
48
|
+
mem[label] ||= []
|
49
|
+
mem[label] |= source.names
|
50
|
+
mem
|
51
|
+
end.each_pair do |label, names|
|
49
52
|
usage << " #{label}: #{names.join(', ')}\n" unless names.empty?
|
50
53
|
end
|
51
54
|
|
@@ -59,7 +62,7 @@ end_blurb
|
|
59
62
|
|
60
63
|
if Object.const_defined?(:RAILS_ROOT)
|
61
64
|
usage << <<end_blurb
|
62
|
-
or to #{File.expand_path(RAILS_ROOT)}/generators/login
|
65
|
+
or to #{File.expand_path(RAILS_ROOT)}/lib/generators/login
|
63
66
|
to use with this app only.
|
64
67
|
end_blurb
|
65
68
|
end
|
@@ -3,5 +3,28 @@ require File.dirname(__FILE__) + '/../scripts'
|
|
3
3
|
module Rails::Generator::Scripts
|
4
4
|
class Destroy < Base
|
5
5
|
mandatory_options :command => :destroy
|
6
|
+
|
7
|
+
protected
|
8
|
+
def usage_message
|
9
|
+
usage = "\nInstalled Generators\n"
|
10
|
+
Rails::Generator::Base.sources.each do |source|
|
11
|
+
label = source.label.to_s.capitalize
|
12
|
+
names = source.names
|
13
|
+
usage << " #{label}: #{names.join(', ')}\n" unless names.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
usage << <<end_blurb
|
17
|
+
|
18
|
+
This script will destroy all files created by the corresponding
|
19
|
+
script/generate command. For instance, script/destroy migration CreatePost
|
20
|
+
will delete the appropriate ###_create_post.rb file in db/migrate, while
|
21
|
+
script/destroy scaffold Post will delete the posts controller and
|
22
|
+
views, post model and migration, all associated tests, and the map.resources
|
23
|
+
:posts line in config/routes.rb.
|
24
|
+
|
25
|
+
For instructions on finding new generators, run script/generate
|
26
|
+
end_blurb
|
27
|
+
return usage
|
28
|
+
end
|
6
29
|
end
|
7
30
|
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# A class for creating random secret keys. This class will do its best to create a
|
2
|
+
# random secret key that's as secure as possible, using whatever methods are
|
3
|
+
# available on the current platform. For example:
|
4
|
+
#
|
5
|
+
# generator = Rails::SecretKeyGenerator("some unique identifier, such as the application name")
|
6
|
+
# generator.generate_secret # => "f3f1be90053fa851... (some long string)"
|
7
|
+
|
8
|
+
module Rails
|
9
|
+
class SecretKeyGenerator
|
10
|
+
GENERATORS = [ :secure_random, :win32_api, :urandom, :openssl, :prng ].freeze
|
11
|
+
|
12
|
+
def initialize(identifier)
|
13
|
+
@identifier = identifier
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generate a random secret key with the best possible method available on
|
17
|
+
# the current platform.
|
18
|
+
def generate_secret
|
19
|
+
generator = GENERATORS.find do |g|
|
20
|
+
self.class.send("supports_#{g}?")
|
21
|
+
end
|
22
|
+
send("generate_secret_with_#{generator}")
|
23
|
+
end
|
24
|
+
|
25
|
+
# Generate a random secret key by using the Win32 API. Raises LoadError
|
26
|
+
# if the current platform cannot make use of the Win32 API. Raises
|
27
|
+
# SystemCallError if some other error occured.
|
28
|
+
def generate_secret_with_win32_api
|
29
|
+
# Following code is based on David Garamond's GUID library for Ruby.
|
30
|
+
require 'Win32API'
|
31
|
+
|
32
|
+
crypt_acquire_context = Win32API.new("advapi32", "CryptAcquireContext",
|
33
|
+
'PPPII', 'L')
|
34
|
+
crypt_gen_random = Win32API.new("advapi32", "CryptGenRandom",
|
35
|
+
'LIP', 'L')
|
36
|
+
crypt_release_context = Win32API.new("advapi32", "CryptReleaseContext",
|
37
|
+
'LI', 'L')
|
38
|
+
prov_rsa_full = 1
|
39
|
+
crypt_verifycontext = 0xF0000000
|
40
|
+
|
41
|
+
hProvStr = " " * 4
|
42
|
+
if crypt_acquire_context.call(hProvStr, nil, nil, prov_rsa_full,
|
43
|
+
crypt_verifycontext) == 0
|
44
|
+
raise SystemCallError, "CryptAcquireContext failed: #{lastWin32ErrorMessage}"
|
45
|
+
end
|
46
|
+
hProv, = hProvStr.unpack('L')
|
47
|
+
bytes = " " * 64
|
48
|
+
if crypt_gen_random.call(hProv, bytes.size, bytes) == 0
|
49
|
+
raise SystemCallError, "CryptGenRandom failed: #{lastWin32ErrorMessage}"
|
50
|
+
end
|
51
|
+
if crypt_release_context.call(hProv, 0) == 0
|
52
|
+
raise SystemCallError, "CryptReleaseContext failed: #{lastWin32ErrorMessage}"
|
53
|
+
end
|
54
|
+
bytes.unpack("H*")[0]
|
55
|
+
end
|
56
|
+
|
57
|
+
# Generate a random secret key with Ruby 1.9's SecureRandom module.
|
58
|
+
# Raises LoadError if the current Ruby version does not support
|
59
|
+
# SecureRandom.
|
60
|
+
def generate_secret_with_secure_random
|
61
|
+
require 'securerandom'
|
62
|
+
return SecureRandom.hex(64)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Generate a random secret key with OpenSSL. If OpenSSL is not
|
66
|
+
# already loaded, then this method will attempt to load it.
|
67
|
+
# LoadError will be raised if that fails.
|
68
|
+
def generate_secret_with_openssl
|
69
|
+
require 'openssl'
|
70
|
+
if !File.exist?("/dev/urandom")
|
71
|
+
# OpenSSL transparently seeds the random number generator with
|
72
|
+
# data from /dev/urandom. On platforms where that is not
|
73
|
+
# available, such as Windows, we have to provide OpenSSL with
|
74
|
+
# our own seed. Unfortunately there's no way to provide a
|
75
|
+
# secure seed without OS support, so we'll have to do with
|
76
|
+
# rand() and Time.now.usec().
|
77
|
+
OpenSSL::Random.seed(rand(0).to_s + Time.now.usec.to_s)
|
78
|
+
end
|
79
|
+
data = OpenSSL::BN.rand(2048, -1, false).to_s
|
80
|
+
return OpenSSL::Digest::SHA512.new(data).hexdigest
|
81
|
+
end
|
82
|
+
|
83
|
+
# Generate a random secret key with /dev/urandom.
|
84
|
+
# Raises SystemCallError on failure.
|
85
|
+
def generate_secret_with_urandom
|
86
|
+
return File.read("/dev/urandom", 64).unpack("H*")[0]
|
87
|
+
end
|
88
|
+
|
89
|
+
# Generate a random secret key with Ruby's pseudo random number generator,
|
90
|
+
# as well as some environment information.
|
91
|
+
#
|
92
|
+
# This is the least cryptographically secure way to generate a secret key,
|
93
|
+
# and should be avoided whenever possible.
|
94
|
+
def generate_secret_with_prng
|
95
|
+
require 'digest/sha2'
|
96
|
+
sha = Digest::SHA2.new(512)
|
97
|
+
now = Time.now
|
98
|
+
sha << now.to_s
|
99
|
+
sha << String(now.usec)
|
100
|
+
sha << String(rand(0))
|
101
|
+
sha << String($$)
|
102
|
+
sha << @identifier
|
103
|
+
return sha.hexdigest
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
def lastWin32ErrorMessage
|
108
|
+
# Following code is based on David Garamond's GUID library for Ruby.
|
109
|
+
get_last_error = Win32API.new("kernel32", "GetLastError", '', 'L')
|
110
|
+
format_message = Win32API.new("kernel32", "FormatMessageA",
|
111
|
+
'LPLLPLPPPPPPPP', 'L')
|
112
|
+
format_message_ignore_inserts = 0x00000200
|
113
|
+
format_message_from_system = 0x00001000
|
114
|
+
|
115
|
+
code = get_last_error.call
|
116
|
+
msg = "\0" * 1024
|
117
|
+
len = format_message.call(format_message_ignore_inserts +
|
118
|
+
format_message_from_system, 0,
|
119
|
+
code, 0, msg, 1024, nil, nil,
|
120
|
+
nil, nil, nil, nil, nil, nil)
|
121
|
+
msg[0, len].tr("\r", '').chomp
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.supports_secure_random?
|
125
|
+
begin
|
126
|
+
require 'securerandom'
|
127
|
+
true
|
128
|
+
rescue LoadError
|
129
|
+
false
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.supports_win32_api?
|
134
|
+
return false unless RUBY_PLATFORM =~ /(:?mswin|mingw)/
|
135
|
+
begin
|
136
|
+
require 'Win32API'
|
137
|
+
true
|
138
|
+
rescue LoadError
|
139
|
+
false
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.supports_urandom?
|
144
|
+
File.exists?('/dev/urandom')
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.supports_openssl?
|
148
|
+
begin
|
149
|
+
require 'openssl'
|
150
|
+
true
|
151
|
+
rescue LoadError
|
152
|
+
false
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def self.supports_prng?
|
157
|
+
true
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/lib/rails_generator/spec.rb
CHANGED
@@ -2,7 +2,7 @@ module Rails
|
|
2
2
|
module Generator
|
3
3
|
# A spec knows where a generator was found and how to instantiate it.
|
4
4
|
# Metadata include the generator's name, its base path, and the source
|
5
|
-
# which yielded it (PathSource,
|
5
|
+
# which yielded it (PathSource, GemPathSource, etc.)
|
6
6
|
class Spec
|
7
7
|
attr_reader :name, :path, :source
|
8
8
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class SourceAnnotationExtractor
|
2
|
+
class Annotation < Struct.new(:line, :tag, :text)
|
3
|
+
def to_s(options={})
|
4
|
+
s = "[%3d] " % line
|
5
|
+
s << "[#{tag}] " if options[:tag]
|
6
|
+
s << text
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.enumerate(tag, options={})
|
11
|
+
extractor = new(tag)
|
12
|
+
extractor.display(extractor.find, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :tag
|
16
|
+
|
17
|
+
def initialize(tag)
|
18
|
+
@tag = tag
|
19
|
+
end
|
20
|
+
|
21
|
+
def find(dirs=%w(app lib test))
|
22
|
+
dirs.inject({}) { |h, dir| h.update(find_in(dir)) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_in(dir)
|
26
|
+
results = {}
|
27
|
+
|
28
|
+
Dir.glob("#{dir}/*") do |item|
|
29
|
+
next if File.basename(item)[0] == ?.
|
30
|
+
|
31
|
+
if File.directory?(item)
|
32
|
+
results.update(find_in(item))
|
33
|
+
elsif item =~ /\.(builder|(r(?:b|xml|js)))$/
|
34
|
+
results.update(extract_annotations_from(item, /#\s*(#{tag}):?\s*(.*)$/))
|
35
|
+
elsif item =~ /\.(rhtml|erb)$/
|
36
|
+
results.update(extract_annotations_from(item, /<%\s*#\s*(#{tag}):?\s*(.*?)\s*%>/))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
results
|
41
|
+
end
|
42
|
+
|
43
|
+
def extract_annotations_from(file, pattern)
|
44
|
+
lineno = 0
|
45
|
+
result = File.readlines(file).inject([]) do |list, line|
|
46
|
+
lineno += 1
|
47
|
+
next list unless line =~ pattern
|
48
|
+
list << Annotation.new(lineno, $1, $2)
|
49
|
+
end
|
50
|
+
result.empty? ? {} : { file => result }
|
51
|
+
end
|
52
|
+
|
53
|
+
def display(results, options={})
|
54
|
+
results.keys.sort.each do |file|
|
55
|
+
puts "#{file}:"
|
56
|
+
results[file].each do |note|
|
57
|
+
puts " * #{note.to_s(options)}"
|
58
|
+
end
|
59
|
+
puts
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'source_annotation_extractor'
|
2
|
+
|
3
|
+
desc "Enumerate all annotations"
|
4
|
+
task :notes do
|
5
|
+
SourceAnnotationExtractor.enumerate "OPTIMIZE|FIXME|TODO", :tag => true
|
6
|
+
end
|
7
|
+
|
8
|
+
namespace :notes do
|
9
|
+
desc "Enumerate all OPTIMIZE annotations"
|
10
|
+
task :optimize do
|
11
|
+
SourceAnnotationExtractor.enumerate "OPTIMIZE"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Enumerate all FIXME annotations"
|
15
|
+
task :fixme do
|
16
|
+
SourceAnnotationExtractor.enumerate "FIXME"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Enumerate all TODO annotations"
|
20
|
+
task :todo do
|
21
|
+
SourceAnnotationExtractor.enumerate "TODO"
|
22
|
+
end
|
23
|
+
end
|
data/lib/tasks/databases.rake
CHANGED
@@ -1,10 +1,143 @@
|
|
1
1
|
namespace :db do
|
2
|
-
|
2
|
+
namespace :create do
|
3
|
+
desc 'Create all the local databases defined in config/database.yml'
|
4
|
+
task :all => :environment do
|
5
|
+
ActiveRecord::Base.configurations.each_value do |config|
|
6
|
+
# Skip entries that don't have a database key, such as the first entry here:
|
7
|
+
#
|
8
|
+
# defaults: &defaults
|
9
|
+
# adapter: mysql
|
10
|
+
# username: root
|
11
|
+
# password:
|
12
|
+
# host: localhost
|
13
|
+
#
|
14
|
+
# development:
|
15
|
+
# database: blog_development
|
16
|
+
# <<: *defaults
|
17
|
+
next unless config['database']
|
18
|
+
# Only connect to local databases
|
19
|
+
if config['host'] == 'localhost' || config['host'].blank?
|
20
|
+
create_database(config)
|
21
|
+
else
|
22
|
+
p "This task only creates local databases. #{config['database']} is on a remote host."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'Create the database defined in config/database.yml for the current RAILS_ENV'
|
29
|
+
task :create => :environment do
|
30
|
+
create_database(ActiveRecord::Base.configurations[RAILS_ENV])
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_database(config)
|
34
|
+
begin
|
35
|
+
ActiveRecord::Base.establish_connection(config)
|
36
|
+
ActiveRecord::Base.connection
|
37
|
+
rescue
|
38
|
+
case config['adapter']
|
39
|
+
when 'mysql'
|
40
|
+
@charset = ENV['CHARSET'] || 'utf8'
|
41
|
+
@collation = ENV['COLLATION'] || 'utf8_general_ci'
|
42
|
+
begin
|
43
|
+
ActiveRecord::Base.establish_connection(config.merge({'database' => nil}))
|
44
|
+
ActiveRecord::Base.connection.create_database(config['database'], {:charset => @charset, :collation => @collation})
|
45
|
+
ActiveRecord::Base.establish_connection(config)
|
46
|
+
rescue
|
47
|
+
$stderr.puts "Couldn't create database for #{config.inspect}"
|
48
|
+
end
|
49
|
+
when 'postgresql'
|
50
|
+
`createdb "#{config['database']}" -E utf8`
|
51
|
+
when 'sqlite'
|
52
|
+
`sqlite "#{config['database']}"`
|
53
|
+
when 'sqlite3'
|
54
|
+
`sqlite3 "#{config['database']}"`
|
55
|
+
end
|
56
|
+
else
|
57
|
+
p "#{config['database']} already exists"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
namespace :drop do
|
62
|
+
desc 'Drops all the local databases defined in config/database.yml'
|
63
|
+
task :all => :environment do
|
64
|
+
ActiveRecord::Base.configurations.each_value do |config|
|
65
|
+
# Skip entries that don't have a database key
|
66
|
+
next unless config['database']
|
67
|
+
# Only connect to local databases
|
68
|
+
if config['host'] == 'localhost' || config['host'].blank?
|
69
|
+
drop_database(config)
|
70
|
+
else
|
71
|
+
p "This task only drops local databases. #{config['database']} is on a remote host."
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
desc 'Drops the database for the current RAILS_ENV'
|
78
|
+
task :drop => :environment do
|
79
|
+
drop_database(ActiveRecord::Base.configurations[RAILS_ENV || 'development'])
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
|
3
83
|
task :migrate => :environment do
|
84
|
+
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
4
85
|
ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
5
86
|
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
6
87
|
end
|
7
88
|
|
89
|
+
desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n'
|
90
|
+
task :rollback => :environment do
|
91
|
+
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
92
|
+
version = ActiveRecord::Migrator.current_version - step
|
93
|
+
ActiveRecord::Migrator.migrate('db/migrate/', version)
|
94
|
+
end
|
95
|
+
|
96
|
+
desc 'Drops and recreates the database from db/schema.rb for the current environment.'
|
97
|
+
task :reset => ['db:drop', 'db:create', 'db:schema:load']
|
98
|
+
|
99
|
+
desc "Retrieves the charset for the current environment's database"
|
100
|
+
task :charset => :environment do
|
101
|
+
config = ActiveRecord::Base.configurations[RAILS_ENV || 'development']
|
102
|
+
case config['adapter']
|
103
|
+
when 'mysql'
|
104
|
+
ActiveRecord::Base.establish_connection(config)
|
105
|
+
puts ActiveRecord::Base.connection.charset
|
106
|
+
else
|
107
|
+
puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
desc "Retrieves the collation for the current environment's database"
|
112
|
+
task :collation => :environment do
|
113
|
+
config = ActiveRecord::Base.configurations[RAILS_ENV || 'development']
|
114
|
+
case config['adapter']
|
115
|
+
when 'mysql'
|
116
|
+
ActiveRecord::Base.establish_connection(config)
|
117
|
+
puts ActiveRecord::Base.connection.collation
|
118
|
+
else
|
119
|
+
puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
desc "Retrieves the current schema version number"
|
124
|
+
task :version => :environment do
|
125
|
+
puts "Current version: #{ActiveRecord::Migrator.current_version}"
|
126
|
+
end
|
127
|
+
|
128
|
+
desc "Raises an error if there are pending migrations"
|
129
|
+
task :abort_if_pending_migrations => :environment do
|
130
|
+
pending_migrations = ActiveRecord::Migrator.new(:up, 'db/migrate').pending_migrations
|
131
|
+
|
132
|
+
if pending_migrations.any?
|
133
|
+
puts "You have #{pending_migrations.size} pending migrations:"
|
134
|
+
pending_migrations.each do |pending_migration|
|
135
|
+
puts ' %4d %s' % [pending_migration.version, pending_migration.name]
|
136
|
+
end
|
137
|
+
abort "Run `rake db:migrate` to update your database then try again."
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
8
141
|
namespace :fixtures do
|
9
142
|
desc "Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y"
|
10
143
|
task :load => :environment do
|
@@ -14,6 +147,28 @@ namespace :db do
|
|
14
147
|
Fixtures.create_fixtures('test/fixtures', File.basename(fixture_file, '.*'))
|
15
148
|
end
|
16
149
|
end
|
150
|
+
|
151
|
+
desc "Search for a fixture given a LABEL or ID."
|
152
|
+
task :identify => :environment do
|
153
|
+
require "active_record/fixtures"
|
154
|
+
|
155
|
+
label, id = ENV["LABEL"], ENV["ID"]
|
156
|
+
raise "LABEL or ID required" if label.blank? && id.blank?
|
157
|
+
|
158
|
+
puts %Q(The fixture ID for "#{label}" is #{Fixtures.identify(label)}.) if label
|
159
|
+
|
160
|
+
Dir["#{RAILS_ROOT}/test/fixtures/**/*.yml"].each do |file|
|
161
|
+
if data = YAML::load(ERB.new(IO.read(file)).result)
|
162
|
+
data.keys.each do |key|
|
163
|
+
key_id = Fixtures.identify(key)
|
164
|
+
|
165
|
+
if key == label || key_id == id.to_i
|
166
|
+
puts "#{file}: #{key} (#{key_id})"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
17
172
|
end
|
18
173
|
|
19
174
|
namespace :schema do
|
@@ -37,29 +192,29 @@ namespace :db do
|
|
37
192
|
task :dump => :environment do
|
38
193
|
abcs = ActiveRecord::Base.configurations
|
39
194
|
case abcs[RAILS_ENV]["adapter"]
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
195
|
+
when "mysql", "oci", "oracle"
|
196
|
+
ActiveRecord::Base.establish_connection(abcs[RAILS_ENV])
|
197
|
+
File.open("db/#{RAILS_ENV}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
|
198
|
+
when "postgresql"
|
199
|
+
ENV['PGHOST'] = abcs[RAILS_ENV]["host"] if abcs[RAILS_ENV]["host"]
|
200
|
+
ENV['PGPORT'] = abcs[RAILS_ENV]["port"].to_s if abcs[RAILS_ENV]["port"]
|
201
|
+
ENV['PGPASSWORD'] = abcs[RAILS_ENV]["password"].to_s if abcs[RAILS_ENV]["password"]
|
202
|
+
search_path = abcs[RAILS_ENV]["schema_search_path"]
|
203
|
+
search_path = "--schema=#{search_path}" if search_path
|
204
|
+
`pg_dump -i -U "#{abcs[RAILS_ENV]["username"]}" -s -x -O -f db/#{RAILS_ENV}_structure.sql #{search_path} #{abcs[RAILS_ENV]["database"]}`
|
205
|
+
raise "Error dumping database" if $?.exitstatus == 1
|
206
|
+
when "sqlite", "sqlite3"
|
207
|
+
dbfile = abcs[RAILS_ENV]["database"] || abcs[RAILS_ENV]["dbfile"]
|
208
|
+
`#{abcs[RAILS_ENV]["adapter"]} #{dbfile} .schema > db/#{RAILS_ENV}_structure.sql`
|
209
|
+
when "sqlserver"
|
210
|
+
`scptxfr /s #{abcs[RAILS_ENV]["host"]} /d #{abcs[RAILS_ENV]["database"]} /I /f db\\#{RAILS_ENV}_structure.sql /q /A /r`
|
211
|
+
`scptxfr /s #{abcs[RAILS_ENV]["host"]} /d #{abcs[RAILS_ENV]["database"]} /I /F db\ /q /A /r`
|
212
|
+
when "firebird"
|
213
|
+
set_firebird_env(abcs[RAILS_ENV])
|
214
|
+
db_string = firebird_db_string(abcs[RAILS_ENV])
|
215
|
+
sh "isql -a #{db_string} > db/#{RAILS_ENV}_structure.sql"
|
216
|
+
else
|
217
|
+
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
|
63
218
|
end
|
64
219
|
|
65
220
|
if ActiveRecord::Base.connection.supports_migrations?
|
@@ -81,33 +236,33 @@ namespace :db do
|
|
81
236
|
task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
|
82
237
|
abcs = ActiveRecord::Base.configurations
|
83
238
|
case abcs["test"]["adapter"]
|
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
|
-
|
239
|
+
when "mysql"
|
240
|
+
ActiveRecord::Base.establish_connection(:test)
|
241
|
+
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
|
242
|
+
IO.readlines("db/#{RAILS_ENV}_structure.sql").join.split("\n\n").each do |table|
|
243
|
+
ActiveRecord::Base.connection.execute(table)
|
244
|
+
end
|
245
|
+
when "postgresql"
|
246
|
+
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
|
247
|
+
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
|
248
|
+
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
|
249
|
+
`psql -U "#{abcs["test"]["username"]}" -f db/#{RAILS_ENV}_structure.sql #{abcs["test"]["database"]}`
|
250
|
+
when "sqlite", "sqlite3"
|
251
|
+
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
|
252
|
+
`#{abcs["test"]["adapter"]} #{dbfile} < db/#{RAILS_ENV}_structure.sql`
|
253
|
+
when "sqlserver"
|
254
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{RAILS_ENV}_structure.sql`
|
255
|
+
when "oci", "oracle"
|
256
|
+
ActiveRecord::Base.establish_connection(:test)
|
257
|
+
IO.readlines("db/#{RAILS_ENV}_structure.sql").join.split(";\n\n").each do |ddl|
|
258
|
+
ActiveRecord::Base.connection.execute(ddl)
|
259
|
+
end
|
260
|
+
when "firebird"
|
261
|
+
set_firebird_env(abcs["test"])
|
262
|
+
db_string = firebird_db_string(abcs["test"])
|
263
|
+
sh "isql -i db/#{RAILS_ENV}_structure.sql #{db_string}"
|
264
|
+
else
|
265
|
+
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
|
111
266
|
end
|
112
267
|
end
|
113
268
|
|
@@ -115,40 +270,40 @@ namespace :db do
|
|
115
270
|
task :purge => :environment do
|
116
271
|
abcs = ActiveRecord::Base.configurations
|
117
272
|
case abcs["test"]["adapter"]
|
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
|
-
|
273
|
+
when "mysql"
|
274
|
+
ActiveRecord::Base.establish_connection(:test)
|
275
|
+
ActiveRecord::Base.connection.recreate_database(abcs["test"]["database"])
|
276
|
+
when "postgresql"
|
277
|
+
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
|
278
|
+
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
|
279
|
+
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
|
280
|
+
enc_option = "-E #{abcs["test"]["encoding"]}" if abcs["test"]["encoding"]
|
281
|
+
|
282
|
+
ActiveRecord::Base.clear_active_connections!
|
283
|
+
`dropdb -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
|
284
|
+
`createdb #{enc_option} -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
|
285
|
+
when "sqlite","sqlite3"
|
286
|
+
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
|
287
|
+
File.delete(dbfile) if File.exist?(dbfile)
|
288
|
+
when "sqlserver"
|
289
|
+
dropfkscript = "#{abcs["test"]["host"]}.#{abcs["test"]["database"]}.DP1".gsub(/\\/,'-')
|
290
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{dropfkscript}`
|
291
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{RAILS_ENV}_structure.sql`
|
292
|
+
when "oci", "oracle"
|
293
|
+
ActiveRecord::Base.establish_connection(:test)
|
294
|
+
ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
|
295
|
+
ActiveRecord::Base.connection.execute(ddl)
|
296
|
+
end
|
297
|
+
when "firebird"
|
298
|
+
ActiveRecord::Base.establish_connection(:test)
|
299
|
+
ActiveRecord::Base.connection.recreate_database!
|
300
|
+
else
|
301
|
+
raise "Task not supported by '#{abcs["test"]["adapter"]}'"
|
147
302
|
end
|
148
303
|
end
|
149
304
|
|
150
305
|
desc 'Prepare the test database and load the schema'
|
151
|
-
task :prepare =>
|
306
|
+
task :prepare => %w(environment db:abort_if_pending_migrations) do
|
152
307
|
if defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank?
|
153
308
|
Rake::Task[{ :sql => "db:test:clone_structure", :ruby => "db:test:clone" }[ActiveRecord::Base.schema_format]].invoke
|
154
309
|
end
|
@@ -156,12 +311,12 @@ namespace :db do
|
|
156
311
|
end
|
157
312
|
|
158
313
|
namespace :sessions do
|
159
|
-
desc "Creates a sessions
|
314
|
+
desc "Creates a sessions migration for use with CGI::Session::ActiveRecordStore"
|
160
315
|
task :create => :environment do
|
161
316
|
raise "Task unavailable to this database (no migration support)" unless ActiveRecord::Base.connection.supports_migrations?
|
162
317
|
require 'rails_generator'
|
163
318
|
require 'rails_generator/scripts/generate'
|
164
|
-
Rails::Generator::Scripts::Generate.new.run(["session_migration", ENV["MIGRATION"] || "
|
319
|
+
Rails::Generator::Scripts::Generate.new.run(["session_migration", ENV["MIGRATION"] || "CreateSessions"])
|
165
320
|
end
|
166
321
|
|
167
322
|
desc "Clear the sessions table"
|
@@ -173,6 +328,17 @@ namespace :db do
|
|
173
328
|
end
|
174
329
|
end
|
175
330
|
|
331
|
+
def drop_database(config)
|
332
|
+
case config['adapter']
|
333
|
+
when 'mysql'
|
334
|
+
ActiveRecord::Base.connection.drop_database config['database']
|
335
|
+
when /^sqlite/
|
336
|
+
FileUtils.rm_f(File.join(RAILS_ROOT, config['database']))
|
337
|
+
when 'postgresql'
|
338
|
+
`dropdb "#{config['database']}"`
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
176
342
|
def session_table_name
|
177
343
|
ActiveRecord::Base.pluralize_table_names ? :sessions : :session
|
178
344
|
end
|