diff --git a/.gitignore b/.gitignore index 2727cbe..5b14f74 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .DS_Store .rakeTasks +.yardoc aspen.i* javalib/ -spec/ diff --git a/doc/Aspen.html b/doc/Aspen.html new file mode 100644 index 0000000..517b1e5 --- /dev/null +++ b/doc/Aspen.html @@ -0,0 +1,123 @@ + + + + +Module: Aspen + + + + + + + + + + + + + +

Module: Aspen + + +

+ +
+ + + + + + + +
Defined in:
+
lib/aspen.rb,
+ lib/aspen/runner.rb,
lib/aspen/server.rb,
lib/aspen/logging.rb,
lib/aspen/version.rb,
lib/aspen/controller.rb,
lib/aspen/netty_proxy.rb
+
+ +
+
+ +

Overview

+
+

+module Aspen +

+ + +
+
+
+ +

Defined Under Namespace

+

+ + + Modules: Logging, VERSION + + + + Classes: Controller, InvalidOption, NettyProxy, RackParseError, Runner, RunnerError, Server + + +

+ +

Constant Summary

+ +
+ +
NAME = + +name string. + + +
+
'aspen'.freeze
+
+ +
SERVER = + +server name and version. + + +
+
"#{NAME} #{VERSION::STRING}".freeze
+
+ +
+ + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/Controller.html b/doc/Aspen/Controller.html new file mode 100644 index 0000000..9d70ded --- /dev/null +++ b/doc/Aspen/Controller.html @@ -0,0 +1,523 @@ + + + + +Class: Aspen::Controller + + + + + + + + + + + + + +

Class: Aspen::Controller + + +

+ +
+ +
Inherits:
+
+ Object + +
+ + + + + + +
Includes:
+
Aspen::Logging
+ + + + +
Defined in:
+
lib/aspen/controller.rb
+ +
+
+ +

Overview

+
+

+controls a server +

+ + +
+
+
+ +
+ + + + + +

Attribute Summary

+ + + +

Method Summary

+ + + + + + + + +

Methods included from Aspen::Logging

+

#debug, debug?, #log, #log_error, #silent=, silent?, #trace, trace?

+
+

Constructor Details

+ +
+

+ + - (Controller) initialize(options) + + + +

+
+

+create a new instance +

+ + +
+
+
+

Parameters:

+
    + +
  • + + (Hash) + + + command-line + + + + — + +options + + + +
  • + +
+

Returns:

+
    + +
  • + + (Controller) + + + + + — + +a new instance of Controller + + + +
  • + +
+ +
+ + + + +
+
+
+
+17
+18
+19
+
+
# File 'lib/aspen/controller.rb', line 17
+
+def initialize(options)
+  @options = options
+end
+
+
+
+ +
+ +
+

Attribute Details

+ + + + +
+

+ + - (Object) options + + + +

+
+

+Command line options passed to the aspen script +

+ + +
+
+
+ +
+ + + + +
+
+
+
+13
+14
+15
+
+
# File 'lib/aspen/controller.rb', line 13
+
+def options
+  @options
+end
+
+
+
+ +
+ + +
+

Method Details

+ +
+

+ + - (Object) config + + + +

+
+

+clean up options and write to file +

+ + +
+
+
+ +
+ + + + +
+
+
+
+36
+37
+38
+
+
# File 'lib/aspen/controller.rb', line 36
+
+def config
+
+end
+
+
+
+ +
+

+ + - (Object) restart + + + +

+
+

+restart the server +

+ + +
+
+
+ +
+ + + + +
+
+
+
+31
+32
+33
+
+
# File 'lib/aspen/controller.rb', line 31
+
+def restart
+  
+end
+
+
+
+ +
+

+ + - (Object) start + + + +

+
+

+build server and start it +

+ + +
+
+
+ +
+ + + + +
+
+
+
+22
+23
+
+
# File 'lib/aspen/controller.rb', line 22
+
+def start
+end
+
+
+
+ +
+

+ + - (Object) stop + + + +

+
+

+stop the server +

+ + +
+
+
+ +
+ + + + +
+
+
+
+26
+27
+28
+
+
# File 'lib/aspen/controller.rb', line 26
+
+def stop
+
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/InvalidOption.html b/doc/Aspen/InvalidOption.html new file mode 100644 index 0000000..70cee5b --- /dev/null +++ b/doc/Aspen/InvalidOption.html @@ -0,0 +1,114 @@ + + + + +Exception: Aspen::InvalidOption + + + + + + + + + + + + + +

Exception: Aspen::InvalidOption + + +

+ +
+ +
Inherits:
+
+ Aspen::RunnerError + + + show all + +
+ + + + + + + + +
Defined in:
+
lib/aspen/controller.rb
+ +
+
+ +

Overview

+
+

+Raised when an option is not valid. +

+ + +
+
+
+ +
+ + + + + + + + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/Logging.html b/doc/Aspen/Logging.html new file mode 100644 index 0000000..de030ed --- /dev/null +++ b/doc/Aspen/Logging.html @@ -0,0 +1,777 @@ + + + + +Module: Aspen::Logging + + + + + + + + + + + + + +

Module: Aspen::Logging + + +

+ +
+ + + + + + + +
Defined in:
+
lib/aspen/logging.rb
+ +
+
+ +

Overview

+
+

+To be included in classes to allow some basic logging that can be silenced +(Logging.silent=) or made more verbose. Logging.debug=: +log all error backtrace and messages +

+
+                         logged with <tt>debug</tt>.
+
+

+Logging.trace=: log all raw request and response and +

+
+                         messages logged with <tt>trace</tt>.
+
+ + +
+
+
+ +
+ +

Attribute Summary

+ + + +

Method Summary

+ + + +
+

Attribute Details

+ + + + +
+

+ + + (Object) debug= + + + +

+
+

+Sets the attribute debug +

+ + +
+
+
+

Parameters:

+
    + +
  • + + + + + value + + + + — + +the value to set the attribute debug to. + + + +
  • + +
+ +
+ + + + +
+
+
+
+11
+12
+13
+
+
# File 'lib/aspen/logging.rb', line 11
+
+def debug=(value)
+  @debug = value
+end
+
+
+
+ + + + +
+

+ + + (Object) silent= + + + +

+
+

+Sets the attribute silent +

+ + +
+
+
+

Parameters:

+
    + +
  • + + + + + value + + + + — + +the value to set the attribute silent to. + + + +
  • + +
+ +
+ + + + +
+
+
+
+11
+12
+13
+
+
# File 'lib/aspen/logging.rb', line 11
+
+def silent=(value)
+  @silent = value
+end
+
+
+
+ + + + +
+

+ + + (Object) trace= + + + +

+
+

+Sets the attribute trace +

+ + +
+
+
+

Parameters:

+
    + +
  • + + + + + value + + + + — + +the value to set the attribute trace to. + + + +
  • + +
+ +
+ + + + +
+
+
+
+11
+12
+13
+
+
# File 'lib/aspen/logging.rb', line 11
+
+def trace=(value)
+  @trace = value
+end
+
+
+
+ +
+ + +
+

Method Details

+ +
+

+ + + (Object) debug? + + + +

+ + + + +
+
+
+
+14
+
+
# File 'lib/aspen/logging.rb', line 14
+
+def debug?;  !@silent && @debug  end
+
+
+
+ +
+

+ + + (Object) silent? + + + +

+ + + + +
+
+
+
+15
+
+
# File 'lib/aspen/logging.rb', line 15
+
+def silent?;  @silent            end
+
+
+
+ +
+

+ + + (Object) trace? + + + +

+ + + + +
+
+
+
+13
+
+
# File 'lib/aspen/logging.rb', line 13
+
+def trace?;  !@silent && @trace  end
+
+
+
+ +
+

+ + - (Object) debug(msg = nil) + + + +

+
+

+Log a message to the console if debugging is activated +

