rails_csi 2.3.5.p6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2172 -0
- data/MIT-LICENSE +20 -0
- data/README +243 -0
- data/Rakefile +368 -0
- data/bin/about +4 -0
- data/bin/console +3 -0
- data/bin/dbconsole +3 -0
- data/bin/destroy +3 -0
- data/bin/generate +3 -0
- data/bin/performance/benchmarker +3 -0
- data/bin/performance/profiler +3 -0
- data/bin/plugin +3 -0
- data/bin/rails +20 -0
- data/bin/runner +3 -0
- data/bin/server +3 -0
- data/builtin/rails_info/rails/info.rb +131 -0
- data/builtin/rails_info/rails/info_controller.rb +9 -0
- data/builtin/rails_info/rails/info_helper.rb +2 -0
- data/builtin/rails_info/rails_info_controller.rb +2 -0
- data/configs/databases/frontbase.yml +28 -0
- data/configs/databases/ibm_db.yml +62 -0
- data/configs/databases/mysql.yml +60 -0
- data/configs/databases/oracle.yml +39 -0
- data/configs/databases/postgresql.yml +51 -0
- data/configs/databases/sqlite2.yml +19 -0
- data/configs/databases/sqlite3.yml +22 -0
- data/configs/empty.log +0 -0
- data/configs/initializers/backtrace_silencers.rb +7 -0
- data/configs/initializers/inflections.rb +10 -0
- data/configs/initializers/mime_types.rb +5 -0
- data/configs/initializers/new_rails_defaults.rb +21 -0
- data/configs/initializers/session_store.rb +15 -0
- data/configs/locales/en.yml +5 -0
- data/configs/routes.rb +43 -0
- data/configs/seeds.rb +7 -0
- data/dispatches/config.ru +7 -0
- data/dispatches/dispatch.fcgi +24 -0
- data/dispatches/dispatch.rb +10 -0
- data/dispatches/gateway.cgi +97 -0
- data/doc/README_FOR_APP +2 -0
- data/environments/boot.rb +110 -0
- data/environments/development.rb +17 -0
- data/environments/environment.rb +41 -0
- data/environments/production.rb +28 -0
- data/environments/test.rb +28 -0
- data/fresh_rakefile +10 -0
- data/guides/files/javascripts/code_highlighter.js +188 -0
- data/guides/files/javascripts/guides.js +8 -0
- data/guides/files/javascripts/highlighters.js +90 -0
- data/guides/files/stylesheets/main.css +441 -0
- data/guides/files/stylesheets/print.css +52 -0
- data/guides/files/stylesheets/reset.css +43 -0
- data/guides/files/stylesheets/style.css +13 -0
- data/guides/files/stylesheets/syntax.css +31 -0
- data/guides/images/belongs_to.png +0 -0
- data/guides/images/book_icon.gif +0 -0
- data/guides/images/bullet.gif +0 -0
- data/guides/images/chapters_icon.gif +0 -0
- data/guides/images/check_bullet.gif +0 -0
- data/guides/images/credits_pic_blank.gif +0 -0
- data/guides/images/csrf.png +0 -0
- data/guides/images/customized_error_messages.png +0 -0
- data/guides/images/error_messages.png +0 -0
- data/guides/images/feature_tile.gif +0 -0
- data/guides/images/footer_tile.gif +0 -0
- data/guides/images/fxn.jpg +0 -0
- data/guides/images/grey_bullet.gif +0 -0
- data/guides/images/habtm.png +0 -0
- data/guides/images/has_many.png +0 -0
- data/guides/images/has_many_through.png +0 -0
- data/guides/images/has_one.png +0 -0
- data/guides/images/has_one_through.png +0 -0
- data/guides/images/header_backdrop.png +0 -0
- data/guides/images/header_tile.gif +0 -0
- data/guides/images/i18n/demo_localized_pirate.png +0 -0
- data/guides/images/i18n/demo_translated_en.png +0 -0
- data/guides/images/i18n/demo_translated_pirate.png +0 -0
- data/guides/images/i18n/demo_translation_missing.png +0 -0
- data/guides/images/i18n/demo_untranslated.png +0 -0
- data/guides/images/icons/README +5 -0
- data/guides/images/icons/callouts/1.png +0 -0
- data/guides/images/icons/callouts/10.png +0 -0
- data/guides/images/icons/callouts/11.png +0 -0
- data/guides/images/icons/callouts/12.png +0 -0
- data/guides/images/icons/callouts/13.png +0 -0
- data/guides/images/icons/callouts/14.png +0 -0
- data/guides/images/icons/callouts/15.png +0 -0
- data/guides/images/icons/callouts/2.png +0 -0
- data/guides/images/icons/callouts/3.png +0 -0
- data/guides/images/icons/callouts/4.png +0 -0
- data/guides/images/icons/callouts/5.png +0 -0
- data/guides/images/icons/callouts/6.png +0 -0
- data/guides/images/icons/callouts/7.png +0 -0
- data/guides/images/icons/callouts/8.png +0 -0
- data/guides/images/icons/callouts/9.png +0 -0
- data/guides/images/icons/caution.png +0 -0
- data/guides/images/icons/example.png +0 -0
- data/guides/images/icons/home.png +0 -0
- data/guides/images/icons/important.png +0 -0
- data/guides/images/icons/next.png +0 -0
- data/guides/images/icons/note.png +0 -0
- data/guides/images/icons/prev.png +0 -0
- data/guides/images/icons/tip.png +0 -0
- data/guides/images/icons/up.png +0 -0
- data/guides/images/icons/warning.png +0 -0
- data/guides/images/nav_arrow.gif +0 -0
- data/guides/images/polymorphic.png +0 -0
- data/guides/images/posts_index.png +0 -0
- data/guides/images/rails_guides_logo.gif +0 -0
- data/guides/images/rails_logo_remix.gif +0 -0
- data/guides/images/rails_welcome.png +0 -0
- data/guides/images/session_fixation.png +0 -0
- data/guides/images/tab_grey.gif +0 -0
- data/guides/images/tab_info.gif +0 -0
- data/guides/images/tab_note.gif +0 -0
- data/guides/images/tab_red.gif +0 -0
- data/guides/images/tab_yellow.gif +0 -0
- data/guides/images/tab_yellow.png +0 -0
- data/guides/images/validation_error_messages.png +0 -0
- data/guides/rails_guides.rb +42 -0
- data/guides/rails_guides/generator.rb +138 -0
- data/guides/rails_guides/helpers.rb +34 -0
- data/guides/rails_guides/indexer.rb +55 -0
- data/guides/rails_guides/textile_extensions.rb +41 -0
- data/guides/source/2_2_release_notes.textile +422 -0
- data/guides/source/2_3_release_notes.textile +610 -0
- data/guides/source/action_controller_overview.textile +776 -0
- data/guides/source/action_mailer_basics.textile +424 -0
- data/guides/source/active_record_basics.textile +135 -0
- data/guides/source/active_record_querying.textile +969 -0
- data/guides/source/activerecord_validations_callbacks.textile +1086 -0
- data/guides/source/association_basics.textile +1781 -0
- data/guides/source/caching_with_rails.textile +524 -0
- data/guides/source/command_line.textile +589 -0
- data/guides/source/configuring.textile +234 -0
- data/guides/source/contribute.textile +71 -0
- data/guides/source/contributing_to_rails.textile +239 -0
- data/guides/source/credits.erb.textile +52 -0
- data/guides/source/debugging_rails_applications.textile +709 -0
- data/guides/source/form_helpers.textile +766 -0
- data/guides/source/getting_started.textile +1297 -0
- data/guides/source/i18n.textile +912 -0
- data/guides/source/index.erb.textile +124 -0
- data/guides/source/layout.html.erb +103 -0
- data/guides/source/layouts_and_rendering.textile +979 -0
- data/guides/source/migrations.textile +591 -0
- data/guides/source/nested_model_forms.textile +222 -0
- data/guides/source/performance_testing.textile +531 -0
- data/guides/source/plugins.textile +1512 -0
- data/guides/source/rails_on_rack.textile +309 -0
- data/guides/source/routing.textile +903 -0
- data/guides/source/security.textile +986 -0
- data/guides/source/testing.textile +951 -0
- data/helpers/application_controller.rb +10 -0
- data/helpers/application_helper.rb +3 -0
- data/helpers/performance_test.rb +9 -0
- data/helpers/test_helper.rb +38 -0
- data/html/404.html +30 -0
- data/html/422.html +30 -0
- data/html/500.html +30 -0
- data/html/favicon.ico +0 -0
- data/html/images/rails.png +0 -0
- data/html/index.html +275 -0
- data/html/javascripts/application.js +2 -0
- data/html/javascripts/controls.js +963 -0
- data/html/javascripts/dragdrop.js +973 -0
- data/html/javascripts/effects.js +1128 -0
- data/html/javascripts/prototype.js +4320 -0
- data/html/robots.txt +5 -0
- data/lib/code_statistics.rb +107 -0
- data/lib/commands.rb +17 -0
- data/lib/commands/about.rb +3 -0
- data/lib/commands/console.rb +45 -0
- data/lib/commands/dbconsole.rb +87 -0
- data/lib/commands/destroy.rb +6 -0
- data/lib/commands/generate.rb +6 -0
- data/lib/commands/ncgi/listener +86 -0
- data/lib/commands/ncgi/tracker +69 -0
- data/lib/commands/performance/benchmarker.rb +24 -0
- data/lib/commands/performance/profiler.rb +50 -0
- data/lib/commands/plugin.rb +968 -0
- data/lib/commands/runner.rb +54 -0
- data/lib/commands/server.rb +114 -0
- data/lib/commands/update.rb +4 -0
- data/lib/console_app.rb +30 -0
- data/lib/console_sandbox.rb +6 -0
- data/lib/console_with_helpers.rb +5 -0
- data/lib/dispatcher.rb +24 -0
- data/lib/fcgi_handler.rb +239 -0
- data/lib/initializer.rb +1128 -0
- data/lib/performance_test_help.rb +5 -0
- data/lib/rails/backtrace_cleaner.rb +54 -0
- data/lib/rails/gem_builder.rb +21 -0
- data/lib/rails/gem_dependency.rb +311 -0
- data/lib/rails/plugin.rb +179 -0
- data/lib/rails/plugin/loader.rb +198 -0
- data/lib/rails/plugin/locator.rb +100 -0
- data/lib/rails/rack.rb +8 -0
- data/lib/rails/rack/debugger.rb +23 -0
- data/lib/rails/rack/log_tailer.rb +35 -0
- data/lib/rails/rack/metal.rb +51 -0
- data/lib/rails/rack/static.rb +46 -0
- data/lib/rails/vendor_gem_source_index.rb +140 -0
- data/lib/rails/version.rb +9 -0
- data/lib/rails_generator.rb +43 -0
- data/lib/rails_generator/base.rb +266 -0
- data/lib/rails_generator/commands.rb +621 -0
- data/lib/rails_generator/generated_attribute.rb +46 -0
- data/lib/rails_generator/generators/applications/app/USAGE +9 -0
- data/lib/rails_generator/generators/applications/app/app_generator.rb +263 -0
- data/lib/rails_generator/generators/applications/app/scm/git.rb +18 -0
- data/lib/rails_generator/generators/applications/app/scm/scm.rb +8 -0
- data/lib/rails_generator/generators/applications/app/scm/svn.rb +7 -0
- data/lib/rails_generator/generators/applications/app/template_runner.rb +401 -0
- data/lib/rails_generator/generators/components/controller/USAGE +30 -0
- data/lib/rails_generator/generators/components/controller/controller_generator.rb +43 -0
- data/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
- data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
- data/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/controller/templates/helper_test.rb +4 -0
- data/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
- data/lib/rails_generator/generators/components/helper/USAGE +24 -0
- data/lib/rails_generator/generators/components/helper/helper_generator.rb +25 -0
- data/lib/rails_generator/generators/components/helper/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/helper/templates/helper_test.rb +4 -0
- data/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
- data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
- data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
- data/lib/rails_generator/generators/components/mailer/USAGE +16 -0
- data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
- data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
- data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
- data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +20 -0
- data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
- data/lib/rails_generator/generators/components/metal/USAGE +8 -0
- data/lib/rails_generator/generators/components/metal/metal_generator.rb +8 -0
- data/lib/rails_generator/generators/components/metal/templates/metal.rb +12 -0
- data/lib/rails_generator/generators/components/migration/USAGE +29 -0
- data/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
- data/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
- data/lib/rails_generator/generators/components/model/USAGE +27 -0
- data/lib/rails_generator/generators/components/model/model_generator.rb +52 -0
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +19 -0
- data/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
- data/lib/rails_generator/generators/components/model/templates/model.rb +5 -0
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
- data/lib/rails_generator/generators/components/observer/USAGE +13 -0
- data/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
- data/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
- data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
- data/lib/rails_generator/generators/components/performance_test/USAGE +8 -0
- data/lib/rails_generator/generators/components/performance_test/performance_test_generator.rb +16 -0
- data/lib/rails_generator/generators/components/performance_test/templates/performance_test.rb +9 -0
- data/lib/rails_generator/generators/components/plugin/USAGE +25 -0
- data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
- data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
- data/lib/rails_generator/generators/components/plugin/templates/README +13 -0
- data/lib/rails_generator/generators/components/plugin/templates/Rakefile +23 -0
- data/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
- data/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
- data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
- data/lib/rails_generator/generators/components/plugin/templates/test_helper.rb +3 -0
- data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
- data/lib/rails_generator/generators/components/resource/USAGE +23 -0
- data/lib/rails_generator/generators/components/resource/resource_generator.rb +76 -0
- data/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
- data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
- data/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/resource/templates/helper_test.rb +4 -0
- data/lib/rails_generator/generators/components/scaffold/USAGE +29 -0
- data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +103 -0
- data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +85 -0
- data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
- data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/scaffold/templates/helper_test.rb +4 -0
- data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
- data/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
- data/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
- data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
- data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
- data/lib/rails_generator/lookup.rb +249 -0
- data/lib/rails_generator/manifest.rb +53 -0
- data/lib/rails_generator/options.rb +150 -0
- data/lib/rails_generator/scripts.rb +89 -0
- data/lib/rails_generator/scripts/destroy.rb +29 -0
- data/lib/rails_generator/scripts/generate.rb +7 -0
- data/lib/rails_generator/scripts/update.rb +12 -0
- data/lib/rails_generator/secret_key_generator.rb +24 -0
- data/lib/rails_generator/simple_logger.rb +46 -0
- data/lib/rails_generator/spec.rb +44 -0
- data/lib/railties_path.rb +1 -0
- data/lib/ruby_version_check.rb +17 -0
- data/lib/rubyprof_ext.rb +35 -0
- data/lib/source_annotation_extractor.rb +102 -0
- data/lib/tasks/annotations.rake +20 -0
- data/lib/tasks/databases.rake +436 -0
- data/lib/tasks/documentation.rake +88 -0
- data/lib/tasks/framework.rake +143 -0
- data/lib/tasks/gems.rake +78 -0
- data/lib/tasks/log.rake +9 -0
- data/lib/tasks/middleware.rake +7 -0
- data/lib/tasks/misc.rake +63 -0
- data/lib/tasks/rails.rb +9 -0
- data/lib/tasks/routes.rake +18 -0
- data/lib/tasks/statistics.rake +17 -0
- data/lib/tasks/testing.rake +139 -0
- data/lib/tasks/tmp.rake +37 -0
- data/lib/test_help.rb +38 -0
- data/lib/webrick_server.rb +156 -0
- metadata +495 -0
data/html/robots.txt
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
class CodeStatistics #:nodoc:
|
2
|
+
|
3
|
+
TEST_TYPES = %w(Units Functionals Unit\ tests Functional\ tests Integration\ tests)
|
4
|
+
|
5
|
+
def initialize(*pairs)
|
6
|
+
@pairs = pairs
|
7
|
+
@statistics = calculate_statistics
|
8
|
+
@total = calculate_total if pairs.length > 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
print_header
|
13
|
+
@pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
|
14
|
+
print_splitter
|
15
|
+
|
16
|
+
if @total
|
17
|
+
print_line("Total", @total)
|
18
|
+
print_splitter
|
19
|
+
end
|
20
|
+
|
21
|
+
print_code_test_stats
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def calculate_statistics
|
26
|
+
@pairs.inject({}) { |stats, pair| stats[pair.first] = calculate_directory_statistics(pair.last); stats }
|
27
|
+
end
|
28
|
+
|
29
|
+
def calculate_directory_statistics(directory, pattern = /.*\.rb$/)
|
30
|
+
stats = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0 }
|
31
|
+
|
32
|
+
Dir.foreach(directory) do |file_name|
|
33
|
+
if File.stat(directory + "/" + file_name).directory? and (/^\./ !~ file_name)
|
34
|
+
newstats = calculate_directory_statistics(directory + "/" + file_name, pattern)
|
35
|
+
stats.each { |k, v| stats[k] += newstats[k] }
|
36
|
+
end
|
37
|
+
|
38
|
+
next unless file_name =~ pattern
|
39
|
+
|
40
|
+
f = File.open(directory + "/" + file_name)
|
41
|
+
|
42
|
+
while line = f.gets
|
43
|
+
stats["lines"] += 1
|
44
|
+
stats["classes"] += 1 if line =~ /class [A-Z]/
|
45
|
+
stats["methods"] += 1 if line =~ /def [a-z]/
|
46
|
+
stats["codelines"] += 1 unless line =~ /^\s*$/ || line =~ /^\s*#/
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
stats
|
51
|
+
end
|
52
|
+
|
53
|
+
def calculate_total
|
54
|
+
total = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0 }
|
55
|
+
@statistics.each_value { |pair| pair.each { |k, v| total[k] += v } }
|
56
|
+
total
|
57
|
+
end
|
58
|
+
|
59
|
+
def calculate_code
|
60
|
+
code_loc = 0
|
61
|
+
@statistics.each { |k, v| code_loc += v['codelines'] unless TEST_TYPES.include? k }
|
62
|
+
code_loc
|
63
|
+
end
|
64
|
+
|
65
|
+
def calculate_tests
|
66
|
+
test_loc = 0
|
67
|
+
@statistics.each { |k, v| test_loc += v['codelines'] if TEST_TYPES.include? k }
|
68
|
+
test_loc
|
69
|
+
end
|
70
|
+
|
71
|
+
def print_header
|
72
|
+
print_splitter
|
73
|
+
puts "| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |"
|
74
|
+
print_splitter
|
75
|
+
end
|
76
|
+
|
77
|
+
def print_splitter
|
78
|
+
puts "+----------------------+-------+-------+---------+---------+-----+-------+"
|
79
|
+
end
|
80
|
+
|
81
|
+
def print_line(name, statistics)
|
82
|
+
m_over_c = (statistics["methods"] / statistics["classes"]) rescue m_over_c = 0
|
83
|
+
loc_over_m = (statistics["codelines"] / statistics["methods"]) - 2 rescue loc_over_m = 0
|
84
|
+
|
85
|
+
start = if TEST_TYPES.include? name
|
86
|
+
"| #{name.ljust(20)} "
|
87
|
+
else
|
88
|
+
"| #{name.ljust(20)} "
|
89
|
+
end
|
90
|
+
|
91
|
+
puts start +
|
92
|
+
"| #{statistics["lines"].to_s.rjust(5)} " +
|
93
|
+
"| #{statistics["codelines"].to_s.rjust(5)} " +
|
94
|
+
"| #{statistics["classes"].to_s.rjust(7)} " +
|
95
|
+
"| #{statistics["methods"].to_s.rjust(7)} " +
|
96
|
+
"| #{m_over_c.to_s.rjust(3)} " +
|
97
|
+
"| #{loc_over_m.to_s.rjust(5)} |"
|
98
|
+
end
|
99
|
+
|
100
|
+
def print_code_test_stats
|
101
|
+
code = calculate_code
|
102
|
+
tests = calculate_tests
|
103
|
+
|
104
|
+
puts " Code LOC: #{code} Test LOC: #{tests} Code to Test Ratio: 1:#{sprintf("%.1f", tests.to_f/code)}"
|
105
|
+
puts ""
|
106
|
+
end
|
107
|
+
end
|
data/lib/commands.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
commands = Dir["#{File.dirname(__FILE__)}/commands/*.rb"].collect { |file_path| File.basename(file_path).split(".").first }
|
2
|
+
|
3
|
+
if commands.include?(ARGV.first)
|
4
|
+
require "#{File.dirname(__FILE__)}/commands/#{ARGV.shift}"
|
5
|
+
else
|
6
|
+
puts <<-USAGE
|
7
|
+
The 'run' provides a unified access point for all the default Rails' commands.
|
8
|
+
|
9
|
+
Usage: ./script/run <command> [OPTIONS]
|
10
|
+
|
11
|
+
Examples:
|
12
|
+
./script/run generate controller Admin
|
13
|
+
./script/run process reaper
|
14
|
+
|
15
|
+
USAGE
|
16
|
+
puts "Choose: #{commands.join(", ")}"
|
17
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
options = { :sandbox => false, :irb => irb }
|
6
|
+
OptionParser.new do |opt|
|
7
|
+
opt.banner = "Usage: console [environment] [options]"
|
8
|
+
opt.on('-s', '--sandbox', 'Rollback database modifications on exit.') { |v| options[:sandbox] = v }
|
9
|
+
opt.on("--irb=[#{irb}]", 'Invoke a different irb.') { |v| options[:irb] = v }
|
10
|
+
opt.on("--debugger", 'Enable ruby-debugging for the console.') { |v| options[:debugger] = v }
|
11
|
+
opt.parse!(ARGV)
|
12
|
+
end
|
13
|
+
|
14
|
+
libs = " -r irb/completion"
|
15
|
+
libs << %( -r "#{RAILS_ROOT}/config/environment")
|
16
|
+
libs << " -r console_app"
|
17
|
+
libs << " -r console_sandbox" if options[:sandbox]
|
18
|
+
libs << " -r console_with_helpers"
|
19
|
+
|
20
|
+
if options[:debugger]
|
21
|
+
begin
|
22
|
+
require 'ruby-debug'
|
23
|
+
libs << " -r ruby-debug"
|
24
|
+
puts "=> Debugger enabled"
|
25
|
+
rescue Exception
|
26
|
+
puts "You need to install ruby-debug to run the console in debugging mode. With gems, use 'gem install ruby-debug'"
|
27
|
+
exit
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
ENV['RAILS_ENV'] = case ARGV.first
|
32
|
+
when "p"; "production"
|
33
|
+
when "d"; "development"
|
34
|
+
when "t"; "test"
|
35
|
+
else
|
36
|
+
ARGV.first || ENV['RAILS_ENV'] || 'development'
|
37
|
+
end
|
38
|
+
|
39
|
+
if options[:sandbox]
|
40
|
+
puts "Loading #{ENV['RAILS_ENV']} environment in sandbox (Rails #{Rails.version})"
|
41
|
+
puts "Any modifications you make will be rolled back on exit"
|
42
|
+
else
|
43
|
+
puts "Loading #{ENV['RAILS_ENV']} environment (Rails #{Rails.version})"
|
44
|
+
end
|
45
|
+
exec "#{options[:irb]} #{libs} --simple-prompt"
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'yaml'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
include_password = false
|
6
|
+
options = {}
|
7
|
+
|
8
|
+
OptionParser.new do |opt|
|
9
|
+
opt.banner = "Usage: dbconsole [options] [environment]"
|
10
|
+
opt.on("-p", "--include-password", "Automatically provide the password from database.yml") do |v|
|
11
|
+
include_password = true
|
12
|
+
end
|
13
|
+
|
14
|
+
opt.on("--mode [MODE]", ['html', 'list', 'line', 'column'],
|
15
|
+
"Automatically put the sqlite3 database in the specified mode (html, list, line, column).") do |mode|
|
16
|
+
options['mode'] = mode
|
17
|
+
end
|
18
|
+
|
19
|
+
opt.on("-h", "--header") do |h|
|
20
|
+
options['header'] = h
|
21
|
+
end
|
22
|
+
|
23
|
+
opt.parse!(ARGV)
|
24
|
+
abort opt.to_s unless (0..1).include?(ARGV.size)
|
25
|
+
end
|
26
|
+
|
27
|
+
env = ARGV.first || ENV['RAILS_ENV'] || 'development'
|
28
|
+
unless config = YAML::load(ERB.new(IO.read(RAILS_ROOT + "/config/database.yml")).result)[env]
|
29
|
+
abort "No database is configured for the environment '#{env}'"
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def find_cmd(*commands)
|
34
|
+
dirs_on_path = ENV['PATH'].to_s.split(File::PATH_SEPARATOR)
|
35
|
+
commands += commands.map{|cmd| "#{cmd}.exe"} if RUBY_PLATFORM =~ /win32/
|
36
|
+
|
37
|
+
full_path_command = nil
|
38
|
+
found = commands.detect do |cmd|
|
39
|
+
dir = dirs_on_path.detect do |path|
|
40
|
+
full_path_command = File.join(path, cmd)
|
41
|
+
File.executable? full_path_command
|
42
|
+
end
|
43
|
+
end
|
44
|
+
found ? full_path_command : abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")
|
45
|
+
end
|
46
|
+
|
47
|
+
case config["adapter"]
|
48
|
+
when "mysql"
|
49
|
+
args = {
|
50
|
+
'host' => '--host',
|
51
|
+
'port' => '--port',
|
52
|
+
'socket' => '--socket',
|
53
|
+
'username' => '--user',
|
54
|
+
'encoding' => '--default-character-set'
|
55
|
+
}.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact
|
56
|
+
|
57
|
+
if config['password'] && include_password
|
58
|
+
args << "--password=#{config['password']}"
|
59
|
+
elsif config['password'] && !config['password'].to_s.empty?
|
60
|
+
args << "-p"
|
61
|
+
end
|
62
|
+
|
63
|
+
args << config['database']
|
64
|
+
|
65
|
+
exec(find_cmd('mysql', 'mysql5'), *args)
|
66
|
+
|
67
|
+
when "postgresql"
|
68
|
+
ENV['PGUSER'] = config["username"] if config["username"]
|
69
|
+
ENV['PGHOST'] = config["host"] if config["host"]
|
70
|
+
ENV['PGPORT'] = config["port"].to_s if config["port"]
|
71
|
+
ENV['PGPASSWORD'] = config["password"].to_s if config["password"] && include_password
|
72
|
+
exec(find_cmd('psql'), config["database"])
|
73
|
+
|
74
|
+
when "sqlite"
|
75
|
+
exec(find_cmd('sqlite'), config["database"])
|
76
|
+
|
77
|
+
when "sqlite3"
|
78
|
+
args = []
|
79
|
+
|
80
|
+
args << "-#{options['mode']}" if options['mode']
|
81
|
+
args << "-header" if options['header']
|
82
|
+
args << config['database']
|
83
|
+
|
84
|
+
exec(find_cmd('sqlite3'), *args)
|
85
|
+
else
|
86
|
+
abort "Unknown command-line client for #{config['database']}. Submit a Rails patch to add support!"
|
87
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'fcgi_handler'
|
6
|
+
|
7
|
+
def message(s)
|
8
|
+
$stderr.puts "listener: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
|
9
|
+
end
|
10
|
+
|
11
|
+
class RemoteCGI < CGI
|
12
|
+
attr_accessor :stdinput, :stdoutput, :env_table
|
13
|
+
def initialize(env_table, input = nil, output = nil)
|
14
|
+
self.env_table = env_table
|
15
|
+
self.stdinput = input || StringIO.new
|
16
|
+
self.stdoutput = output || StringIO.new
|
17
|
+
super()
|
18
|
+
end
|
19
|
+
|
20
|
+
def out(stream) # Ignore the requested output stream
|
21
|
+
super(stdoutput)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Listener
|
26
|
+
include DRbUndumped
|
27
|
+
|
28
|
+
def initialize(timeout, socket_path)
|
29
|
+
@socket = File.expand_path(socket_path)
|
30
|
+
@mutex = Mutex.new
|
31
|
+
@active = false
|
32
|
+
@timeout = timeout
|
33
|
+
|
34
|
+
@handler = RailsFCGIHandler.new
|
35
|
+
@handler.extend DRbUndumped
|
36
|
+
|
37
|
+
message 'opening socket'
|
38
|
+
DRb.start_service("drbunix:#{@socket}", self)
|
39
|
+
|
40
|
+
message 'entering process loop'
|
41
|
+
@handler.process! self
|
42
|
+
end
|
43
|
+
|
44
|
+
def each_cgi(&cgi_block)
|
45
|
+
@cgi_block = cgi_block
|
46
|
+
message 'entering idle loop'
|
47
|
+
loop do
|
48
|
+
sleep @timeout rescue nil
|
49
|
+
die! unless @active
|
50
|
+
@active = false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def process(env, input)
|
55
|
+
message 'received request'
|
56
|
+
@mutex.synchronize do
|
57
|
+
@active = true
|
58
|
+
|
59
|
+
message 'creating input stream'
|
60
|
+
input_stream = StringIO.new(input)
|
61
|
+
message 'building CGI instance'
|
62
|
+
cgi = RemoteCGI.new(eval(env), input_stream)
|
63
|
+
|
64
|
+
message 'yielding to fcgi handler'
|
65
|
+
@cgi_block.call cgi
|
66
|
+
message 'yield finished -- sending output'
|
67
|
+
|
68
|
+
cgi.stdoutput.seek(0)
|
69
|
+
output = cgi.stdoutput.read
|
70
|
+
|
71
|
+
return output
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def die!
|
76
|
+
message 'shutting down'
|
77
|
+
DRb.stop_service
|
78
|
+
FileUtils.rm_f @socket
|
79
|
+
Kernel.exit 0
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
socket_path = ARGV.shift
|
84
|
+
timeout = (ARGV.shift || 90).to_i
|
85
|
+
|
86
|
+
Listener.new(timeout, socket_path)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'drb'
|
4
|
+
require 'thread'
|
5
|
+
|
6
|
+
def message(s)
|
7
|
+
$stderr.puts "tracker: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
|
8
|
+
end
|
9
|
+
|
10
|
+
class Tracker
|
11
|
+
include DRbUndumped
|
12
|
+
|
13
|
+
def initialize(instances, socket_path)
|
14
|
+
@instances = instances
|
15
|
+
@socket = File.expand_path(socket_path)
|
16
|
+
@active = false
|
17
|
+
|
18
|
+
@listeners = []
|
19
|
+
@instances.times { @listeners << Mutex.new }
|
20
|
+
|
21
|
+
message "using #{@listeners.length} listeners"
|
22
|
+
message "opening socket at #{@socket}"
|
23
|
+
|
24
|
+
@service = DRb.start_service("drbunix://#{@socket}", self)
|
25
|
+
end
|
26
|
+
|
27
|
+
def with_listener
|
28
|
+
message "listener requested"
|
29
|
+
|
30
|
+
mutex = has_lock = index = nil
|
31
|
+
3.times do
|
32
|
+
@listeners.each_with_index do |mutex, index|
|
33
|
+
has_lock = mutex.try_lock
|
34
|
+
break if has_lock
|
35
|
+
end
|
36
|
+
break if has_lock
|
37
|
+
sleep 0.05
|
38
|
+
end
|
39
|
+
|
40
|
+
if has_lock
|
41
|
+
message "obtained listener #{index}"
|
42
|
+
@active = true
|
43
|
+
begin yield index
|
44
|
+
ensure
|
45
|
+
mutex.unlock
|
46
|
+
message "released listener #{index}"
|
47
|
+
end
|
48
|
+
else
|
49
|
+
message "dropping request because no listeners are available!"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def background(check_interval = nil)
|
54
|
+
if check_interval
|
55
|
+
loop do
|
56
|
+
sleep check_interval
|
57
|
+
message "Idle for #{check_interval}, shutting down" unless @active
|
58
|
+
@active = false
|
59
|
+
Kernel.exit 0
|
60
|
+
end
|
61
|
+
else DRb.thread.join
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
socket_path = ARGV.shift
|
67
|
+
instances = ARGV.shift.to_i
|
68
|
+
t = Tracker.new(instances, socket_path)
|
69
|
+
t.background(ARGV.first ? ARGV.shift.to_i : 90)
|