waves 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/Rakefile +4 -0
- data/app/configurations/default.rb.erb +8 -0
- data/app/configurations/development.rb.erb +22 -0
- data/app/configurations/mapping.rb.erb +49 -0
- data/app/configurations/production.rb.erb +25 -0
- data/app/controllers/default.rb.erb +39 -0
- data/app/doc/EMTPY +0 -0
- data/app/helpers/default.rb.erb +13 -0
- data/app/lib/application.rb.erb +52 -0
- data/app/lib/startup.rb.erb +2 -0
- data/app/lib/tasks/cluster.rb +26 -0
- data/app/lib/tasks/schema.rb +28 -0
- data/app/models/default.rb.erb +13 -0
- data/app/schema/migration/templates/empty.rb.erb +9 -0
- data/app/templates/errors/not_found.mab +2 -0
- data/app/templates/errors/server_error.mab +2 -0
- data/app/templates/layouts/default.mab +14 -0
- data/app/views/default.rb.erb +13 -0
- data/bin/waves +32 -0
- data/bin/waves-console +8 -0
- data/bin/waves-server +45 -0
- data/lib/controllers/mixin.rb +62 -0
- data/lib/dispatchers/base.rb +41 -0
- data/lib/dispatchers/default.rb +33 -0
- data/lib/helpers/common.rb +22 -0
- data/lib/helpers/form.rb +22 -0
- data/lib/helpers/formatting.rb +22 -0
- data/lib/helpers/model.rb +15 -0
- data/lib/helpers/view.rb +14 -0
- data/lib/renderers/erubis.rb +38 -0
- data/lib/renderers/markaby.rb +31 -0
- data/lib/renderers/mixin.rb +41 -0
- data/lib/runtime/application.rb +43 -0
- data/lib/runtime/configuration.rb +47 -0
- data/lib/runtime/console.rb +21 -0
- data/lib/runtime/logger.rb +28 -0
- data/lib/runtime/mapping.rb +82 -0
- data/lib/runtime/mime_types.rb +18 -0
- data/lib/runtime/request.rb +43 -0
- data/lib/runtime/response.rb +26 -0
- data/lib/runtime/response_mixin.rb +53 -0
- data/lib/runtime/response_proxy.rb +29 -0
- data/lib/runtime/server.rb +58 -0
- data/lib/runtime/session.rb +43 -0
- data/lib/utilities/integer.rb +8 -0
- data/lib/utilities/kernel.rb +8 -0
- data/lib/utilities/module.rb +7 -0
- data/lib/utilities/object.rb +13 -0
- data/lib/utilities/string.rb +36 -0
- data/lib/utilities/symbol.rb +5 -0
- data/lib/views/mixin.rb +54 -0
- data/lib/waves.rb +50 -0
- metadata +189 -0
data/app/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module <%= name %>
|
2
|
+
module Configurations
|
3
|
+
class Development < Default
|
4
|
+
|
5
|
+
host '127.0.0.1'
|
6
|
+
|
7
|
+
port 3000
|
8
|
+
|
9
|
+
reloadable [ <%= name %> ]
|
10
|
+
|
11
|
+
log :level => :debug
|
12
|
+
|
13
|
+
application do
|
14
|
+
use Rack::ShowExceptions
|
15
|
+
run Waves::Dispatchers::Default.new
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module <%= name %>
|
2
|
+
|
3
|
+
module Configurations
|
4
|
+
|
5
|
+
module Mapping
|
6
|
+
|
7
|
+
extend Waves::Mapping
|
8
|
+
|
9
|
+
name = '([\w\-\_\.\+\@]+)'; model = '([\w\-]+)'
|
10
|
+
|
11
|
+
path %r{^/$} { redirect('/entries') }
|
12
|
+
|
13
|
+
# get all resources for the given model
|
14
|
+
path %r{^/#{model}/?$} do | model |
|
15
|
+
use( model ) | controller { all } | view { |data| list( model.plural => data ) }
|
16
|
+
end
|
17
|
+
|
18
|
+
# get all resources identifiers for the given model in json format
|
19
|
+
path %r{^/#{model}/?$}, :accept => /json/ do | model |
|
20
|
+
use( model ) | controller { all } | view { |data| list( model.plural => data ) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# get the given resource for the given model
|
24
|
+
path %r{^/#{model}/#{name}/?$} do | model, name |
|
25
|
+
use(model) | controller { find( name ) } |
|
26
|
+
view { |data| show( model => data ) }
|
27
|
+
end
|
28
|
+
|
29
|
+
# display an editor for the given resource / model
|
30
|
+
path %r{^/#{model}/#{name}/editor/?$} do | model, name |
|
31
|
+
use(model) | controller { find( name ) } |
|
32
|
+
view { |data| editor( model => data ) }
|
33
|
+
end
|
34
|
+
|
35
|
+
# add / update the given resource for the given model
|
36
|
+
path %r{^/#{model}/#{name}/?$}, :method => :post do | model, name |
|
37
|
+
use(model) | controller { update( name ) }; redirect( url )
|
38
|
+
end
|
39
|
+
|
40
|
+
# delete the given resource for the given model
|
41
|
+
path %r{^/#{model}/#{name}/?$}, :method => :delete do | model, name |
|
42
|
+
use(model) | controller { delete( name ) }; redirect( "/#{model}/" )
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module <%= name %>
|
2
|
+
|
3
|
+
module Configurations
|
4
|
+
|
5
|
+
class Production < Default
|
6
|
+
|
7
|
+
host '0.0.0.0'
|
8
|
+
|
9
|
+
port 80
|
10
|
+
|
11
|
+
reloadable []
|
12
|
+
|
13
|
+
log :level => :error,
|
14
|
+
:output => ( :log / "waves.#{$$}" ),
|
15
|
+
:rotation => :weekly
|
16
|
+
|
17
|
+
application do
|
18
|
+
run Waves::Dispatchers::Default.new
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module <%= name %>
|
2
|
+
|
3
|
+
module Controllers
|
4
|
+
|
5
|
+
class Default
|
6
|
+
|
7
|
+
include Waves::Controllers::Mixin
|
8
|
+
|
9
|
+
def all
|
10
|
+
model.all
|
11
|
+
end
|
12
|
+
|
13
|
+
def find( name )
|
14
|
+
model[ name ]
|
15
|
+
end
|
16
|
+
|
17
|
+
def create( attrs = {} )
|
18
|
+
model.new( attrs )
|
19
|
+
end
|
20
|
+
|
21
|
+
def update
|
22
|
+
attrs = params[model_name.singular]
|
23
|
+
if instance = find( attrs[:name] )
|
24
|
+
instance.set( attrs )
|
25
|
+
instance.save
|
26
|
+
else
|
27
|
+
model.create( attrs )
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete
|
32
|
+
model[ name ].destroy
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/app/doc/EMTPY
ADDED
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module <%= name %>
|
2
|
+
module Helpers
|
3
|
+
module Default
|
4
|
+
attr_reader :request, :content
|
5
|
+
include Waves::ResponseMixin
|
6
|
+
include Waves::Helpers::Common
|
7
|
+
include Waves::Helpers::Formatting
|
8
|
+
include Waves::Helpers::Model
|
9
|
+
include Waves::Helpers::View
|
10
|
+
include Waves::Helpers::Form
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
module <%= name %>
|
3
|
+
|
4
|
+
extend Autocreate; extend Autoload; extend Reloadable
|
5
|
+
autoload true; directories :lib
|
6
|
+
|
7
|
+
[ :Configurations, :Models, :Views, :Controllers, :Helpers ].each do | name |
|
8
|
+
autocreate( name, Module.new ) do
|
9
|
+
|
10
|
+
# dynamically access module constants
|
11
|
+
def self.[]( cname )
|
12
|
+
eval("#{name}::#{cname.to_s.camel_case}")
|
13
|
+
end
|
14
|
+
|
15
|
+
# first try to load and only create if that fails
|
16
|
+
# which means install autoload *after* autocreate
|
17
|
+
extend Autocreate; extend Autoload
|
18
|
+
|
19
|
+
# autoload any files in appropriately named directories
|
20
|
+
# exampe: models/blog.rb for Blog
|
21
|
+
autoload true; directories name.to_s.snake_case
|
22
|
+
|
23
|
+
# autocreate declarations ...
|
24
|
+
case name
|
25
|
+
# don't autocreate configs
|
26
|
+
when :Configurations then nil
|
27
|
+
# set the dataset for Models
|
28
|
+
when :Models
|
29
|
+
autocreate true, eval("<%= name %>::Models::Default") do
|
30
|
+
set_dataset <%= name %>.database[ basename.snake_case.plural.intern ]
|
31
|
+
end
|
32
|
+
# everything else just use the exemplar
|
33
|
+
else
|
34
|
+
autocreate true, eval("<%= name %>::#{name}::Default")
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
# accessor methods for modules and other key application objects ...
|
42
|
+
class << self
|
43
|
+
def config ; Waves::Server.config rescue nil || Waves::Console.config ; end
|
44
|
+
def database ; @database ||= Sequel.mysql( config.database ) ; end
|
45
|
+
def configurations ; <%= name %>::Configurations ; end
|
46
|
+
def controllers ; <%= name %>::Controllers ; end
|
47
|
+
def models ; <%= name %>::Models ; end
|
48
|
+
def helpers ; <%= name %>::Helpers ; end
|
49
|
+
def views ; <%= name %>::Views ; end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
namespace :cluster do
|
2
|
+
|
3
|
+
desc 'Start a cluster of waves applications.'
|
4
|
+
task :start => :stop do |task|
|
5
|
+
pids = []; path = :log / :pids
|
6
|
+
Waves::Console.config.ports.each do |port|
|
7
|
+
pid = fork { exec "waves_server -p #{port} #{ENV['mode']} -d" }
|
8
|
+
Process.detach( pid ); pids << pid
|
9
|
+
end
|
10
|
+
File.write( path, pids.join(',') )
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Stop a cluster of waves applications.'
|
14
|
+
task :stop do |task|
|
15
|
+
path = :log / :pids
|
16
|
+
if File.exist? path
|
17
|
+
File.read( path ).split(',').each { |pid| Process.kill( 'INT', pid.to_i ) rescue nil }
|
18
|
+
FileUtils.rm( path )
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Restart a cluster of waves applications.'
|
23
|
+
task :restart => [ :stop, :start ] do |task|
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
namespace :schema do
|
3
|
+
|
4
|
+
desc 'Create a new Sequel Migration using name.'
|
5
|
+
task :migration do |task|
|
6
|
+
|
7
|
+
version = ( ENV['version'].to_i ||
|
8
|
+
Sequel::Migrator.get_current_migration_version( Blog.database ) ) + 1
|
9
|
+
|
10
|
+
name = ENV['name'] || 'migration'
|
11
|
+
class_name = name.camel_case
|
12
|
+
|
13
|
+
template = ( ENV['template'] || 'empty' ) + '.rb.erb'
|
14
|
+
source = :schema / :migration / :templates / template
|
15
|
+
destination = :schema / :migration / "#{'%03d' % version}_#{name}.rb"
|
16
|
+
code = Erubis::Eruby.new( File.read( source ) ).result( binding )
|
17
|
+
File.write( destination, code )
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Performs migration from version, to version.'
|
22
|
+
task :migrate do |task|
|
23
|
+
version = ENV['version']; version = version.to_i unless version.nil?
|
24
|
+
Sequel::Migrator.apply( Waves.application.database, :schema / :migration , version )
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
data/bin/waves
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
unless ARGV.length == 1
|
4
|
+
$stderr.puts "Usage: waves {name}"
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'waves'
|
10
|
+
|
11
|
+
puts "** Creating new Waves application ..."
|
12
|
+
app_name = ARGV[0]
|
13
|
+
template = File.join( File.dirname(__FILE__),'..','app')
|
14
|
+
system "cp -R #{template} #{app_name}"
|
15
|
+
|
16
|
+
# get rid of placeholder files left over from gem install
|
17
|
+
Dir["#{app_name}/**/EMPTY"].each { |path| system "rm #{path}" }
|
18
|
+
|
19
|
+
# next, process all template files ...
|
20
|
+
Dir["#{app_name}/**/*.erb"].each do |path|
|
21
|
+
unless path =~ %r{^#{app_name}/(schema/migration/templates|templates)}
|
22
|
+
name = app_name.camel_case
|
23
|
+
File.write( path.gsub(/\.erb$/,''),
|
24
|
+
Erubis::Eruby.new( File.read( path ) ).result( binding ) )
|
25
|
+
system "rm #{path}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# finally, change the lib/application.rb file
|
30
|
+
system "mv #{app_name}/lib/application.rb #{app_name}/lib/#{app_name}.rb"
|
31
|
+
|
32
|
+
puts "** Application created!"
|
data/bin/waves-console
ADDED
data/bin/waves-server
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'waves'
|
2
|
+
require 'choice'
|
3
|
+
|
4
|
+
Choice.options do
|
5
|
+
header 'Run a waves application server.'
|
6
|
+
header ''
|
7
|
+
option :port do
|
8
|
+
short '-p'
|
9
|
+
long '--port=PORT'
|
10
|
+
desc 'Port to listen on.'
|
11
|
+
desc 'Defaults to value given in configuration.'
|
12
|
+
cast Integer
|
13
|
+
end
|
14
|
+
separator ''
|
15
|
+
option :host do
|
16
|
+
short '-h'
|
17
|
+
long '--host=HOST'
|
18
|
+
desc 'Host or IP address of the host to bind.'
|
19
|
+
desc 'Defaults to value given in configuration.'
|
20
|
+
end
|
21
|
+
separator ''
|
22
|
+
option :mode do
|
23
|
+
short '-c'
|
24
|
+
long '--config=CONFIG'
|
25
|
+
desc 'Configuration to use.'
|
26
|
+
desc 'Defaults to development.'
|
27
|
+
cast Symbol
|
28
|
+
end
|
29
|
+
separator ''
|
30
|
+
option :directory do
|
31
|
+
short '-D'
|
32
|
+
long '--dir=DIR'
|
33
|
+
desc 'Directory containing the application.'
|
34
|
+
desc 'Defaults to the current directory.'
|
35
|
+
end
|
36
|
+
separator ''
|
37
|
+
option :daemon do
|
38
|
+
short '-d'
|
39
|
+
long '--daemon'
|
40
|
+
desc 'Run as a daemon.'
|
41
|
+
end
|
42
|
+
separator ''
|
43
|
+
end
|
44
|
+
|
45
|
+
Waves::Server.run( Choice.choices )
|