+ + +
+
+
+ +
+ + + + +
+
+
+
+41
+42
+43
+
+
# File 'lib/aspen/logging.rb', line 41
+
+def debug(msg=nil)
+  log msg || yield if Logging.debug?
+end
+
+
+
+ +
+

+ + - (Object) log(msg) + + + +

+
+

+Log a message to the console +

+ + +
+
+
+ +
+ + + + +
+
+
+
+27
+28
+29
+
+
# File 'lib/aspen/logging.rb', line 27
+
+def log(msg)
+  puts msg unless Logging.silent?
+end
+
+
+
+ +
+

+ + - (Object) log_error(e = $!) + + + +

+
+

+Log an error backtrace if debugging is activated +

+ + +
+
+
+ +
+ + + + +
+
+
+
+48
+49
+50
+
+
# File 'lib/aspen/logging.rb', line 48
+
+def log_error(e=$!)
+  debug "#{e}\n\t" + e.backtrace.join("\n\t")
+end
+
+
+
+ +
+

+ + - (Object) silent=(value) + + + +

+
+

+Global silencer methods def silent +

+
+  Logging.silent?
+
+

+end +

+ + +
+
+
+ +
+ + + + +
+
+
+
+22
+23
+24
+
+
# File 'lib/aspen/logging.rb', line 22
+
+def silent=(value)
+  Logging.silent = value
+end
+
+
+
+ +
+

+ + - (Object) trace(msg = nil) + + + +

+
+

+Log a message to the console if tracing is activated +

+ + +
+
+
+ +
+ + + + +
+
+
+
+34
+35
+36
+
+
# File 'lib/aspen/logging.rb', line 34
+
+def trace(msg=nil)
+  log msg || yield if Logging.trace?
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/NettyProxy.html b/doc/Aspen/NettyProxy.html new file mode 100644 index 0000000..ba766ae --- /dev/null +++ b/doc/Aspen/NettyProxy.html @@ -0,0 +1,474 @@ + + + + +Class: Aspen::NettyProxy + + + + + + + + + + + + + +

Class: Aspen::NettyProxy + + +

+ +
+ +
Inherits:
+
+ Object + +
+ + + + + + +
Includes:
+
RackProxy
+ + + + +
Defined in:
+
lib/aspen/netty_proxy.rb
+ +
+
+ +

Overview

+
+

+implementation of RackProxy interface from Java side +

+ + +
+
+
+

Author:

+ +

Since:

+ +

Version:

+ + +
+ + + +

Method Summary

+ + + +
+

Constructor Details

+ +
+

+ + - (Array) initialize(app) + + + +

+
+

+create new instance of NettyProxy +

+ + +
+
+
+

Parameters:

+
    + +
  • + + (env) + + + #call + + + + — + +a Ruby Object which responds to :call(env) + + + +
  • + +
+

Returns:

