harker 0.5.3

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.
Files changed (67) hide show
  1. data/History.txt +31 -0
  2. data/Manifest.txt +66 -0
  3. data/README.rdoc +101 -0
  4. data/Rakefile +20 -0
  5. data/bin/harker +19 -0
  6. data/lib/harker.rb +116 -0
  7. data/lib/harker/gemify.rb +44 -0
  8. data/lib/harker/rails_configuration.rb +36 -0
  9. data/lib/harker/server.rb +125 -0
  10. data/lib/harker/templates/bin.erb +5 -0
  11. data/lib/harker/templates/hoe.erb +9 -0
  12. data/lib/harker/templates/lib.erb +2 -0
  13. data/test/sample/Manifest.txt +53 -0
  14. data/test/sample/README.rdoc +46 -0
  15. data/test/sample/Rakefile +14 -0
  16. data/test/sample/app/controllers/application_controller.rb +10 -0
  17. data/test/sample/app/controllers/harks_controller.rb +6 -0
  18. data/test/sample/app/helpers/application_helper.rb +3 -0
  19. data/test/sample/app/helpers/harks_helper.rb +2 -0
  20. data/test/sample/app/models/hark.rb +2 -0
  21. data/test/sample/bin/sample_rails +5 -0
  22. data/test/sample/config/boot.rb +110 -0
  23. data/test/sample/config/database.yml +22 -0
  24. data/test/sample/config/environment.rb +41 -0
  25. data/test/sample/config/environments/development.rb +17 -0
  26. data/test/sample/config/environments/production.rb +28 -0
  27. data/test/sample/config/environments/test.rb +28 -0
  28. data/test/sample/config/initializers/backtrace_silencers.rb +7 -0
  29. data/test/sample/config/initializers/inflections.rb +10 -0
  30. data/test/sample/config/initializers/mime_types.rb +5 -0
  31. data/test/sample/config/initializers/new_rails_defaults.rb +19 -0
  32. data/test/sample/config/initializers/session_store.rb +15 -0
  33. data/test/sample/config/locales/en.yml +5 -0
  34. data/test/sample/config/routes.rb +45 -0
  35. data/test/sample/db/migrate/20090326050232_create_harks.rb +12 -0
  36. data/test/sample/lib/sample_rails.rb +2 -0
  37. data/test/sample/public/404.html +30 -0
  38. data/test/sample/public/422.html +30 -0
  39. data/test/sample/public/500.html +30 -0
  40. data/test/sample/public/favicon.ico +0 -0
  41. data/test/sample/public/images/rails.png +0 -0
  42. data/test/sample/public/index.html +275 -0
  43. data/test/sample/public/javascripts/application.js +2 -0
  44. data/test/sample/public/javascripts/controls.js +963 -0
  45. data/test/sample/public/javascripts/dragdrop.js +973 -0
  46. data/test/sample/public/javascripts/effects.js +1128 -0
  47. data/test/sample/public/javascripts/prototype.js +4320 -0
  48. data/test/sample/public/robots.txt +5 -0
  49. data/test/sample/script/about +4 -0
  50. data/test/sample/script/console +3 -0
  51. data/test/sample/script/dbconsole +3 -0
  52. data/test/sample/script/destroy +3 -0
  53. data/test/sample/script/generate +3 -0
  54. data/test/sample/script/performance/benchmarker +3 -0
  55. data/test/sample/script/performance/profiler +3 -0
  56. data/test/sample/script/plugin +3 -0
  57. data/test/sample/script/runner +3 -0
  58. data/test/sample/script/server +3 -0
  59. data/test/sample/test/fixtures/harks.yml +7 -0
  60. data/test/sample/test/functional/harks_controller_test.rb +8 -0
  61. data/test/sample/test/performance/browsing_test.rb +9 -0
  62. data/test/sample/test/test_helper.rb +38 -0
  63. data/test/sample/test/unit/hark_test.rb +8 -0
  64. data/test/sample/test/unit/helpers/harks_helper_test.rb +4 -0
  65. data/test/test_gemify.sh +18 -0
  66. data/test/test_harker.rb +81 -0
  67. metadata +163 -0
