waves 0.8.2 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/waves +4 -3
- data/doc/VERSION +1 -1
- data/lib/waves.rb +52 -40
- data/lib/{caches → waves/caches}/file.rb +3 -1
- data/lib/waves/caches/memcached.rb +56 -0
- data/lib/{caches → waves/caches}/simple.rb +6 -7
- data/lib/{caches → waves/caches}/synchronized.rb +15 -1
- data/lib/{commands → waves/commands}/console.rb +4 -4
- data/lib/{commands → waves/commands}/generate.rb +6 -5
- data/lib/{commands → waves/commands}/help.rb +0 -0
- data/lib/{commands → waves/commands}/server.rb +1 -1
- data/lib/{dispatchers → waves/dispatchers}/base.rb +17 -31
- data/lib/waves/dispatchers/default.rb +19 -0
- data/lib/{ext → waves/ext}/float.rb +0 -0
- data/lib/{ext → waves/ext}/hash.rb +0 -0
- data/lib/{ext → waves/ext}/integer.rb +16 -1
- data/lib/{ext → waves/ext}/kernel.rb +3 -7
- data/lib/{ext → waves/ext}/module.rb +3 -3
- data/lib/{ext → waves/ext}/object.rb +2 -0
- data/lib/waves/ext/string.rb +73 -0
- data/lib/{ext → waves/ext}/symbol.rb +0 -1
- data/lib/{ext → waves/ext}/tempfile.rb +0 -0
- data/lib/waves/ext/time.rb +5 -0
- data/lib/{foundations → waves/foundations}/classic.rb +9 -21
- data/lib/{foundations → waves/foundations}/compact.rb +15 -20
- data/lib/waves/foundations/rest.rb +311 -0
- data/lib/waves/helpers/basic.rb +13 -0
- data/lib/{helpers → waves/helpers}/doc_type.rb +3 -0
- data/lib/waves/helpers/form.rb +94 -0
- data/lib/waves/helpers/formatting.rb +14 -0
- data/lib/waves/layers/mvc.rb +65 -0
- data/lib/{layers → waves/layers}/mvc/controllers.rb +0 -0
- data/lib/{layers → waves/layers}/mvc/extensions.rb +23 -11
- data/lib/{layers → waves/layers}/orm/migration.rb +0 -0
- data/lib/{layers → waves/layers}/orm/providers/active_record.rb +2 -5
- data/lib/{layers → waves/layers}/orm/providers/active_record/migrations/empty.rb.erb +0 -0
- data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/generate.rb +1 -1
- data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/schema.rb +1 -1
- data/lib/{layers → waves/layers}/orm/providers/data_mapper.rb +0 -0
- data/lib/{layers → waves/layers}/orm/providers/filebase.rb +0 -0
- data/lib/{layers → waves/layers}/orm/providers/sequel.rb +28 -29
- data/lib/{layers → waves/layers}/orm/providers/sequel/migrations/empty.rb.erb +0 -0
- data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/generate.rb +1 -1
- data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/schema.rb +2 -0
- data/lib/waves/layers/rack/rack_cache.rb +32 -0
- data/lib/waves/layers/renderers/erubis.rb +52 -0
- data/lib/waves/layers/renderers/haml.rb +67 -0
- data/lib/waves/layers/renderers/markaby.rb +41 -0
- data/lib/waves/layers/text/inflect/english.rb +42 -0
- data/lib/waves/matchers/accept.rb +47 -0
- data/lib/waves/matchers/ext.rb +27 -0
- data/lib/waves/matchers/path.rb +72 -0
- data/lib/waves/matchers/query.rb +43 -0
- data/lib/waves/matchers/request.rb +86 -0
- data/lib/waves/matchers/requested.rb +31 -0
- data/lib/{matchers → waves/matchers}/resource.rb +8 -1
- data/lib/waves/matchers/traits.rb +30 -0
- data/lib/waves/matchers/uri.rb +69 -0
- data/lib/waves/media/mime_types.rb +542 -0
- data/lib/waves/renderers/mixin.rb +9 -0
- data/lib/waves/request/accept.rb +92 -0
- data/lib/{runtime → waves/request}/request.rb +77 -61
- data/lib/waves/resources/file_mixin.rb +11 -0
- data/lib/{resources → waves/resources}/mixin.rb +42 -44
- data/lib/waves/resources/paths.rb +132 -0
- data/lib/waves/response/client_errors.rb +10 -0
- data/lib/waves/response/packaged.rb +19 -0
- data/lib/waves/response/redirects.rb +35 -0
- data/lib/{runtime → waves/response}/response.rb +29 -11
- data/lib/{runtime → waves/response}/response_mixin.rb +30 -17
- data/lib/waves/runtime/applications.rb +18 -0
- data/lib/{runtime → waves/runtime}/configuration.rb +31 -25
- data/lib/waves/runtime/console.rb +24 -0
- data/lib/{runtime → waves/runtime}/logger.rb +3 -3
- data/lib/{runtime → waves/runtime}/mocks.rb +2 -2
- data/lib/waves/runtime/rackup.rb +37 -0
- data/lib/waves/runtime/runtime.rb +48 -0
- data/lib/waves/runtime/server.rb +33 -0
- data/lib/{servers → waves/servers}/base.rb +0 -0
- data/lib/{servers → waves/servers}/mongrel.rb +0 -0
- data/lib/{servers → waves/servers}/webrick.rb +0 -0
- data/lib/{tasks → waves/tasks}/gem.rb +0 -0
- data/lib/{tasks → waves/tasks}/generate.rb +0 -0
- data/lib/waves/views/cassy.rb +173 -0
- data/lib/{views → waves/views}/errors.rb +8 -7
- data/lib/waves/views/mixin.rb +23 -0
- data/lib/waves/views/templated.rb +40 -0
- data/samples/basic/basic_startup.rb +70 -0
- data/samples/basic/config.ru +9 -0
- data/samples/blog/configurations/development.rb +17 -16
- data/samples/blog/configurations/production.rb +0 -11
- data/samples/blog/resources/entry.rb +3 -3
- data/samples/blog/resources/map.rb +10 -3
- data/samples/blog/startup.rb +4 -3
- data/templates/classic/Rakefile +28 -29
- data/templates/classic/configurations/default.rb.erb +8 -3
- data/templates/classic/configurations/development.rb.erb +1 -20
- data/templates/classic/configurations/production.rb.erb +2 -16
- data/templates/classic/public/images/favicon.ico +0 -0
- data/templates/classic/resources/server.rb.erb +9 -0
- data/templates/classic/startup.rb.erb +3 -3
- data/templates/classic/views/css.rb.erb +14 -0
- data/templates/classic/views/default.rb.erb +17 -0
- data/templates/classic/views/errors.rb.erb +10 -0
- data/templates/classic/views/pages.rb.erb +14 -0
- data/templates/compact/startup.rb.erb +8 -3
- data/test/ext/object.rb +55 -0
- data/test/ext/shortcuts.rb +73 -0
- data/test/helpers.rb +17 -0
- data/test/match/accept.rb +78 -0
- data/test/match/ext.rb +156 -0
- data/test/match/methods.rb +22 -0
- data/test/match/params.rb +33 -0
- data/test/match/path.rb +106 -0
- data/test/match/query.rb +60 -0
- data/test/match/request.rb +91 -0
- data/test/match/requested.rb +149 -0
- data/test/match/uri.rb +136 -0
- data/test/process/request.rb +75 -0
- data/test/process/resource.rb +53 -0
- data/test/resources/path.rb +166 -0
- data/test/runtime/configurations.rb +19 -0
- data/test/runtime/request.rb +63 -0
- data/test/runtime/response.rb +85 -0
- data/test/views/views.rb +40 -0
- metadata +243 -157
- data/lib/caches/memcached.rb +0 -40
- data/lib/dispatchers/default.rb +0 -25
- data/lib/ext/string.rb +0 -20
- data/lib/helpers/basic.rb +0 -11
- data/lib/helpers/extended.rb +0 -21
- data/lib/helpers/form.rb +0 -42
- data/lib/helpers/formatting.rb +0 -30
- data/lib/helpers/layouts.rb +0 -37
- data/lib/helpers/model.rb +0 -37
- data/lib/helpers/view.rb +0 -22
- data/lib/layers/inflect/english.rb +0 -67
- data/lib/layers/mvc.rb +0 -54
- data/lib/layers/renderers/erubis.rb +0 -60
- data/lib/layers/renderers/haml.rb +0 -47
- data/lib/layers/renderers/markaby.rb +0 -29
- data/lib/matchers/accept.rb +0 -21
- data/lib/matchers/base.rb +0 -30
- data/lib/matchers/content_type.rb +0 -17
- data/lib/matchers/path.rb +0 -67
- data/lib/matchers/query.rb +0 -21
- data/lib/matchers/request.rb +0 -27
- data/lib/matchers/traits.rb +0 -19
- data/lib/matchers/uri.rb +0 -20
- data/lib/renderers/mixin.rb +0 -36
- data/lib/resources/paths.rb +0 -34
- data/lib/runtime/console.rb +0 -23
- data/lib/runtime/mime_types.rb +0 -536
- data/lib/runtime/monitor.rb +0 -32
- data/lib/runtime/runtime.rb +0 -67
- data/lib/runtime/server.rb +0 -20
- data/lib/runtime/session.rb +0 -27
- data/lib/runtime/worker.rb +0 -86
- data/lib/views/mixin.rb +0 -62
- data/samples/blog/blog.db +0 -0
- data/samples/blog/log/waves.production +0 -3
- data/templates/classic/resources/map.rb.erb +0 -8
- data/templates/classic/templates/errors/not_found_404.mab +0 -7
- data/templates/classic/templates/errors/server_error_500.mab +0 -7
- data/templates/classic/templates/layouts/default.mab +0 -14
- data/templates/classic/tmp/sessions/.gitignore +0 -0
data/lib/runtime/monitor.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
class Monitor
|
4
|
-
|
5
|
-
def initialize( options ) ; @options = options ; end
|
6
|
-
|
7
|
-
def start( manager )
|
8
|
-
@manager = manager
|
9
|
-
@pid = fork do
|
10
|
-
safe_trap('INT','TERM') do
|
11
|
-
Waves::Logger.info "Monitor stopped ..."
|
12
|
-
exit
|
13
|
-
end
|
14
|
-
loop { fix unless check ; sleep interval }
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def fix
|
19
|
-
@manager.restart
|
20
|
-
end
|
21
|
-
|
22
|
-
# you need to implement this
|
23
|
-
def check ; true ; end
|
24
|
-
|
25
|
-
# defaults to every 60 seconds
|
26
|
-
def interval ; @options[ :interval ] ; end
|
27
|
-
|
28
|
-
def stop ; Process.kill( 'INT', @pid ) ; end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
data/lib/runtime/runtime.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
# A temporary measure until the applications "array" becomes a hash.
|
4
|
-
# Currently used to keep track of all loaded Waves applications.
|
5
|
-
class Applications < Array
|
6
|
-
def []( name ) ; self.find { |app| app == name.to_s.camel_case } ; end
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.config; instance.config ; end
|
10
|
-
|
11
|
-
# The list of all loaded applications
|
12
|
-
def self.applications ; @applications ||= Applications.new ; end
|
13
|
-
|
14
|
-
# Access the principal Waves application.
|
15
|
-
def self.main ; applications.first ; end
|
16
|
-
|
17
|
-
# Register a module as a Waves application.
|
18
|
-
def self.<< ( app )
|
19
|
-
applications << app if Module === app
|
20
|
-
end
|
21
|
-
|
22
|
-
# Returns the most recently created instance of Waves::Runtime.
|
23
|
-
def self.instance ; Waves::Runtime.instance ; end
|
24
|
-
|
25
|
-
def self.version ; File.read( File.expand_path( "#{File.dirname(__FILE__)}/../../doc/VERSION" ) ) ; end
|
26
|
-
def self.license ; File.read( File.expand_path( "#{File.dirname(__FILE__)}/../../doc/LICENSE" ) ) ; end
|
27
|
-
|
28
|
-
def self.method_missing(name,*args,&block) ; instance.send(name,*args,&block) ; end
|
29
|
-
|
30
|
-
# A Waves::Runtime takes an inert application module and gives it concrete, pokeable form.
|
31
|
-
# Waves::Server and Waves::Console are types of runtime.
|
32
|
-
class Runtime
|
33
|
-
|
34
|
-
class << self; attr_accessor :instance; end
|
35
|
-
|
36
|
-
# Accessor for options passed to the runtime.
|
37
|
-
attr_reader :options
|
38
|
-
|
39
|
-
# Create a new Waves application instance.
|
40
|
-
def initialize( options={} )
|
41
|
-
@options = options
|
42
|
-
Dir.chdir options[:directory] if options[:directory]
|
43
|
-
Runtime.instance = self
|
44
|
-
end
|
45
|
-
|
46
|
-
# The 'mode' of the runtime determines which configuration it will run under.
|
47
|
-
def mode ; options[:mode]||:development ; end
|
48
|
-
|
49
|
-
# Returns true if debug was set to true in the current configuration.
|
50
|
-
def debug? ; options[:debugger] or config.debug ; end
|
51
|
-
|
52
|
-
# Returns the current configuration.
|
53
|
-
def config ; Waves.main::Configurations[ mode ] ; end
|
54
|
-
|
55
|
-
# Reload the modules specified in the current configuration.
|
56
|
-
def reload ; config.reloadable.each { |mod| mod.reload } ; end
|
57
|
-
|
58
|
-
# Start and / or access the Waves::Logger instance.
|
59
|
-
def log ; @log ||= Waves::Logger.start ; end
|
60
|
-
|
61
|
-
# Provides access to the server mutex for thread-safe operation.
|
62
|
-
def synchronize( &block ) ; ( @mutex ||= Mutex.new ).synchronize( &block ) ; end
|
63
|
-
def synchronize? ; !options[ :turbo ] ; end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
data/lib/runtime/server.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
class Server < Worker
|
4
|
-
|
5
|
-
def start_tasks
|
6
|
-
@server = config.server.new( application, host, port )
|
7
|
-
@server.start
|
8
|
-
end
|
9
|
-
|
10
|
-
def stop_tasks ; @server.stop ; end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def application ; @app ||= config.application.to_app ; end
|
15
|
-
def port ; @port ||= options[:port] or config.port ; end
|
16
|
-
def host ; @host ||= options[:host] or config.host ; end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
data/lib/runtime/session.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
# Encapsulates the session associated with a given request. A session has an expiration
|
4
|
-
# and path, which must be provided in a Waves::Configuration. Sensible defaults are defined
|
5
|
-
# in Waves::Configurations::Default
|
6
|
-
|
7
|
-
class Session
|
8
|
-
|
9
|
-
# Create a new session object using the given request. This is not necessarily the
|
10
|
-
# same as constructing a new session. See Rack::Sesssion for more info.
|
11
|
-
def initialize( request )
|
12
|
-
@data = request.rack_request.env['rack.session']
|
13
|
-
end
|
14
|
-
|
15
|
-
# Return the session data as a hash
|
16
|
-
def to_hash ; @data ; end
|
17
|
-
|
18
|
-
# Access a given data element of the session using the given key.
|
19
|
-
def [](key) ; @data[key] ; end
|
20
|
-
# Set the given data element of the session using the given key and value.
|
21
|
-
def []=(key,val) ; @data[key] = val ; end
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
data/lib/runtime/worker.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'drb'
|
2
|
-
module Waves
|
3
|
-
|
4
|
-
# "Workers" are just dedicated processes. Managers, Servers, and Monitors are all
|
5
|
-
# examples of Workers. This class just encapsulates the common features across all
|
6
|
-
# Workers: daemonization, signal traps, console support, logging, only-ness, etc.
|
7
|
-
|
8
|
-
class Worker < Runtime
|
9
|
-
|
10
|
-
def self.run( options )
|
11
|
-
@instance ||= new( options )
|
12
|
-
Kernel.load( options[:startup] || 'startup.rb' )
|
13
|
-
@instance.start
|
14
|
-
end
|
15
|
-
|
16
|
-
# make this the one-and-only
|
17
|
-
def self.instance ; @instance ; end
|
18
|
-
class << self ; private :new, :allocate ; end
|
19
|
-
private :dup, :clone
|
20
|
-
|
21
|
-
# returns the PID of the new process
|
22
|
-
def start
|
23
|
-
pid = daemonize if options[ :daemon ]
|
24
|
-
return pid if pid
|
25
|
-
# from here on in, we're in the daemon
|
26
|
-
start_logger ; Waves::Logger.info "#{self.class} starting ..."
|
27
|
-
start_debugger if debug? unless Kernel.engine == 'jruby'
|
28
|
-
# various ways to talk to a worker
|
29
|
-
set_traps ; start_console ; start_drb
|
30
|
-
start_tasks.join
|
31
|
-
end
|
32
|
-
|
33
|
-
def stop
|
34
|
-
Waves::Logger.info "#{self.class} shutting down ..."
|
35
|
-
@console.stop if @console
|
36
|
-
stop_tasks
|
37
|
-
end
|
38
|
-
|
39
|
-
def restart ; stop ; start ; end
|
40
|
-
|
41
|
-
def daemonize
|
42
|
-
pwd = Dir.pwd ; pid = fork ; return pid if pid ; Dir.chdir( pwd )
|
43
|
-
File.umask 0000 ; STDIN.reopen( '/dev/null') ;
|
44
|
-
STDOUT.reopen( '/dev/null', 'a' ) ; STDERR.reopen( STDOUT )
|
45
|
-
nil # return nil for child process, just like fork does
|
46
|
-
end
|
47
|
-
|
48
|
-
def set_traps
|
49
|
-
safe_trap( 'HUP' ) { restart }
|
50
|
-
safe_trap( 'TERM','INT' ) { stop }
|
51
|
-
end
|
52
|
-
|
53
|
-
def start_logger
|
54
|
-
Waves::Logger.start
|
55
|
-
Waves::Logger.info "Logger started."
|
56
|
-
end
|
57
|
-
|
58
|
-
def start_console
|
59
|
-
if config.console
|
60
|
-
@console = config.console ; @console.start
|
61
|
-
Waves::Logger.info "Console started on port #{config.console.port}"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def start_debugger
|
66
|
-
require 'ruby-debug' ; Debugger.start
|
67
|
-
Debugger.settings[:autoeval] = true if Debugger.respond_to?(:settings)
|
68
|
-
Waves::Logger.info "ruby-debug enabled"
|
69
|
-
end
|
70
|
-
|
71
|
-
protected
|
72
|
-
|
73
|
-
# workers should override these methods
|
74
|
-
def start_tasks
|
75
|
-
end
|
76
|
-
|
77
|
-
def stop_tasks
|
78
|
-
end
|
79
|
-
|
80
|
-
# for management, monitoring
|
81
|
-
def start_drb
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
data/lib/views/mixin.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
module Waves
|
2
|
-
|
3
|
-
module Views
|
4
|
-
|
5
|
-
# A class method that returns the known Renderers, which is any module that is defined within Waves::Renderers and includes the Renderers::Mixin.
|
6
|
-
# You can define new Renderers simply be reopening Waves::Renderers and defining a module that mixes in Renderers::Mixin.
|
7
|
-
def self.renderers ; @renderers ||= [] ; end
|
8
|
-
|
9
|
-
def self.renderer_for(path)
|
10
|
-
@renderers.find do |renderer|
|
11
|
-
File.extname( path ) == ".#{renderer::Extension}" or File.exists?( renderer.filename( path ) )
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.render( path, assigns = {} )
|
16
|
-
template = Views.renderer_for(path)
|
17
|
-
raise NoTemplateError.new( path ) if template.nil?
|
18
|
-
template.render( path, assigns )
|
19
|
-
end
|
20
|
-
|
21
|
-
class NoTemplateError < Exception # :nodoc:
|
22
|
-
end
|
23
|
-
|
24
|
-
# The View mixin simply sets up the machinery for invoking a template, along with methods for accessing
|
25
|
-
# the request assigns and the standard interface for invoking a view method.
|
26
|
-
module Mixin
|
27
|
-
|
28
|
-
attr_reader :request
|
29
|
-
|
30
|
-
include Waves::ResponseMixin
|
31
|
-
|
32
|
-
def self.included( target )
|
33
|
-
def target.process( request, *args, &block )
|
34
|
-
self.new( request ).instance_exec( *args, &block )
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def initialize( request ) ; @request = request ; @layout = :default ; end
|
39
|
-
|
40
|
-
# Return the first renderer for which a template file can be found.
|
41
|
-
# Uses Renderers::Mixin.filename to construct the filename for each renderer.
|
42
|
-
def renderer(path) ; Views.renderer_for( :templates / path) ; end
|
43
|
-
|
44
|
-
# Render the template found in the directory named after this view (snake cased, of course)
|
45
|
-
# E.g. App::Views::Gnome.new.render( "stink" ) would look for templates/gnome/stink.<ext>
|
46
|
-
def render( path, assigns = {} )
|
47
|
-
qpath = "#{self.class.basename.snake_case}/#{path}"
|
48
|
-
Waves.log.debug "Rendering template: #{qpath}"
|
49
|
-
Views.render( :templates / qpath, assigns.merge!( :request => request ))
|
50
|
-
end
|
51
|
-
|
52
|
-
# Render the template with the name of the missing method.
|
53
|
-
def method_missing(name,*args) ; render( name, *args ) ; end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
class Base ; include Mixin ; end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
|
-
end
|
data/samples/blog/blog.db
DELETED
Binary file
|
@@ -1,7 +0,0 @@
|
|
1
|
-
style <<-STYLE
|
2
|
-
body { background: #c93; padding: 20px; font-family: verdana, sans-serif; }
|
3
|
-
h1 { font-size: 60px; font-weight: bold; margin: 0px; }
|
4
|
-
p { font-size: 24px; margin: 0px; }
|
5
|
-
STYLE
|
6
|
-
h1 '500'
|
7
|
-
p %q( Internal server error. Sorry, but your request could not be processed. )
|
File without changes
|