+
    + +
  • + + (Array) + + + + + — + +an array of [Integer (status code), Hash (headers), and Object responding +to #each returning Strings] + + + +
  • + +
+ +
+ + + + +
+
+
+
+34
+35
+36
+
+
# File 'lib/aspen/netty_proxy.rb', line 34
+
+def initialize( app )
+  @app = app
+end
+
+
+
+ +
+ + +
+

Method Details

+ +
+

+ + - (HttpResponse) process(cxt, req) + + + +

+
+ +

+ TODO: + +handle chunking, keep-alive, content-encoding, etc. + + +

+ +

+process an incoming message which has been received on the socket this +method does most of the heavy lifting of translating Netty classes and +behaviors into Rack +

+ + +
+
+
+

Parameters:

+
    + +
  • + + (ChannelHandlerContext) + + + the + + + + — + +Netty context for message handling + + + +
  • + +
  • + + (HttpRequest) + + + the + + + + — + +Netty request object + + + +
  • + +
+

Returns:

+
    + +
  • + + (HttpResponse) + + + + + — + +the Netty response + + + +
  • + +
+

Raises:

+ + +
+ + + + +
+
+
+
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+
+
# File 'lib/aspen/netty_proxy.rb', line 44
+
+def process( cxt, req )
+  env = {}
+  RackUtil.parse_headers( cxt, req, env )
+  env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+  env.delete "PATH_INFO"  if env["PATH_INFO"] == ""
+  env["SERVER_PORT"] = "80" unless env["SERVER_PORT"]
+  data = req.content.to_string("UTF-8").to_s
+  rack_input = StringIO.new( data )
+  rack_input.set_encoding( Encoding::BINARY ) if rack_input.respond_to?( :set_encoding )
+  env.update( {"rack.version" => ::Aspen::VERSION::RACK,
+               "rack.input" => rack_input,
+               "rack.errors" => $stderr,
+
+               "rack.multithread" => true,
+               "rack.multiprocess" => false,
+               "rack.run_once" => false,
+
+               "rack.url_scheme" => "http",
+             } )
+
+  # g env.inspect if Logging.debug?
+  status, headers, body = @app.call(env)
+  # g body.inspect if (Logging.debug? and body)
+  # g status.inspect if (Logging.debug? and status)
+  raise RackParseError, "status is a #{status.class} class, not an integer" unless status.is_a?(Integer)
+  raise RackParseError, "body doesn't respond to :each and return strings" unless body.respond_to?(:each)
+
+  resp = DefaultHttpResponse.new( HttpVersion::HTTP_1_1, HttpResponseStatus.value_of( status ) )
+  headers.each do |k,vs|
+    vs.each { |v| resp.add_header k, v.chomp } if vs
+  end if headers
+  out_buf = ChannelBuffers.dynamic_buffer
+  body.each do |line|
+    out_buf.write_bytes ChannelBuffers.copied_buffer( line, "UTF-8" )
+  end
+  resp.content = out_buf
+  # g resp.inspect if Logging.debug?
+  resp
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/RackParseError.html b/doc/Aspen/RackParseError.html new file mode 100644 index 0000000..b18be26 --- /dev/null +++ b/doc/Aspen/RackParseError.html @@ -0,0 +1,92 @@ + + + + +Exception: Aspen::RackParseError + + + + + + + + + + + + + +

Exception: Aspen::RackParseError + + +

+ +
+ +
Inherits:
+
+ RuntimeError + +
    +
  • Object
  • + + + + + +
+ show all + +
+ + + + + + + + +
Defined in:
+
lib/aspen/netty_proxy.rb
+ +
+
+ + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/Runner.html b/doc/Aspen/Runner.html new file mode 100644 index 0000000..c6616ca --- /dev/null +++ b/doc/Aspen/Runner.html @@ -0,0 +1,963 @@ + + + + +Class: Aspen::Runner + + + + + + + + + + + + + +

Class: Aspen::Runner + + +

+ +
+ +
Inherits:
+
+ Object + +
+ + + + + + + + +
Defined in:
+
lib/aspen/runner.rb
+ +
+
+ +

Overview

+
+

+CLI runner - parse options and drive server +

+ + +
+
+
+

Author:

+ +

Since:

+ +

Version:

+ + +
+

Constant Summary

+ +
+ +
COMMANDS = + +
+
%w(start stop restart config)
+
+ +
CONFIGLESS_COMMANDS = + +Commands that wont load options from the config file. + + +
+
%w(config)
+
+ +
+ + + +

Attribute Summary

+ + + +

Method Summary

+ + +
+

Constructor Details

+ +
+

+ + - (Runner) initialize(argv) + + + +

+
+

+create a new instance +

+ + +
+
+
+

Parameters:

+
    + +
  • + + (Array) + + + command-line + + + + — + +arguments + + + +
  • + +
+

Returns:

+
    + +
  • + + (Runner) + + + + + — + +a new instance of Runner + + + +
  • + +
+ +
+ + + + +
+
+
+
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+
+
# File 'lib/aspen/runner.rb', line 36
+
+def initialize(argv)
+  @argv = argv
+  
+  # Default options values
+  @options = {
+    :chdir          => Dir.pwd,
+    :environment    => 'development',
+    :address        => Aspen::Server::DEFAULT_HOST,
+    :port           => Aspen::Server::DEFAULT_PORT,
+    :log            => 'log/aspen.log',
+    :pid            => 'tmp/pids/aspen.pid',
+    :require        => []
+  }
+  
+  parse!
+end
+
+
+
+ +
+ +
+

Attribute Details

+ + + + +
+

+ + - (Object) arguments + + + +

+
+

+Arguments to be passed to the command. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+27
+28
+29
+
+
# File 'lib/aspen/runner.rb', line 27
+
+def arguments
+  @arguments
+end
+
+
+
+ + + + +
+

+ + - (Object) command + + + +

+
+

+Name of the command to be runned. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+24
+25
+26
+
+
# File 'lib/aspen/runner.rb', line 24
+
+def command
+  @command
+end
+
+
+
+ + + + +
+

+ + - (Object) options + + + +

+
+

+Parsed options +

+ + +
+
+
+ +
+ + + + +
+
+
+
+21
+22
+23
+
+
# File 'lib/aspen/runner.rb', line 21
+
+def options
+  @options
+end
+
+
+
+ +
+ + +
+

Method Details

+ +
+

+ + + (Object) commands + + + +

+
+

+Return all available commands +

+ + +
+
+
+ +
+ + + + +
+
+
+
+30
+31
+32
+
+
# File 'lib/aspen/runner.rb', line 30
+
+def self.commands
+  COMMANDS
+end
+
+
+
+ +
+

+ + - (Object) parse! + + + +

+
+

+Parse the options. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+98
+99
+100
+101
+102
+
+
# File 'lib/aspen/runner.rb', line 98
+
+def parse!
+  parser.parse! @argv
+  @command   = @argv.shift
+  @arguments = @argv
+end
+
+
+
+ +
+

+ + - (OptionParser) parser + + + +

+
+

+build up a parser in @parser +

+ + +
+
+
+

Returns:

+
    + +
  • + + (OptionParser) + + + + + — + +the option handler + + + +
  • + +
+ +
+ + + + +
+
+
+
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+
+
# File 'lib/aspen/runner.rb', line 55
+
+def parser
+  # NOTE: If you add an option here make sure the key in the +options+ hash is the
+  # same as the name of the command line option.
+  @parser ||= OptionParser.new do |opts|
+    opts. = "Usage: aspen [options] #{self.class.commands.join('|')}"
+
+    opts.separator ""
+    opts.separator "Server options:"
+
+    opts.on("-a", "--address HOST", "bind to HOST address " +
+                                    "(default: #{@options[:address]})")             { |host| @options[:address] = host }
+    opts.on("-p", "--port PORT", "use PORT (default: #{@options[:port]})")          { |port| @options[:port] = port.to_i }
+    opts.on("-A", "--adapter NAME", "Rack adapter to use (default: autodetect)",
+                                    "(#{Rack::ADAPTERS.map{|(a,b)|a}.join(', ')})") { |name| @options[:adapter] = name }
+    opts.on("-R", "--rackup FILE", "Load a Rack config file instead of " +
+                                   "Rack adapter")                                  { |file| @options[:rackup] = file }
+    opts.on("-c", "--chdir DIR", "Change to dir before starting")                   { |dir| @options[:chdir] = File.expand_path(dir) }
+    opts.on(      "--stats PATH", "Mount the Stats adapter under PATH")             { |path| @options[:stats] = path }
+    
+    opts.separator ""
+    opts.separator "Adapter options:"
+    opts.on("-e", "--environment ENV", "Framework environment " +                       
+                                       "(default: #{@options[:environment]})")      { |env| @options[:environment] = env }
+    opts.on(      "--prefix PATH", "Mount the app under PATH (start with /)")       { |path| @options[:prefix] = path }
+    
+    opts.on("-l", "--log FILE", "File to redirect output " +                      
+                                "(default: #{@options[:log]})")                   { |file| @options[:log] = file }
+    opts.on("-P", "--pid FILE", "File to store PID " +                            
+                                "(default: #{@options[:pid]})")                   { |file| @options[:pid] = file }
+    opts.on("-C", "--config FILE", "Load options from config file")               { |file| @options[:config] = file }
+    
+    opts.separator ""
+    opts.separator "Common options:"
+
+    opts.on_tail("-r", "--require FILE", "require the library")                     { |file| @options[:require] << file }
+    opts.on_tail("-D", "--debug", "Set debbuging on")                               { @options[:debug] = true }
+    opts.on_tail("-V", "--trace", "Set tracing on (log raw request/response)")      { @options[:trace] = true }
+    opts.on_tail("-h", "--help", "Show this message")                               { puts opts; exit }
+    opts.on_tail('-v', '--version', "Show version")                                 { puts Aspen::SERVER; exit }
+  end
+end
+
+
+
+ +
+

+ + - (Object) run! + + + +

+
+

+Parse the current shell arguments and run the command. Exits on error. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+
+
# File 'lib/aspen/runner.rb', line 107
+
+def run!
+  if self.class.commands.include?(@command)
+    run_command
+  elsif @command.nil?
+    puts "Command required"
+    puts @parser
+    exit 1  
+  else
+    abort "Unknown command: #{@command}. Use one of #{self.class.commands.join(', ')}"
+  end
+end
+
+
+
+ +
+

+ + - (Object) run_command + + + +

+
+

+Send the command to the server. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+
+
# File 'lib/aspen/runner.rb', line 120
+
+def run_command
+  load_options_from_config_file! unless CONFIGLESS_COMMANDS.include?(@command)
+  
+  ##############
+  # Thin is shelling out sub-processes - this doesn't translate to JRuby, does it?
+  ##############
+  # PROGRAM_NAME is relative to the current directory, so make sure
+  # we store and expand it before changing directory.
+  # Command.script = File.expand_path($PROGRAM_NAME)
+  
+  # Change the current directory ASAP so that all relative paths are
+  # relative to this one.
+  Dir.chdir(@options[:chdir])
+  
+  @options[:require].each { |r| ruby_require r }
+  Logging.debug = @options[:debug]
+  Logging.trace = @options[:trace]
+  
+  server = Server.new(@options)
+  
+  if server.respond_to?(@command)
+    begin
+      server.send(@command, *@arguments)
+    rescue RunnerError => e
+      abort e.message
+    end
+  else
+    abort "Invalid options for command: #{@command}"
+  end
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/RunnerError.html b/doc/Aspen/RunnerError.html new file mode 100644 index 0000000..d754ccb --- /dev/null +++ b/doc/Aspen/RunnerError.html @@ -0,0 +1,103 @@ + + + + +Exception: Aspen::RunnerError + + + + + + + + + + + + + +

Exception: Aspen::RunnerError + + +

+ +
+ +
Inherits:
+
+ RuntimeError + +
    +
  • Object
  • + + + + + +
+ show all + +
+ + + + + + + + +
Defined in:
+
lib/aspen/runner.rb
+ +
+
+ +

Overview

+
+

+Error raised that will abort the process and print not backtrace. +

+ + +
+
+
+ +
+ + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/Server.html b/doc/Aspen/Server.html new file mode 100644 index 0000000..528b73e --- /dev/null +++ b/doc/Aspen/Server.html @@ -0,0 +1,903 @@ + + + + +Class: Aspen::Server + + + + + + + + + + + + + +

Class: Aspen::Server + + +

+ +
+ +
Inherits:
+
+ Object + +
+ + + + + + +
Includes:
+
Aspen::Logging
+ + + + +
Defined in:
+
lib/aspen/server.rb
+ +
+
+ +

Overview

+
+

+the Server is the launching point and core of Aspen. +

+

TCP Server

+

+It will listen for incoming requests on TCP sockets at host:port +by specifying host and port. +

+

Rack Application

+

+All requests will be processed through app that must be a valid +Rack adapter. A valid Rack adapter (application) must respond to +call(env#Hash) and return an array of [status, headers, +[body]]. +

+ + +
+
+
+

Author:

+ +

Since:

+ +

Version:

+ + +
+

Constant Summary

+ +
+ +
DEFAULT_HOST = + +default values. + + +
+
'0.0.0.0'
+
+ +
DEFAULT_PORT = + +
+
1169
+
+ +
+ + + + + + + +

Attribute Summary

+ + + +

Method Summary

+ + + + + + + + +

Methods included from Aspen::Logging

+

#debug, debug?, #log, #log_error, #silent=, silent?, #trace, trace?

+
+

Constructor Details

+ +
+

+ + - (Server) initialize(*args, &block) + + + +

+
+

+A new instance of Server +

+ + +
+
+
+

Returns:

+
    + +
  • + + (Server) + + + + + — + +a new instance of Server + + + +
  • + +
+

Raises:

+
    + +
  • + + (ArgumentError) + + + + +
  • + +
+ +
+ + + + +
+
+
+
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+
+
# File 'lib/aspen/server.rb', line 40
+
+def initialize(*args, &block)
+  host, port, options = DEFAULT_HOST, DEFAULT_PORT, {}
+  @app = nil
+  
+  # Guess each parameter by its type so they can be
+  # received in any order
+  args.each do |arg|
+    case arg
+    when Fixnum, /^\d+$/  then @port = arg.to_i
+    when String           then @host = arg
+    when Hash             then options = arg
+    else
+      @app = arg if arg.respond_to?(:call)
+    end
+  end
+  
+  # Allow using Rack builder as a block
+  @app = Rack::Builder.new(&block).to_app if block
+  
+  raise ArgumentError, 'app required' unless @app
+  
+  # If in debug mode, wrap in logger adapter
+  @app = Rack::CommonLogger.new(@app) if Logging.debug?
+
+  @proxy = NettyProxy.new(@app)
+  
+  @backend = AspenServer.new(@host,@port,@proxy)
+end
+
+
+
+ +
+ +
+

Attribute Details

+ + + + +
+

+ + - (Object) app + + + +

+
+

+Application (Rack adapter) called with the request that produces the +response. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+30
+31
+32
+
+
# File 'lib/aspen/server.rb', line 30
+
+def app
+  @app
+end
+
+
+
+ + + + +
+

+ + - (Object) host + + + +

+
+

+IP address of to bind sockets to, usually the address of the host, the +loopback address (127.0.0.1), or the ‘all’ binding address of +0.0.0.0 (which is the default). +

+ + +
+
+
+ +
+ + + + +
+
+
+
+35
+36
+37
+
+
# File 'lib/aspen/server.rb', line 35
+
+def host
+  @host
+end
+
+
+
+ + + + +
+

+ + - (Object) port + + + +

+
+

+port number for the server to listen on +

+ + +
+
+
+ +
+ + + + +
+
+
+
+38
+39
+40
+
+
# File 'lib/aspen/server.rb', line 38
+
+def port
+  @port
+end
+
+
+
+ +
+ + +
+

Method Details

+ +
+

+ + + (Object) start(*args, &block) + + + +

+
+

+Lil’ shortcut to turn this: +

+
+  Server.new(...).start
+
+

+into this: +

+
+  Server.start(...)
+
+ + +
+
+
+ +
+ + + + +
+
+
+
+77
+78
+79
+
+
# File 'lib/aspen/server.rb', line 77
+
+def self.start(*args, &block)
+  new(*args, &block).start!
+end
+
+
+
+ +
+

+ + - (Object) running? + + + +

+ + + + +
+
+
+
+95
+96
+97
+
+
# File 'lib/aspen/server.rb', line 95
+
+def running?
+  return @backend.is_running
+end
+
+
+
+ +
+

+ + - (Object) start + + + + Also known as: + start! + + +

+
+

+Start the server and listen for connections. +

+ + +
+
+
+

Raises:

+
    + +
  • + + (ArgumentError) + + + + +
  • + +
+ +
+ + + + +
+
+
+
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+
+
# File 'lib/aspen/server.rb', line 82
+
+def start
+  raise ArgumentError, 'app required' unless @app
+
+  log   ">> Aspen web server (#{::Aspen::SERVER})"
+  debug ">> Debugging ON"
+  trace ">> Tracing ON"
+
+  log ">> Listening on #{@host}:#{@port}, CTRL+C to stop"
+
+  @backend.start
+end
+
+
+
+ +
+

+ + - (Object) stop + + + +

+
+

Gracefull shutdown

+

+Stops the server after processing all current connections. As soon as this +method is called, the server stops accepting new requests and wait for all +current connections to finish. Calling twice is the equivalent of calling +stop!. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+
+
# File 'lib/aspen/server.rb', line 104
+
+def stop
+  if running?
+    @backend.stop
+    unless @backend.empty?
+      log ">> Waiting for #{@backend.size} connection(s) to finish, " +
+            "can take up to #{timeout} sec, CTRL+C to stop now"
+    end
+  else
+    stop!
+  end
+end
+
+
+
+ +
+

+ + - (Object) stop! + + + +

+
+

Force shutdown

+

+Stops the server closing all current connections right away. This +doesn’t wait for connection to finish their work and send data. All +current requests will be dropped. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+120
+121
+122
+123
+124
+
+
# File 'lib/aspen/server.rb', line 120
+
+def stop!
+  log ">> Stopping ..."
+
+  @backend.stop!
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Aspen/VERSION.html b/doc/Aspen/VERSION.html new file mode 100644 index 0000000..7f768ee --- /dev/null +++ b/doc/Aspen/VERSION.html @@ -0,0 +1,184 @@ + + + + +Module: Aspen::VERSION + + + + + + + + + + + + + +

Module: Aspen::VERSION + + +

+ +
+ + + + + + + +
Defined in:
+
lib/aspen/version.rb
+ +
+
+ +

Overview

+
+ + +
+
+
+

Author:

+ +

Since:

+ +

Version:

+ + +
+

Constant Summary

+ +
+ +
MAJOR = + +major version. + + +
+
1
+
+ +
MINOR = + +minor version. + + +
+
0
+
+ +
TINY = + +bugfix version. + + +
+
0
+
+ +
STRING = + +version digits joined as a string. + + +
+
[MAJOR, MINOR, TINY].join('.')
+
+ +
RACK = + +Rack protocol version. + + +
+
[1, 0].freeze
+
+ +
+ + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Rack.html b/doc/Rack.html new file mode 100644 index 0000000..900ef77 --- /dev/null +++ b/doc/Rack.html @@ -0,0 +1,138 @@ + + + + +Module: Rack + + + + + + + + + + + + + +

Module: Rack + + +

+ +
+ + + + + + + +
Defined in:
+
lib/rack/adapter/rails.rb,
+ lib/aspen.rb,
lib/rack/handler/aspen.rb,
lib/rack/adapter/loader.rb
+
+ +
+
+ +

Overview

+
+

+Adapter to run a Rails app with any supported Rack handler. By default it +will try to load the Rails application in the current directory in the +development environment. +

+

+Only rack-based Rails (2.2.3 or later) apps are supported. +

+

+Options: +

+
+ root: Root directory of the Rails app
+ environment: Rails environment to run in (development [default], production or test)
+ prefix: Set the relative URL root.
+
+

+Based on http://fuzed.rubyforge.org/ Rails adapter +

+ + +
+
+
+ +

Defined Under Namespace

+

+ + + Modules: Adapter, Handler + + + + Classes: AdapterNotFound + + +

+ +

Constant Summary

+ +
+ +
ADAPTERS = + +Mapping used to guess which adapter to use in Adapter.for. + + +
+
[
+  [:rails,   'config/environment.rb'],
+  [:ramaze,  'start.rb'],
+  [:halcyon, 'runner.ru'],
+  [:merb,    'config/init.rb'],
+  [:mack,    'config/app_config/default.yml'],
+  [:mack,    'config/configatron/default.rb'],
+  [:file,    nil]
+]
+
+ +
+ + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Rack/Adapter.html b/doc/Rack/Adapter.html new file mode 100644 index 0000000..a3f6056 --- /dev/null +++ b/doc/Rack/Adapter.html @@ -0,0 +1,317 @@ + + + + +Module: Rack::Adapter + + + + + + + + + + + + + +

Module: Rack::Adapter + + +

+ +
+ + + + + + + +
Defined in:
+
lib/aspen.rb,
+ lib/rack/adapter/rails.rb,
lib/rack/adapter/loader.rb
+
+ +
+
+ +

Defined Under Namespace

+

+ + + + + Classes: Rails + + +

+ + + +

Method Summary

+ + + + +
+

Method Details

+ +
+

+ + + (Object) for(name, options = {}) + + + +

+
+

+Loads an adapter identified by name using options hash. +

+ + +
+
+
+ +
+ + + + +
+
+
+
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+
+
# File 'lib/rack/adapter/loader.rb', line 33
+
+def self.for(name, options={})
+  case name.to_sym
+  when :rails
+    return Rack::Adapter::Rails.new(options.merge(:root => options[:chdir]))
+  
+  when :ramaze
+    require "#{options[:chdir]}/start"
+    
+    Ramaze.trait[:essentials].delete Ramaze::Adapter
+    Ramaze.start :force => true
+    
+    return Ramaze::Adapter::Base
+    
+  when :merb
+    require 'merb-core'
+    
+    Merb::Config.setup(:merb_root   => options[:chdir],
+                       :environment => options[:environment])
+    Merb.environment = Merb::Config[:environment]
+    Merb.root = Merb::Config[:merb_root]
+    Merb::BootLoader.run
+    
+    return Merb::Rack::Application.new
+    
+  when :halcyon
+    require 'halcyon'
+    
+    $:.unshift(Halcyon.root/'lib')
+    
+    return Halcyon::Runner.new
+    
+  when :mack
+    ENV["MACK_ENV"] = options[:environment]
+    load(::File.join(options[:chdir], "Rakefile"))
+    require 'mack'
+    return Mack::Utils::Server.build_app
+    
+  when :file
+    return Rack::File.new(options[:chdir])
+    
+  else
+    raise AdapterNotFound, "Adapter not found: #{name}"
+    
+  end
+end
+
+
+
+ +
+

+ + + (Object) guess(dir) + + + +

+
+

+Guess which adapter to use based on the directory structure or file +content. Returns a symbol representing the name of the adapter to use to +load the application under dir/. +

+ + +
+
+
+

Raises:

+ + +
+ + + + +
+
+
+
+25
+26
+27
+28
+29
+30
+
+
# File 'lib/rack/adapter/loader.rb', line 25
+
+def self.guess(dir)
+  ADAPTERS.each do |adapter, file|
+    return adapter if file && ::File.exist?(::File.join(dir, file))
+  end
+  raise AdapterNotFound, "No adapter found for #{dir}"
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Rack/Adapter/Rails.html b/doc/Rack/Adapter/Rails.html new file mode 100644 index 0000000..d99b9f2 --- /dev/null +++ b/doc/Rack/Adapter/Rails.html @@ -0,0 +1,437 @@ + + + + +Class: Rack::Adapter::Rails + + + + + + + + + + + + + +

Class: Rack::Adapter::Rails + + +

+ +
+ +
Inherits:
+
+ Object + +
+ + + + + + + + +
Defined in:
+
lib/rack/adapter/rails.rb
+ +
+
+ + +

Constant Summary

+ +
+ +
FILE_METHODS = + +
+
%w(GET HEAD).freeze
+
+ +
+ + + + +

Method Summary

+ + +
+

Constructor Details

+ +
+

+ + - (Rails) initialize(options = {}) + + + +

+
+

+A new instance of Rails +

+ + +
+
+
+

Returns:

+
    + +
  • + + (Rails) + + + + + — + +a new instance of Rails + + + +
  • + +
+

Raises:

+
    + +
  • + + (RuntimeError) + + + + +
  • + +
+ +
+ + + + +
+
+
+
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
+
# File 'lib/rack/adapter/rails.rb', line 18
+
+def initialize(options={})
+  @root   = options[:root]         || Dir.pwd
+  @env    = options[:environment]  || 'development'
+  @prefix = options[:prefix]
+
+  load_application
+
+  raise RuntimeError, "only Rack-based Rails apps are supported" unless rack_based?
+
+  @rails_app = ActionController::Dispatcher.new
+
+  @file_app = Rack::File.new(::File.join(RAILS_ROOT, "public"))
+end
+
+
+
+ +
+ + +
+

Method Details

+ +
+

+ + - (Object) call(env) + + + +

+ + + + +
+
+
+
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+
+
# File 'lib/rack/adapter/rails.rb', line 52
+
+def call(env)
+  path        = env['PATH_INFO'].chomp('/')
+  method      = env['REQUEST_METHOD']
+  cached_path = (path.empty? ? 'index' : path) + ActionController::Base.page_cache_extension
+
+  if FILE_METHODS.include?(method)
+    if file_exist?(path)              # Serve the file if it's there
+      return @file_app.call(env)
+    elsif file_exist?(cached_path)    # Serve the page cache if it's there
+      env['PATH_INFO'] = cached_path
+      return @file_app.call(env)
+    end
+  end
+
+  # No static file, let Rails handle it
+  @rails_app.call(env)
+end
+
+
+
+ +
+

+ + - (Object) file_exist?(path) + + + +

+ + + + +
+
+
+
+47
+48
+49
+50
+
+
# File 'lib/rack/adapter/rails.rb', line 47
+
+def file_exist?(path)
+  full_path = ::File.join(@file_app.root, Utils.unescape(path))
+  ::File.file?(full_path) && ::File.readable_real?(full_path)
+end
+
+
+
+ +
+

+ + - (Object) load_application + + + +

+ + + + +
+
+
+
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+
+
# File 'lib/rack/adapter/rails.rb', line 36
+
+def load_application
+  ENV['RAILS_ENV'] = @env
+
+  require "#{@root}/config/environment"
+  require 'dispatcher'
+
+#        if @prefix
+#          ActionController::AbstractRequest.relative_url_root = @prefix
+#        end
+end
+
+
+
+ +
+

+ + - (Object) rack_based? + + + +

+ + + + +
+
+
+
+32
+33
+34
+
+
# File 'lib/rack/adapter/rails.rb', line 32
+
+def rack_based?
+  ::Rails::VERSION::MAJOR >= 2 && ::Rails::VERSION::MINOR >= 2 && ::Rails::VERSION::TINY >= 3
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/Rack/AdapterNotFound.html b/doc/Rack/AdapterNotFound.html new file mode 100644 index 0000000..3c8da8c --- /dev/null +++ b/doc/Rack/AdapterNotFound.html @@ -0,0 +1,92 @@ + + + + +Exception: Rack::AdapterNotFound + + + + + + + + + + + + + +

Exception: Rack::AdapterNotFound + + +

+ +
+ +
Inherits:
+
+ RuntimeError + +
    +
  • Object
  • + + + + + +
+ show all + +
+ + + + + + + + +
Defined in:
+
lib/rack/adapter/loader.rb
+ +
+
+ + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Rack/Handler.html b/doc/Rack/Handler.html new file mode 100644 index 0000000..62d9923 --- /dev/null +++ b/doc/Rack/Handler.html @@ -0,0 +1,83 @@ + + + + +Module: Rack::Handler + + + + + + + + + + + + + +

Module: Rack::Handler + + +

+ +
+ + + + + + + +
Defined in:
+
lib/rack/handler/aspen.rb
+ +
+
+ +

Defined Under Namespace

+

+ + + + + Classes: Aspen + + +

+ + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/Rack/Handler/Aspen.html b/doc/Rack/Handler/Aspen.html new file mode 100644 index 0000000..5ac84d9 --- /dev/null +++ b/doc/Rack/Handler/Aspen.html @@ -0,0 +1,167 @@ + + + + +Class: Rack::Handler::Aspen + + + + + + + + + + + + + +

Class: Rack::Handler::Aspen + + +

+ +
+ +
Inherits:
+
+ Object + +
+ + + + + + + + +
Defined in:
+
lib/rack/handler/aspen.rb
+ +
+
+ + + + +

Method Summary

+ + + + +
+

Method Details

+ +
+

+ + + (Object) run(app, options = {}) + + + +

+
+ + +
+
+
+

Yields:

+
    + +
  • + + (server) + + + + +
  • + +
+ +
+ + + + +
+
+
+
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
+
# File 'lib/rack/handler/aspen.rb', line 7
+
+def self.run( app, options={} )
+  # TODO: this sucks, server doesn't handle Rack::URLMap
+  app = Rack::Chunked.new( Rack::ContentLength.new( app ) )
+  server = ::Aspen::Server.new( options[:Host] || '0.0.0.0',
+                                options[:Port] || 1169,
+                                app )
+  yield server if block_given?
+  server.start
+end
+
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/doc/_index.html b/doc/_index.html new file mode 100644 index 0000000..689c765 --- /dev/null +++ b/doc/_index.html @@ -0,0 +1,258 @@ + + + + +aspen-1.0.0 Documentation + + + + + + + + + + + + + +
+

aspen-1.0.0 Documentation

+

Alphabetic Index

+ + +

File Listing

+ + +
+ +

Namespace Listing A-Z

+ + + + + + + + +
+ + + + + + + + +
    +
  • H
  • + +
+ + + + + +
    +
  • L
  • +
      + +
    • + Logging + + (Aspen) + +
    • + +
    +
+ + + + + + + + +
+ + +
    +
  • S
  • +
      + +
    • + Server + + (Aspen) + +
    • + +
    +
+ + +
    +
  • V
  • +
      + +
    • + VERSION + + (Aspen) + +
    • + +
    +
+ +
+
+ + + + + \ No newline at end of file diff --git a/doc/class_list.html b/doc/class_list.html new file mode 100644 index 0000000..2b4e8ff --- /dev/null +++ b/doc/class_list.html @@ -0,0 +1,185 @@ + + + + + + + + + + + +

Namespace List

+ +
+ + + + diff --git a/doc/css/common.css b/doc/css/common.css new file mode 100644 index 0000000..cf25c45 --- /dev/null +++ b/doc/css/common.css @@ -0,0 +1 @@ +/* Override this file with custom rules */ \ No newline at end of file diff --git a/doc/css/full_list.css b/doc/css/full_list.css new file mode 100644 index 0000000..9cdc704 --- /dev/null +++ b/doc/css/full_list.css @@ -0,0 +1,23 @@ +body { + margin: 0; + font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; + font-size: 13px; + height: 101%; +} +html { overflow-y: scroll; } + +h1 { padding: 0; margin: 5px; margin-top: 12px; margin-left: 10px; margin-bottom: 0; font-size: 1.4em; } +.clear { clear: both; } +#search { position: absolute; right: 5px; top: 9px; } +#full_list { padding: 0; list-style: none; margin-left: 0; } +#full_list li { padding: 7px 15px; font-size: 1.1em; } +#noresults { display: none; padding: 7px 15px; } +li { color: #555; } +li.deprecated { text-decoration: line-through; font-style: italic; } +li.r1 { background: #f0f0f0; border: 1px dotted #f0f0f0; border-left-width: 0; border-right-width: 0; } +li.r2 { background: #fafafa; border: 1px dotted #fafafa; border-left-width: 0; border-right-width: 0; } +li:hover { background: #ffffa5; cursor: pointer; border: 1px dotted #ddddc4; border-left-width: 0; border-right-width: 0; } +li:hover * { position: relative; left: -3px; } +a:link, a:visited { text-decoration: none; color: #05a; } +a:hover { background: #ffffa5; } +#search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; } \ No newline at end of file diff --git a/doc/css/style.css b/doc/css/style.css new file mode 100644 index 0000000..6c462ad --- /dev/null +++ b/doc/css/style.css @@ -0,0 +1,261 @@ +body { + padding: 0 20px; + font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; + font-size: 13px; +} +h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; } +h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; } +h1.title { margin-bottom: 10px; } +h1.alphaindex { margin-top: 0; font-size: 22px; } +h2 { + padding: 0; + padding-bottom: 3px; + border-bottom: 1px #aaa solid; + font-size: 1.4em; + margin: 1.8em 0 0.5em; +} +.clear { clear: both; } +.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; } +.docstring h1 { font-size: 1.2em; } +.docstring h2 { font-size: 1.1em; } +.docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; } + +.note { + color: #222; + -moz-border-radius: 3px; -webkit-border-radius: 3px; + background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px; +} +.note.todo { background: #ffffc5; border-color: #ececaa; } +.note.deprecated { background: #ffe5e5; border-color: #e9dada; } +.note.title { text-transform: lowercase; padding: 1px 5px; margin-left: 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; } +h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; } +.note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; } +.note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; } +.note.title.private { background: #d5d5d5; border-color: #c5c5c5; } + +h3.inherited { + font-style: italic; + font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; + font-weight: normal; + padding: 0; + margin: 0; + margin-top: 12px; + margin-bottom: 3px; + font-size: 13px; +} +p.inherited { + padding: 0; + margin: 0; + margin-left: 25px; +} + +dl.box { + width: 520px; + font-size: 1em; +} +dl.box dt { + float: left; + display: block; + width: 100px; + margin: 0; + text-align: right; + font-weight: bold; + border: 1px solid #aaa; + border-width: 1px 0px 0px 1px; + padding: 6px 0; + padding-right: 10px; +} +dl.box dd { + float: left; + display: block; + width: 380px; + margin: 0; + padding: 6px 0; + padding-right: 20px; + border: 1px solid #aaa; + border-width: 1px 1px 0 0; +} +dl.box .last { + border-bottom: 1px solid #aaa; +} +dl.box .r1 { background: #eee; } + +ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; } +#files { padding-left: 15px; font-size: 1.1em; } + +#files { padding: 0; } +#files li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; } + +dl.constants { margin-left: 40px; } +dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; } +dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; } + +.summary_desc { margin-left: 32px; display: block; font-family: sans-serif; } +.summary_desc tt { font-size: 0.9em; } +dl.constants .summary_desc { font-size: 0.9em; font-weight: normal; } + +.method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; } +.method_details.first { border: 0; } +p.signature { + font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace; + padding: 6px 10px; margin-top: 18px; + background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px; +} +p.signature tt { font-family: Monaco, Consolas, Courier, monospace; } +p.signature .overload { display: block; } +p.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; } +p.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; } +p.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; } + +.tags h3 { font-size: 1em; margin-bottom: 0; } +.tags ul { margin-top: 5px; padding-left: 30px; list-style: square; } +.tags ul li { margin-bottom: 3px; } +.tags ul .name { font-family: monospace; font-weight: bold; } +.tags ul p { display: inline; margin-bottom: 5px; } +.tags { margin-bottom: 12px; } + +.tags .examples h3 { margin-bottom: 10px; } +.tags .examples h4 { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; } + +.tags .overload .overload_item { list-style: none; margin-bottom: 25px; } +.tags .overload .overload_item .signature { + padding: 2px 8px; + background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px; +} +.tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; } +.tags .overload .docstring { margin-top: 15px; } + +.defines { display: none; } + +#method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; } + +.showSource { font-size: 0.9em; } +.showSource a:link, .showSource a:visited { text-decoration: none; color: #666; } + +#content a:link, #content a:visited { text-decoration: none; color: #05a; } +#content a:hover { background: #ffffa5; } +.docstring { margin-right: 6em; } + +ul.summary { + list-style: none; + font-family: monospace; + font-size: 1em; + line-height: 1.5em; +} +ul.summary a:link, ul.summary a:visited { + text-decoration: none; font-size: 1.1em; +} +ul.summary li { margin-bottom: 5px; } +.summary .summary_signature { + padding: 1px 10px; + background: #eaeaff; border: 1px solid #dfdfe5; + -moz-border-radius: 3px; -webkit-border-radius: 3px; +} +.summary_signature:hover { background: #eeeeff; cursor: pointer; } +#content .summary_signature:hover a:link, +#content .summary_signature:hover a:visited { + background: transparent; + color: #48f; +} + +p.inherited a { font-family: monospace; font-size: 0.9em; } +p.inherited { word-spacing: 5px; font-size: 1.2em; } + +p.children { font-size: 1.2em; } +p.children a { font-size: 0.9em; } +p.children strong { font-size: 0.8em; } +p.children strong.modules { padding-left: 5px; } + +ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; } +ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; } +ul.fullTree li { text-align: center; } +ul.fullTree li.next:before { font-size: 1.2em; content: '⬆'; color: #bbb; display: block; margin-top: 3px; } + +#search { position: absolute; right: 14px; top: 0px; } +#search a:link, #search a:visited { + display: block; float: left; margin-right: 4px; + padding: 8px 10px; text-decoration: none; color: #05a; background: #eaeaff; + border: 1px solid #d8d8e5; + -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; +} +#search a:hover { background: #eef; color: #06b; } +#search a.active { + background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457; + -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; + -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px; +} +#search a.inactive { color: #999; } +.inheritanceTree, .toggleDefines { float: right; } + +#menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; } +#menu .title, #menu a { font-size: 0.7em; } +#menu .title { color: #555; } +#menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; } +#menu a:hover { color: #05a; } + +#footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; } +#footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; } +#footer a:hover { color: #05a; } + +#listing ul.alpha { font-size: 1.1em; } +#listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; } +#listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; } +#listing ul.alpha ul { margin: 0; padding: 0; } +#listing ul small { color: #666; font-size: 0.7em; } + +li.r1 { background: #f0f0f0; } +li.r2 { background: #fafafa; } + +#search_frame { + background: #fff; + display: none; + position: absolute; + top: 36px; + right: 18px; + width: 500px; + height: 80%; + overflow-y: scroll; + border: 1px solid #999; + border-collapse: collapse; + -webkit-box-shadow: -2px 5px 25px #aaa; + -moz-box-shadow: -2px 5px 25px #aaa; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +#content ul.summary li.deprecated a:link, +#content ul.summary li.deprecated a:visited { text-decoration: line-through; font-style: italic; } + +/* syntax highlighting */ +.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; } +#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; } +#filecontents pre.code, .docstring pre.code { display: block; } +.source_code .lines { padding-right: 12px; color: #555; text-align: right; } +#filecontents pre.code, .docstring pre.code, +.tags .example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; } +pre.code { color: #000; } +pre.code .info.file { color: #555; } +pre.code .val { color: #036A07; } +pre.code .tstring_content, +pre.code .heredoc_beg, pre.code .heredoc_end, +pre.code .qwords_beg, pre.code .qwords_end, +pre.code .tstring, pre.code .dstring { color: #036A07; } +pre.code .fid, pre.code .id.new, pre.code .id.to_s, +pre.code .id.to_sym, pre.code .id.to_f, +pre.code .dot + pre.code .id, +pre.code .id.to_i pre.code .id.each { color: #0085FF; } +pre.code .comment { color: #0066FF; } +pre.code .const, pre.code .constant { color: #585CF6; } +pre.code .symbol { color: #C5060B; } +pre.code .kw, +pre.code .label, +pre.code .id.require, +pre.code .id.extend, +pre.code .id.include { color: #0000FF; } +pre.code .ivar { color: #318495; } +pre.code .gvar, +pre.code .id.backref, +pre.code .id.nth_ref { color: #6D79DE; } +pre.code .regexp, .dregexp { color: #036A07; } + diff --git a/doc/file.README.html b/doc/file.README.html new file mode 100644 index 0000000..2ba1874 --- /dev/null +++ b/doc/file.README.html @@ -0,0 +1,145 @@ + + + + +aspen-1.0.0 Documentation + + + + + + + + + + + + + +

+aspen +

+
+    by Kevin Williams
+    http://kevwil.github.com/aspen/
+
+

DESCRIPTION:

+

+Aspen is a web server engine for JRuby. The design is very similar to Thin +(http://code.macournoyer.com/thin/), except using Netty +(http://www.jboss.org/netty) for high-speed concurrent sockets. +

+

FEATURES/PROBLEMS:

+ +

SYNOPSIS:

+
+  FIXME (code sample of usage)
+
+

REQUIREMENTS:

+ +

INSTALL:

+
+        # From Gemcutter / Rubyforge ...
+        $ (sudo) jruby -S gem install aspen
+
+

INSTALL FROM SOURCE:

+
+    # get source from Github
+    $ git clone git://github.com/kevwil/aspen.git
+    $ cd aspen
+
+    # You must have JRuby set up, with the dependent gems installed.
+    # see the Rakefile for the dev-time dependencies
+    $ jgem install little-plugger loquacious rubyforge bones bones-git bones-extras rspec mocha rcov
+
+    # You must have Ant (http://ant.apache.org) and Maven (http://maven.apache.org) set up.
+    # *note* the Rakefile will call Maven in "offline mode".
+    # If you get any errors about unresolved dependencies, do this:
+    $ cd javalib
+    $ mvn dependency:go-offline (or 'mvn package')
+
+    # Now you can build and test Aspen
+    $ jruby -S rake
+
+    # Install the gem
+    $ jruby -S rake gem:install
+
+

LICENSE:

+

+(The MIT License) +

+

+Copyright © 2009 Kevin Williams +

+

+Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +‘Software’), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the +following conditions: +

+

+The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +

+

+THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +

+
+ + + + + \ No newline at end of file diff --git a/doc/file_list.html b/doc/file_list.html new file mode 100644 index 0000000..8e54218 --- /dev/null +++ b/doc/file_list.html @@ -0,0 +1,29 @@ + + + + + + + + + + + +

File List

+ +
+ + + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..2ba1874 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,145 @@ + + + + +aspen-1.0.0 Documentation + + + + + + + + + + + + + +

+aspen +

+
+    by Kevin Williams
+    http://kevwil.github.com/aspen/
+
+

DESCRIPTION:

+

+Aspen is a web server engine for JRuby. The design is very similar to Thin +(http://code.macournoyer.com/thin/), except using Netty +(http://www.jboss.org/netty) for high-speed concurrent sockets. +

+

FEATURES/PROBLEMS:

+ +

SYNOPSIS:

+
+  FIXME (code sample of usage)
+
+

REQUIREMENTS:

+ +

INSTALL:

+
+        # From Gemcutter / Rubyforge ...
+        $ (sudo) jruby -S gem install aspen
+
+

INSTALL FROM SOURCE:

+
+    # get source from Github
+    $ git clone git://github.com/kevwil/aspen.git
+    $ cd aspen
+
+    # You must have JRuby set up, with the dependent gems installed.
+    # see the Rakefile for the dev-time dependencies
+    $ jgem install little-plugger loquacious rubyforge bones bones-git bones-extras rspec mocha rcov
+
+    # You must have Ant (http://ant.apache.org) and Maven (http://maven.apache.org) set up.
+    # *note* the Rakefile will call Maven in "offline mode".
+    # If you get any errors about unresolved dependencies, do this:
+    $ cd javalib
+    $ mvn dependency:go-offline (or 'mvn package')
+
+    # Now you can build and test Aspen
+    $ jruby -S rake
+
+    # Install the gem
+    $ jruby -S rake gem:install
+
+

LICENSE:

+

+(The MIT License) +

+

+Copyright © 2009 Kevin Williams +

+

+Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +‘Software’), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the +following conditions: +

+

+The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +

+

+THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +

+
+ + + + + \ No newline at end of file diff --git a/doc/js/app.js b/doc/js/app.js new file mode 100644 index 0000000..7ba44a1 --- /dev/null +++ b/doc/js/app.js @@ -0,0 +1,91 @@ +function createSourceLinks() { + $('#method_details .source_code, #constructor_details .source_code, #method_missing_details .source_code'). + before("[View source]"); + $('.toggleSource').toggle(function() { + $(this).parent().next().slideDown(100); + $(this).text("Hide source"); + }, + function() { + $(this).parent().next().slideUp(100); + $(this).text("View source"); + }); +} + +function createDefineLinks() { + var tHeight = 0; + $('.defines').after(" more..."); + $('.toggleDefines').toggle(function() { + tHeight = $(this).parent().prev().height(); + $(this).prev().show(); + $(this).parent().prev().height($(this).parent().height()); + $(this).text("(less)"); + }, + function() { + $(this).prev().hide(); + $(this).parent().prev().height(tHeight); + $(this).text("more...") + }); +} + +function createFullTreeLinks() { + var tHeight = 0; + $('.inheritanceTree').toggle(function() { + tHeight = $(this).parent().prev().height(); + $(this).prev().prev().hide(); + $(this).prev().show(); + $(this).text("(hide)"); + $(this).parent().prev().height($(this).parent().height()); + }, + function() { + $(this).prev().prev().show(); + $(this).prev().hide(); + $(this).parent().prev().height(tHeight); + $(this).text("show all") + }); +} + +function fixBoxInfoHeights() { + $('dl.box dd.r1, dl.box dd.r2').each(function() { + $(this).prev().height($(this).height()); + }); +} + +function searchFrameLinks() { + $('#method_list_link').click(function() { + toggleSearchFrame(this, relpath + 'method_list.html'); + }); + + $('#class_list_link').click(function() { + toggleSearchFrame(this, relpath + 'class_list.html'); + }); + + $('#file_list_link').click(function() { + toggleSearchFrame(this, relpath + 'file_list.html'); + }); +} + +function toggleSearchFrame(id, link) { + var frame = $('#search_frame'); + $('#search a').removeClass('active').addClass('inactive'); + if (frame.attr('src') == link && frame.css('display') != "none") { + frame.slideUp(100); + $('#search a').removeClass('active inactive'); + } + else { + $(id).addClass('active').removeClass('inactive'); + frame.attr('src', link).slideDown(100); + } +} + +function linkSummaries() { + $('.summary_signature').click(function() { + window.parent.location = $(this).find('a').attr('href'); + }); +} + +$(createSourceLinks); +$(createDefineLinks); +$(createFullTreeLinks); +$(fixBoxInfoHeights); +$(searchFrameLinks); +$(linkSummaries); \ No newline at end of file diff --git a/doc/js/full_list.js b/doc/js/full_list.js new file mode 100644 index 0000000..eb272ae --- /dev/null +++ b/doc/js/full_list.js @@ -0,0 +1,39 @@ +function fullListSearch() { + $('#search input').keyup(function() { + var value = this.value.toLowerCase(); + if (value == "") { + $('#full_list li').show(); + } + else { + $('#full_list li').each(function() { + if ($(this).children('a').text().toLowerCase().indexOf(value) == -1) { + $(this).hide(); + } + else { + $(this).show(); + } + }); + } + $('#full_list li:even:visible').removeClass('r2').addClass('r1'); + $('#full_list li:odd:visible').removeClass('r1').addClass('r2'); + + if ($('#full_list li:visible').size() == 0) { + $('#noresults').fadeIn(); + } + else { + $('#noresults').hide(); + } + }); + + $('#search input').focus(); + $('#full_list').after("
No results were found.
") +} + +function linkList() { + $('#full_list li').click(function() { + window.parent.location = $(this).find('a').attr('href'); + }); +} + +$(fullListSearch); +$(linkList); \ No newline at end of file diff --git a/doc/js/jquery.js b/doc/js/jquery.js new file mode 100644 index 0000000..b1ae21d --- /dev/null +++ b/doc/js/jquery.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/doc/method_list.html b/doc/method_list.html new file mode 100644 index 0000000..4243176 --- /dev/null +++ b/doc/method_list.html @@ -0,0 +1,372 @@ + + + + + + + + + + + +

Method List

+ +
+
    + + +
  • + + #call + + (Rack::Adapter::Rails) + + + +
  • + +
  • + + commands + + (Aspen::Runner) + + + +
  • + +
  • + + #config + + (Aspen::Controller) + + + +
  • + +
  • + + #debug + + (Aspen::Logging) + + + +
  • + +
  • + + debug? + + (Aspen::Logging) + + + +
  • + +
  • + + #file_exist? + + (Rack::Adapter::Rails) + + + +
  • + +
  • + + for + + (Rack::Adapter) + + + +
  • + +
  • + + guess + + (Rack::Adapter) + + + +
  • + +
  • + + #initialize + + (Aspen::Runner) + + + +
  • + +
  • + + #initialize + + (Aspen::Server) + + + +
  • + +
  • + + #initialize + + (Aspen::Controller) + + + +
  • + +
  • + + #initialize + + (Aspen::NettyProxy) + + + +
  • + +
  • + + #initialize + + (Rack::Adapter::Rails) + + + +
  • + +
  • + + #load_application + + (Rack::Adapter::Rails) + + + +
  • + +
  • + + #log + + (Aspen::Logging) + + + +
  • + +
  • + + #log_error + + (Aspen::Logging) + + + +
  • + +
  • + + #parse! + + (Aspen::Runner) + + + +
  • + +
  • + + #parser + + (Aspen::Runner) + + + +
  • + +
  • + + #process + + (Aspen::NettyProxy) + + + +
  • + +
  • + + #rack_based? + + (Rack::Adapter::Rails) + + + +
  • + +
  • + + #restart + + (Aspen::Controller) + + + +
  • + +
  • + + run + + (Rack::Handler::Aspen) + + + +
  • + +
  • + + #run! + + (Aspen::Runner) + + + +
  • + +
  • + + #run_command + + (Aspen::Runner) + + + +
  • + +
  • + + #running? + + (Aspen::Server) + + + +
  • + +
  • + + #silent= + + (Aspen::Logging) + + + +
  • + +
  • + + silent? + + (Aspen::Logging) + + + +
  • + +
  • + + start + + (Aspen::Server) + + + +
  • + +
  • + + #start + + (Aspen::Server) + + + +
  • + +
  • + + #start + + (Aspen::Controller) + + + +
  • + +
  • + + #stop + + (Aspen::Server) + + + +
  • + +
  • + + #stop + + (Aspen::Controller) + + + +
  • + +
  • + + #stop! + + (Aspen::Server) + + + +
  • + +
  • + + #trace + + (Aspen::Logging) + + + +
  • + +
  • + + trace? + + (Aspen::Logging) + + + +
  • + +
+ + + diff --git a/doc/top-level-namespace.html b/doc/top-level-namespace.html new file mode 100644 index 0000000..ea5ab79 --- /dev/null +++ b/doc/top-level-namespace.html @@ -0,0 +1,80 @@ + + + + +Top Level Namespace + + + + + + + + + + + + + +

Top Level Namespace + + +

+ +
+ + + + + + + +
+
+ +

Defined Under Namespace

+

+ + + Modules: Aspen, Rack + + + + +

+ + + + + +
+ + + + + \ No newline at end of file