@@ -0,0 +1,31 @@
1
+ === 0.5.3 / 2009-04-21
2
+
3
+ * Load app extensions on a per-instance basis.
4
+ * Depend on hoe so Rails' test task isn't interfered with.
5
+
6
+ === 0.5.2 / 2009-03-31
7
+
8
+ * Remove Hoe test task if supported.
9
+
10
+ === 0.5.1 / 2009-03-30
11
+
12
+ * Fixed a problem with the Usage message.
13
+
14
+ === 0.5.0 / 2009-03-30
15
+
16
+ * Use gem's config/database.yml for a base.
17
+ * Gemifying existing apps works now.
18
+ * Accept arguments for script/server when starting app.
19
+
20
+ === 0.0.3 / 2009-03-26
21
+
22
+ * A release!
23
+ * First pass at automating gemification of Rails apps with bin/harker.
24
+ * Swapped order of Harker.launch args; now action then instance dir.
25
+ * Apps don't need config/environment.rb tweaks to use harker.
26
+ * Got some docs; yay.
27
+
28
+ === 0.0.1 / 2009-03-25
29
+
30
+ * Birthday!
31
+
@@ -0,0 +1,66 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ bin/harker
6
+ lib/harker.rb
7
+ lib/harker/gemify.rb
8
+ lib/harker/rails_configuration.rb
9
+ lib/harker/server.rb
10
+ lib/harker/templates/bin.erb
11
+ lib/harker/templates/hoe.erb
12
+ lib/harker/templates/lib.erb
13
+ test/sample/Manifest.txt
14
+ test/sample/README.rdoc
15
+ test/sample/Rakefile
16
+ test/sample/app/controllers/application_controller.rb
17
+ test/sample/app/controllers/harks_controller.rb
18
+ test/sample/app/helpers/application_helper.rb
19
+ test/sample/app/helpers/harks_helper.rb
20
+ test/sample/app/models/hark.rb
21
+ test/sample/bin/sample_rails
22
+ test/sample/config/boot.rb
23
+ test/sample/config/database.yml
24
+ test/sample/config/environment.rb
25
+ test/sample/config/environments/development.rb
26
+ test/sample/config/environments/production.rb
27
+ test/sample/config/environments/test.rb
28
+ test/sample/config/initializers/backtrace_silencers.rb
29
+ test/sample/config/initializers/inflections.rb
30
+ test/sample/config/initializers/mime_types.rb
31
+ test/sample/config/initializers/new_rails_defaults.rb
32
+ test/sample/config/initializers/session_store.rb
33
+ test/sample/config/locales/en.yml
34
+ test/sample/config/routes.rb
35
+ test/sample/db/migrate/20090326050232_create_harks.rb
36
+ test/sample/lib/sample_rails.rb
37
+ test/sample/public/404.html
38
+ test/sample/public/422.html
39
+ test/sample/public/500.html
40
+ test/sample/public/favicon.ico
41
+ test/sample/public/images/rails.png
42
+ test/sample/public/index.html
43
+ test/sample/public/javascripts/application.js
44
+ test/sample/public/javascripts/controls.js
45
+ test/sample/public/javascripts/dragdrop.js
46
+ test/sample/public/javascripts/effects.js
47
+ test/sample/public/javascripts/prototype.js
48
+ test/sample/public/robots.txt
49
+ test/sample/script/about
50
+ test/sample/script/console
51
+ test/sample/script/dbconsole
52
+ test/sample/script/destroy
53
+ test/sample/script/generate
54
+ test/sample/script/performance/benchmarker
55
+ test/sample/script/performance/profiler
56
+ test/sample/script/plugin
57
+ test/sample/script/runner
58
+ test/sample/script/server
59
+ test/sample/test/fixtures/harks.yml
60
+ test/sample/test/functional/harks_controller_test.rb
61
+ test/sample/test/performance/browsing_test.rb
62
+ test/sample/test/test_helper.rb
63
+ test/sample/test/unit/hark_test.rb
64
+ test/sample/test/unit/helpers/harks_helper_test.rb
65
+ test/test_gemify.sh
66
+ test/test_harker.rb
@@ -0,0 +1,101 @@
1
+ = Harker
2
+
3
+ http://github.com/technomancy/harker
4
+
5
+ == Description
6
+
7
+ Harker means Rails deployments via RubyGems--because a package manager
8
+ is a terrible thing to waste.
9
+
10
+ == Motivation
11
+
12
+ This will mean you can use the same infrastructure you already rely on
13
+ for your dependencies to manage your application itself. It means
14
+ never having to keep a checkout of your app just for deployment. It
15
+ also becomes very easy to see what versions are installed on a given
16
+ box and run multiple instances (of the same or different versions) at
17
+ the same time on different ports.
18
+
19
+ Your app code will live in your gem home, but all the files specific
20
+ to a given instance will live in an instance directory.
21
+
22
+ In short: you've already got a package manager. Why are you handling
23
+ installation of your deployed apps with a one-off tool?
24
+
25
+ == Setup
26
+
27
+ Your Rails app will need to be modified a bit to become a gem and work
28
+ with Harker. But don't worry, these modifications will improve your
29
+ app and make it more awesome. Running "harker /path/to/rails/app" will
30
+ attempt to turn it into a gem that uses Hoe. You may need to perform a
31
+ bit of tweaking in order to get it to build cleanly since every app is
32
+ different--see the one in test/sample/ for an example of how this
33
+ works. In particular, be sure Manifest.txt does not include any files
34
+ that shouldn't go in the gem, such as pid or log files.
35
+
36
+ You don't have to use Hoe if you want to turn your app into a gem
37
+ manually or using another library, but it helps.
38
+
39
+ == Usage
40
+
41
+ Once your app is a gem, install it locally with "rake install_gem",
42
+ and you should be able to use the bin wrapper to generate a new
43
+ instance:
44
+
45
+ $ your_app init ~/apps/your_app_3001
46
+
47
+ Then edit ~/apps/your_app_3001/database.yml with your database
48
+ settings. At that point you should be able to bring up your database:
49
+
50
+ $ your_app migrate ~/apps/your_app_3001
51
+
52
+ Test it out by dropping into the console:
53
+
54
+ $ your_app console ~/apps/your_app_3001
55
+
56
+ Then you can start and stop your application server via Rack:
57
+
58
+ $ your_app start ~/apps/your_app_3001 --daemon --port=3001
59
+ $ your_app stop ~/apps/your_app_3001
60
+
61
+ The start command takes all the same arguments as script/server. To
62
+ configure it in a way that doesn't require command-line arguments,
63
+ create a config.ru file in your instance directory, and Rails will
64
+ pick that up with Rack.
65
+
66
+ If you omit the second argument, it defaults to the current directory.
67
+
68
+ For deployment, simply publish your gem to a gem server (public or
69
+ private), install it on the target server, and launch it via the bin
70
+ wrapper as shown above.
71
+
72
+ == Extensions
73
+
74
+ Sometimes it becomes necessary to hot-patch a deployed app. Instead of
75
+ editing the code inside your gem home, (which is Fraught with Peril)
76
+ you can place .rb files inside your instance directory's extensions/
77
+ directory. These will be loaded immediately after the application is
78
+ required.
79
+
80
+ == Requirements
81
+
82
+ * rails (at least 2.3.2)
83
+ * a Rails app to use it with
84
+ * rubygems
85
+ * hoe (technically optional)
86
+
87
+ == Install
88
+
89
+ * sudo gem install technomancy-harker --source=http://gems.github.com --source=http://gems.rubyforge.org
90
+
91
+ == Todo
92
+
93
+ * rake tasks for remotely installing gem
94
+ * make it easy to "rake release" to a private gem repo
95
+ * test, test, test. try it out with more rails apps!
96
+
97
+ == License
98
+
99
+ Copyright (c) 2009 Phil Hagelberg.
100
+
101
+ Licensed under the same terms as Ruby.
@@ -0,0 +1,20 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/harker.rb'
6
+
7
+ Hoe.new('harker', Harker::VERSION) do |p|
8
+ p.developer('Phil Hagelberg', 'technomancy@gmail.com')
9
+ p.rubyforge_name = "seattlerb"
10
+ p.readme_file = 'README.rdoc'
11
+ p.summary = "Harker: Rubygems-based deployment for Rails apps."
12
+
13
+ p.extra_deps << ["rails", "~> 2.3.2"]
14
+ p.extra_dev_deps << ["minitest", "~> 1.3.1"]
15
+ p.extra_dev_deps << ["sqlite3-ruby", "~> 1.2.4"]
16
+ # recommended:
17
+ # p.extra_dev_deps << ["mongrel", "~> 1.2.4"]
18
+ end
19
+
20
+ # vim: syntax=Ruby
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'harker/gemify'
4
+
5
+ begin
6
+ gem 'hoe'
7
+ rescue LoadError
8
+ abort 'Hoe not found. You can continue without hoe if you gemify
9
+ your app yourself; see Harker documentation for details.'
10
+ end
11
+
12
+ if ARGV.include?('-h') or ARGV.include?('--help') or ARGV.size > 1
13
+ puts "Usage: #{File.basename($0)} [RAILS_ROOT]"
14
+ puts
15
+ puts "Attempts to turn your Rails app into a gem for deployment with harker."
16
+ exit
17
+ end
18
+
19
+ Harker.gemify(ARGV.shift || Dir.pwd)
@@ -0,0 +1,116 @@
1
+ require 'fileutils'
2
+
3
+ # Harker lets you deploy Rails apps via RubyGems.
4
+ #
5
+ # These commands get invoked by the bin wrapper of the rails app gem
6
+ # rather than by Harker itself.
7
+ #
8
+ module Harker
9
+ VERSION = '0.5.3'
10
+ ACTIONS = %w(start stop restart init migrate console)
11
+ GEM_ROOT = Gem.loaded_specs[File.basename($0)].full_gem_path rescue '.'
12
+
13
+ module_function
14
+
15
+ # Dispatch based on user's command
16
+ def launch(name, args)
17
+ action = args.shift
18
+
19
+ unless ACTIONS.include?(action)
20
+ abort "Usage: #{name} (#{ACTIONS.join('|')}) [INSTANCE_DIR] [START_ARGS]
21
+ The start command takes the same arguments as script/server."
22
+ end
23
+
24
+ # We need to get rid of the first arg if it's the optional
25
+ # instance directory so script/server doesn't get confused.
26
+ @root = if File.directory? args.first.to_s or action == 'init'
27
+ File.expand_path args.shift
28
+ else
29
+ Dir.pwd
30
+ end
31
+
32
+ @name = name
33
+
34
+ unless action == 'init'
35
+ # 2.3.2 doesn't support tmp_dir config option; needs a monkeypatch.
36
+ require 'harker/rails_configuration'
37
+ require @name
38
+ Dir["#{@root}/extensions/*rb"].each { |f| load f }
39
+ end
40
+
41
+ self.send(action)
42
+ end
43
+
44
+ # Start and optionally daemonize the application server
45
+ def start
46
+ # http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2350
47
+ # Submitted a patch to Rails, but this lets it work with 2.3.2
48
+ Rails::Rack::LogTailer::EnvironmentLog.replace(Rails.configuration.log_path)
49
+
50
+ abort "Can't start; pidfile exists at #{pidfile}." if File.exist? pidfile
51
+ require 'harker/server'
52
+ end
53
+
54
+ def stop
55
+ abort "No pid at #{pidfile}." unless File.exist?(pidfile)
56
+ Process.kill('TERM', File.read(pidfile).to_i)
57
+ end
58
+
59
+ def restart
60
+ stop
61
+ rescue SystemExit
62
+ start
63
+ end
64
+
65
+ # Initialize a new instance of your application
66
+ def init
67
+ %w(tmp log db extensions).each do |d|
68
+ FileUtils.mkdir_p(File.join(@root, d))
69
+ end
70
+
71
+ base_db_file = File.join(GEM_ROOT, 'config', 'database.yml')
72
+
73
+ File.open("#{@root}/database.yml", 'w') do |fp|
74
+ # Need to make sure any sqlite3 DB paths are absolute.
75
+ db_config = YAML.load_file(base_db_file)
76
+ db_config.each do |env, hash|
77
+ if hash['adapter'] =~ /sqlite3?/
78
+ hash['database'] = File.join(@root, hash['database'])
79
+ end
80
+ end
81
+
82
+ fp.puts(db_config.to_yaml)
83
+ end
84
+
85
+ puts <<-END
86
+ Initialized #{@name} instance in #{@root}...
87
+
88
+ Configure your database by editing #{@root}/database.yml.
89
+ Optionally configure your web server via rack in #{@root}/config.ru.
90
+
91
+ Migrate your DB with: #{@name} migrate
92
+ Then launch with: #{@name} start --daemon
93
+ END
94
+ end
95
+
96
+ def migrate
97
+ puts "Migrating the #{RAILS_ENV} environment of #{@name}..."
98
+ ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db', 'migrate'),
99
+ ENV["VERSION"] && ENV["VERSION"].to_i)
100
+ end
101
+
102
+ def console
103
+ require 'irb'
104
+ IRB.start
105
+ end
106
+
107
+ def configure(config)
108
+ config.database_configuration_file = File.join(@root, 'database.yml')
109
+ config.log_path = File.join(@root, 'log', "#{RAILS_ENV}.log")
110
+ config.tmp_dir = File.join(@root, 'tmp')
111
+ end
112
+
113
+ def pidfile
114
+ File.join(@root, 'tmp', 'pids', 'server.pid')
115
+ end
116
+ end
@@ -0,0 +1,44 @@
1
+ require 'harker'
2
+ require 'fileutils'
3
+ require 'erb'
4
+
5
+ module Harker
6
+ # Turn an existing Rails app into a gem.
7
+ def self.gemify(rails_root)
8
+ @project_name = File.basename(rails_root)
9
+
10
+ if File.exist?(rails_root + "/bin/#{@project_name}") or
11
+ File.exist?(rails_root + "/lib/#{@project_name}.rb")
12
+ abort "Can't write gem files without overwriting existing ones.
13
+ Try manually gemifying."
14
+ end
15
+
16
+ File.open(File.join(rails_root, '/Rakefile'), 'a') do |fp|
17
+ fp.puts template('hoe')
18
+ puts "Added hoe block to Rakefile."
19
+ end
20
+
21
+ FileUtils.mkdir_p(File.join(rails_root, '/bin'))
22
+ File.open(File.join(rails_root, "/bin/#{@project_name}"), 'w') do |fp|
23
+ fp.puts template('bin')
24
+ puts "Wrote bin launcher."
25
+ end
26
+
27
+ File.open(File.join(rails_root, "/lib/#{@project_name}.rb"), 'w') do |fp|
28
+ fp.puts template('lib')
29
+ puts "Wrote lib file."
30
+ end
31
+
32
+ # Submitted a patch to hoe to make it ignore log files by default,
33
+ # but folks should still give it a once-over manually anyway.
34
+ system "cd #{rails_root}; touch Manifest.txt; rake check_manifest | patch"
35
+ puts "Wrote Manifest.txt."
36
+ puts "Ensure the manifest doesn't contain files you don't want in the gem."
37
+ puts "Then try running rake install_gem."
38
+ end
39
+
40
+ def self.template(name)
41
+ template_path = File.join File.dirname(__FILE__), 'templates', "#{name}.erb"
42
+ ERB.new(File.read(template_path)).result(binding)
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ # This monkeypatches Rails to allow tmp_dir to be configured.
2
+
3
+ # It's been submitted upstream:
4
+ # http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2379
5
+
6
+ # We can remove the Configuration monkeypatch once the above patch is
7
+ # accepted if we don't care about supporting older versions.
8
+
9
+ gem 'rails'
10
+ require 'initializer'
11
+
12
+ class Rails::Configuration
13
+ attr_accessor :tmp_dir
14
+
15
+ def default_tmp_dir
16
+ File.join(root_path, 'tmp')
17
+ end
18
+
19
+ def default_cache_store
20
+ if File.exist? File.join(default_tmp_dir, 'cache')
21
+ [ :file_store, File.join(default_tmp_dir, 'cache') ]
22
+ else
23
+ :memory_store
24
+ end
25
+ end
26
+ end
27
+
28
+ class Rails::Initializer
29
+ def self.run(command = :process, configuration = Rails::Configuration.new)
30
+ yield configuration if block_given?
31
+ Harker.configure(configuration)
32
+ initializer = new configuration
33
+ initializer.send(command)
34
+ initializer
35
+ end
36
+ end
@@ -0,0 +1,125 @@
1
+ # A patched copy of what Rails' script/server runs.
2
+
3
+ # These changes were submitted upstream to Rails:
4
+ # http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2379
5
+
6
+ # We can remove this file once that patch is accepted if we don't care
7
+ # about supporting older versions.
8
+
9
+ # Only two changes were made, noted below by comments beginning with "Harker"
10
+
11
+ require 'active_support'
12
+ require 'action_controller'
13
+
14
+ require 'fileutils'
15
+ require 'optparse'
16
+
17
+ begin
18
+ require_library_or_gem 'thin'
19
+ rescue Exception
20
+ # Thin not available
21
+ end
22
+
23
+ options = {
24
+ :Port => 3000,
25
+ :Host => "0.0.0.0",
26
+ :environment => (ENV['RAILS_ENV'] || "development").dup,
27
+ :config => RAILS_ROOT + "/config.ru",
28
+ :detach => false,
29
+ :debugger => false,
30
+ :path => nil
31
+ }
32
+
33
+ ARGV.clone.options do |opts|
34
+ opts.on("-p", "--port=port", Integer,
35
+ "Runs Rails on the specified port.", "Default: 3000") { |v| options[:Port] = v }
36
+ opts.on("-b", "--binding=ip", String,
37
+ "Binds Rails to the specified ip.", "Default: 0.0.0.0") { |v| options[:Host] = v }
38
+ opts.on("-c", "--config=file", String,
39
+ "Use custom rackup configuration file") { |v| options[:config] = v }
40
+ opts.on("-d", "--daemon", "Make server run as a Daemon.") { options[:detach] = true }
41
+ opts.on("-u", "--debugger", "Enable ruby-debugging for the server.") { options[:debugger] = true }
42
+ opts.on("-e", "--environment=name", String,
43
+ "Specifies the environment to run this server under (test/development/production).",
44
+ "Default: development") { |v| options[:environment] = v }
45
+ opts.on("-P", "--path=/path", String, "Runs Rails app mounted at a specific path.", "Default: /") { |v| options[:path] = v }
46
+
47
+ opts.separator ""
48
+
49
+ opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
50
+
51
+ opts.parse!
52
+ end
53
+
54
+ server = Rack::Handler.get(ARGV.first) rescue nil
55
+ unless server
56
+ begin
57
+ server = Rack::Handler::Mongrel
58
+ rescue LoadError => e
59
+ server = Rack::Handler::WEBrick
60
+ end
61
+ end
62
+
63
+ puts "=> Booting #{ActiveSupport::Inflector.demodulize(server)}"
64
+ puts "=> Rails #{Rails.version} application starting on http://#{options[:Host]}:#{options[:Port]}#{options[:path]}"
65
+
66
+ %w(cache pids sessions sockets).each do |dir_to_make|
67
+ # Harker: patched to use Rails.configuration.tmp_dir
68
+ FileUtils.mkdir_p(File.join(Rails.configuration.tmp_dir, dir_to_make))
69
+ end
70
+
71
+ if options[:detach]
72
+ Process.daemon
73
+ # Harker: patched to use Rails.configuration.tmp_dir
74
+ pid = File.join(Rails.configuration.tmp_dir, 'pids', 'server.pid')
75
+ File.open(pid, 'w'){ |f| f.write(Process.pid) }
76
+ at_exit { File.delete(pid) if File.exist?(pid) }
77
+ end
78
+
79
+ ENV["RAILS_ENV"] = options[:environment]
80
+ RAILS_ENV.replace(options[:environment]) if defined?(RAILS_ENV)
81
+
82
+ if File.exist?(options[:config])
83
+ config = options[:config]
84
+ if config =~ /\.ru$/
85
+ cfgfile = File.read(config)
86
+ if cfgfile[/^#\\(.*)/]
87
+ opts.parse!($1.split(/\s+/))
88
+ end
89
+ inner_app = eval("Rack::Builder.new {( " + cfgfile + "\n )}.to_app", nil, config)
90
+ else
91
+ require config
92
+ inner_app = Object.const_get(File.basename(config, '.rb').capitalize)
93
+ end
94
+ else
95
+ require RAILS_ROOT + "/config/environment"
96
+ inner_app = ActionController::Dispatcher.new
97
+ end
98
+
99
+ if options[:path].nil?
100
+ map_path = "/"
101
+ else
102
+ ActionController::Base.relative_url_root = options[:path]
103
+ map_path = options[:path]
104
+ end
105
+
106
+ app = Rack::Builder.new {
107
+ use Rails::Rack::LogTailer unless options[:detach]
108
+ use Rails::Rack::Debugger if options[:debugger]
109
+ map map_path do
110
+ use Rails::Rack::Static
111
+ run inner_app
112
+ end
113
+ }.to_app
114
+
115
+ puts "=> Call with -d to detach"
116
+
117
+ trap(:INT) { exit }
118
+
119
+ puts "=> Ctrl-C to shutdown server"
120
+
121
+ begin
122
+ server.run(app, options.merge(:AccessLog => []))
123
+ ensure
124
+ puts 'Exiting'
125
+ end