waves 0.8.2 → 0.9.0
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/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
|