dyoder-waves 0.7.7 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. data/bin/waves +19 -56
  2. data/doc/HISTORY +1 -0
  3. data/doc/LICENSE +22 -0
  4. data/doc/README +1 -0
  5. data/doc/VERSION +1 -0
  6. data/lib/caches/file.rb +48 -0
  7. data/lib/caches/memcached.rb +40 -0
  8. data/lib/caches/simple.rb +25 -0
  9. data/lib/caches/synchronized.rb +25 -0
  10. data/lib/commands/console.rb +35 -0
  11. data/lib/commands/generate.rb +52 -0
  12. data/lib/commands/help.rb +5 -0
  13. data/lib/commands/{waves-server.rb → server.rb} +16 -3
  14. data/lib/dispatchers/base.rb +21 -20
  15. data/lib/dispatchers/default.rb +11 -63
  16. data/lib/ext/float.rb +13 -0
  17. data/lib/{utilities → ext}/hash.rb +2 -2
  18. data/lib/{utilities → ext}/integer.rb +5 -2
  19. data/lib/ext/kernel.rb +20 -0
  20. data/lib/ext/module.rb +20 -0
  21. data/lib/{utilities → ext}/object.rb +3 -5
  22. data/lib/ext/string.rb +20 -0
  23. data/lib/ext/symbol.rb +11 -0
  24. data/lib/ext/tempfile.rb +5 -0
  25. data/lib/foundations/classic.rb +64 -0
  26. data/lib/foundations/compact.rb +50 -0
  27. data/lib/helpers/basic.rb +11 -0
  28. data/lib/helpers/doc_type.rb +34 -0
  29. data/lib/helpers/extended.rb +21 -0
  30. data/lib/helpers/form.rb +3 -1
  31. data/lib/helpers/formatting.rb +3 -3
  32. data/lib/helpers/layouts.rb +37 -0
  33. data/lib/helpers/model.rb +8 -4
  34. data/lib/helpers/view.rb +2 -4
  35. data/lib/layers/inflect/english.rb +67 -0
  36. data/lib/layers/mvc.rb +18 -18
  37. data/lib/layers/mvc/controllers.rb +41 -0
  38. data/lib/layers/mvc/extensions.rb +52 -0
  39. data/lib/layers/orm/{active_record.rb → providers/active_record.rb} +12 -18
  40. data/lib/layers/orm/{active_record → providers/active_record}/migrations/empty.rb.erb +0 -0
  41. data/lib/layers/orm/{active_record → providers/active_record}/tasks/generate.rb +1 -1
  42. data/lib/layers/orm/{active_record → providers/active_record}/tasks/schema.rb +1 -1
  43. data/lib/layers/orm/{data_mapper.rb → providers/data_mapper.rb} +3 -4
  44. data/lib/layers/orm/providers/filebase.rb +25 -0
  45. data/lib/layers/orm/{sequel.rb → providers/sequel.rb} +16 -12
  46. data/lib/layers/orm/{sequel → providers/sequel}/migrations/empty.rb.erb +0 -0
  47. data/lib/layers/orm/{sequel → providers/sequel}/tasks/generate.rb +5 -3
  48. data/lib/layers/orm/{sequel → providers/sequel}/tasks/schema.rb +2 -2
  49. data/lib/{renderers → layers/renderers}/erubis.rb +10 -13
  50. data/lib/layers/renderers/haml.rb +47 -0
  51. data/lib/layers/renderers/markaby.rb +29 -0
  52. data/lib/matchers/accept.rb +21 -0
  53. data/lib/matchers/base.rb +30 -0
  54. data/lib/matchers/content_type.rb +17 -0
  55. data/lib/matchers/path.rb +67 -0
  56. data/lib/matchers/query.rb +21 -0
  57. data/lib/matchers/request.rb +27 -0
  58. data/lib/matchers/resource.rb +19 -0
  59. data/lib/matchers/traits.rb +19 -0
  60. data/lib/matchers/uri.rb +20 -0
  61. data/lib/renderers/mixin.rb +15 -29
  62. data/lib/resources/mixin.rb +132 -0
  63. data/lib/resources/paths.rb +34 -0
  64. data/lib/runtime/configuration.rb +55 -135
  65. data/lib/runtime/console.rb +4 -1
  66. data/lib/runtime/logger.rb +24 -48
  67. data/lib/runtime/mime_types.rb +516 -2
  68. data/lib/runtime/mocks.rb +14 -0
  69. data/lib/runtime/monitor.rb +32 -0
  70. data/lib/runtime/request.rb +107 -39
  71. data/lib/runtime/response.rb +5 -2
  72. data/lib/runtime/response_mixin.rb +43 -22
  73. data/lib/runtime/runtime.rb +67 -0
  74. data/lib/runtime/server.rb +14 -101
  75. data/lib/runtime/session.rb +4 -43
  76. data/lib/runtime/worker.rb +86 -0
  77. data/lib/servers/base.rb +42 -0
  78. data/lib/servers/mongrel.rb +13 -0
  79. data/lib/servers/webrick.rb +13 -0
  80. data/lib/tasks/gem.rb +1 -0
  81. data/lib/tasks/generate.rb +67 -62
  82. data/lib/views/errors.rb +49 -0
  83. data/lib/views/mixin.rb +34 -82
  84. data/lib/waves.rb +36 -55
  85. data/samples/blog/Rakefile +25 -0
  86. data/samples/blog/configurations/default.rb +11 -0
  87. data/samples/blog/configurations/development.rb +29 -0
  88. data/samples/blog/configurations/production.rb +26 -0
  89. data/samples/blog/models/comment.rb +23 -0
  90. data/samples/blog/models/entry.rb +31 -0
  91. data/samples/blog/public/css/site.css +13 -0
  92. data/samples/blog/public/javascript/jquery-1.2.6.min.js +32 -0
  93. data/samples/blog/public/javascript/site.js +13 -0
  94. data/samples/blog/resources/entry.rb +39 -0
  95. data/samples/blog/resources/map.rb +9 -0
  96. data/samples/blog/schema/migrations/001_initial_schema.rb +17 -0
  97. data/samples/blog/schema/migrations/002_add_comments.rb +18 -0
  98. data/samples/blog/schema/migrations/templates/empty.rb.erb +9 -0
  99. data/samples/blog/startup.rb +8 -0
  100. data/samples/blog/templates/comment/add.mab +12 -0
  101. data/samples/blog/templates/comment/list.mab +6 -0
  102. data/samples/blog/templates/entry/edit.mab +14 -0
  103. data/samples/blog/templates/entry/list.mab +16 -0
  104. data/samples/blog/templates/entry/show.mab +18 -0
  105. data/samples/blog/templates/entry/summary.mab +9 -0
  106. data/samples/blog/templates/errors/not_found_404.mab +7 -0
  107. data/{app → samples/blog}/templates/errors/server_error_500.mab +0 -0
  108. data/samples/blog/templates/layouts/default.mab +19 -0
  109. data/samples/blog/templates/waves/status.mab +85 -0
  110. data/templates/classic/Rakefile +130 -0
  111. data/templates/classic/configurations/default.rb.erb +9 -0
  112. data/{app → templates/classic}/configurations/development.rb.erb +3 -7
  113. data/{app → templates/classic}/configurations/production.rb.erb +3 -4
  114. data/templates/classic/resources/map.rb.erb +8 -0
  115. data/templates/classic/startup.rb.erb +11 -0
  116. data/{app → templates/classic}/templates/errors/not_found_404.mab +0 -0
  117. data/templates/classic/templates/errors/server_error_500.mab +2 -0
  118. data/{app → templates/classic}/templates/layouts/default.mab +0 -0
  119. data/templates/compact/startup.rb.erb +11 -0
  120. metadata +967 -144
  121. data/app/Rakefile +0 -14
  122. data/app/bin/waves-console +0 -4
  123. data/app/bin/waves-server +0 -4
  124. data/app/configurations/mapping.rb.erb +0 -13
  125. data/app/controllers/.gitignore +0 -0
  126. data/app/doc/.gitignore +0 -0
  127. data/app/helpers/.gitignore +0 -0
  128. data/app/lib/application.rb.erb +0 -5
  129. data/app/lib/tasks/.gitignore +0 -0
  130. data/app/log/.gitignore +0 -0
  131. data/app/models/.gitignore +0 -0
  132. data/app/public/css/.gitignore +0 -0
  133. data/app/public/flash/.gitignore +0 -0
  134. data/app/public/images/.gitignore +0 -0
  135. data/app/public/javascript/.gitignore +0 -0
  136. data/app/schema/migrations/.gitignore +0 -0
  137. data/app/startup.rb +0 -5
  138. data/app/tmp/sessions/.gitignore +0 -0
  139. data/app/views/.gitignore +0 -0
  140. data/bin/waves-console +0 -4
  141. data/bin/waves-server +0 -4
  142. data/lib/commands/waves-console.rb +0 -21
  143. data/lib/controllers/base.rb +0 -11
  144. data/lib/controllers/mixin.rb +0 -165
  145. data/lib/foundations/default.rb +0 -26
  146. data/lib/foundations/simple.rb +0 -30
  147. data/lib/helpers/asset_helper.rb +0 -67
  148. data/lib/helpers/common.rb +0 -66
  149. data/lib/helpers/default.rb +0 -13
  150. data/lib/helpers/number_helper.rb +0 -25
  151. data/lib/helpers/tag_helper.rb +0 -58
  152. data/lib/helpers/url_helper.rb +0 -77
  153. data/lib/layers/default_errors.rb +0 -26
  154. data/lib/layers/orm/filebase.rb +0 -22
  155. data/lib/layers/simple.rb +0 -35
  156. data/lib/layers/simple_errors.rb +0 -23
  157. data/lib/mapping/mapping.rb +0 -289
  158. data/lib/mapping/pretty_urls.rb +0 -96
  159. data/lib/renderers/markaby.rb +0 -33
  160. data/lib/runtime/application.rb +0 -69
  161. data/lib/runtime/blackboard.rb +0 -57
  162. data/lib/runtime/debugger.rb +0 -9
  163. data/lib/runtime/response_proxy.rb +0 -30
  164. data/lib/tasks/cluster.rb +0 -26
  165. data/lib/utilities/inflect.rb +0 -110
  166. data/lib/utilities/inflect/english.rb +0 -84
  167. data/lib/utilities/module.rb +0 -21
  168. data/lib/utilities/proc.rb +0 -16
  169. data/lib/utilities/string.rb +0 -61
  170. data/lib/utilities/symbol.rb +0 -10
  171. data/lib/views/base.rb +0 -9
@@ -3,75 +3,23 @@ module Waves
3
3
  module Dispatchers
4
4
 
5
5
  #
6
- # Waves::Dispatchers::Default matches requests against an application's mappings to
7
- # determine what main action to take, as well as what before, after, always, and exception-handling
8
- # blocks must run.
9
- #
10
- # The default dispatcher also attempts to set the content type based on the
11
- # file extension used in the request URL. It does this using the class defined in
12
- # the current configuration's +mime_types+ attribute, which defaults to Mongrel's
13
- # MIME type handler.
14
- #
15
- # You can write your own dispatcher and use it in your application's configuration
16
- # file. By default, they use the default dispatcher, like this:
17
- #
18
- # application do
19
- # use Rack::ShowExceptions
20
- # run Waves::Dispatchers::Default.new
21
- # end
6
+ # Waves::Dispatchers::Default processes a Waves::Request and returns a Waves::Response as follows:
22
7
  #
23
8
 
24
9
  class Default < Base
25
10
 
26
- # All dispatchers using the Dispatchers::Base to provide thread-safety, logging, etc.
27
- # must provide a +safe+ method to handle creating a response from a request.
28
- # Takes a Waves::Request and returns a Waves::Reponse
11
+ # Takes a Waves::Request and returns a Waves::Response
29
12
  def safe( request )
30
-
31
- response = request.response
32
-
33
- Waves::Application.instance.reload if Waves::Application.instance.debug?
34
- response.content_type = Waves::Application.instance.config.mime_types[ request.path ] || 'text/html'
35
-
36
- mapping = Waves::Application.instance.mapping[ request ]
37
-
38
- begin
39
-
40
- mapping[:before].each do | block, args |
41
- ResponseProxy.new(request).instance_exec(*args,&block)
42
- end
43
-
44
- request.not_found unless mapping[:action]
45
-
46
- block, args = mapping[:action]
47
- response.write( ResponseProxy.new(request).instance_exec(*args, &block) )
48
-
49
- mapping[:after].each do | block, args |
50
- ResponseProxy.new(request).instance_exec(*args,&block)
51
- end
52
-
53
- rescue Exception => e
54
-
55
- handler = mapping[:handlers].detect do | exception, block, args |
56
- e.is_a? exception
57
- end
58
- if handler
59
- ResponseProxy.new(request).instance_exec(*handler[2], &handler[1])
60
- else
61
- raise e
62
- end
63
-
64
- ensure
65
- mapping[:always].each do | block, args |
66
- begin
67
- ResponseProxy.new(request).instance_exec(*args,&block)
68
- rescue Exception => e
69
- Waves::Logger.info e.to_s
70
- end
71
- end
72
-
13
+ # set a default content type -- this can be overridden by the resource
14
+ request.response.content_type = request.accept.default
15
+ resource = Waves.config.resource.new( request )
16
+ if request.response.body.empty?
17
+ request.response.body << resource.process.to_s
18
+ else
19
+ resource.process
73
20
  end
74
-
21
+ # okay, we've handled the request, now write the response unless it was already done
22
+ request.response.finish
75
23
  end
76
24
 
77
25
  end
data/lib/ext/float.rb ADDED
@@ -0,0 +1,13 @@
1
+ module Waves
2
+ module Ext
3
+ module Float
4
+ def to_delimited(delim=',')
5
+ self.to_s.gsub(/(\d)(?=(\d\d\d)+\.)/, "\\1#{delim}")
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ class Float # :nodoc:
12
+ include Waves::Ext::Float
13
+ end
@@ -1,5 +1,5 @@
1
1
  module Waves
2
- module Utilities # :nodoc:
2
+ module Ext # :nodoc:
3
3
 
4
4
  # Utility methods mixed into Hash.
5
5
  module Hash
@@ -27,5 +27,5 @@ module Waves
27
27
  end
28
28
 
29
29
  class Hash # :nodoc:
30
- include Waves::Utilities::Hash
30
+ include Waves::Ext::Hash
31
31
  end
@@ -1,5 +1,5 @@
1
1
  module Waves
2
- module Utilities
2
+ module Ext
3
3
  module Integer
4
4
  def seconds ; self ; end
5
5
  def minutes ; self * 60 ; end
@@ -15,10 +15,13 @@ module Waves
15
15
  def exabytes ; self * 1024.petabytes ; end
16
16
  def zettabytes ; self * 1024.exabytes ; end
17
17
  def yottabytes ; self * 1024.zettabytes ; end
18
+ def to_delimited(delim=',')
19
+ self.to_s.gsub(/(\d)(?=(\d\d\d)+$)/, "\\1#{delim}")
20
+ end
18
21
  end
19
22
  end
20
23
  end
21
24
 
22
25
  class Integer # :nodoc:
23
- include Waves::Utilities::Integer
26
+ include Waves::Ext::Integer
24
27
  end
data/lib/ext/kernel.rb ADDED
@@ -0,0 +1,20 @@
1
+ module Kernel
2
+ unless respond_to?(:debugger)
3
+ # Starts a debugging session if ruby-debug has been loaded (call waves-server --debugger to do load it).
4
+ def debugger
5
+ Waves::Logger.info "Debugger invoked but not loaded. Start server with --debugger to enable."
6
+ end
7
+ end
8
+
9
+ unless respond_to?(:engine)
10
+ # 'engine' exists to provide a quick and easy (and MRI-compatible!) interface to the RUBY_ENGINE constant
11
+ def engine; defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'; end
12
+ end
13
+
14
+ def safe_trap(*signals)
15
+ signals.each { |s| trap(s) { yield } }
16
+ Thread.new { loop { sleep 1 } } if RUBY_PLATFORM =~ /mswin32/
17
+ end
18
+
19
+
20
+ end
data/lib/ext/module.rb ADDED
@@ -0,0 +1,20 @@
1
+ module Waves
2
+ module Ext
3
+ module Module
4
+
5
+ def basename ; self.name.split('::').last || '' ; end
6
+ def rootname ; self.name.split('::').first ; end
7
+ def root ; eval( "::#{self.rootname}" ) ; end
8
+
9
+ # Just a convenience method for dynamically referencing submodules. Note that
10
+ # you cannot do const_get, because that will also attempt to deref the cname
11
+ # at global scope. So it is more efficient to just use eval.
12
+ def []( cname ) ; eval( "self::#{cname.to_s.camel_case}" ) ; end
13
+
14
+ end
15
+ end
16
+ end
17
+
18
+ class Module # :nodoc:
19
+ include Waves::Ext::Module
20
+ end
@@ -1,11 +1,9 @@
1
1
  module Waves
2
- module Utilities
2
+ module Ext
3
3
  module Object
4
4
  # This is an extremely powerful little function that will be built-in to Ruby 1.9.
5
5
  # This version is from Mauricio Fernandez via ruby-talk. Works like instance_eval
6
- # except that you can pass parameters to the block. This means you can define a block
7
- # intended for use with instance_eval, pass it to another method, which can then
8
- # invoke with parameters. This is used quite a bit by the Waves::Mapping code.
6
+ # except that you can pass parameters to the block.
9
7
  def instance_exec(*args, &block)
10
8
  mname = "__instance_exec_#{Thread.current.object_id.abs}"
11
9
  class << self; self end.class_eval{ define_method(mname, &block) }
@@ -21,5 +19,5 @@ module Waves
21
19
  end
22
20
 
23
21
  class Object # :nodoc:
24
- include Waves::Utilities::Object
22
+ include Waves::Ext::Object
25
23
  end
data/lib/ext/string.rb ADDED
@@ -0,0 +1,20 @@
1
+ # Utility methods mixed into String.
2
+
3
+ class String
4
+
5
+ # Syntactic sugar for using File.join to concatenate the argument to the receiver.
6
+ #
7
+ # require "lib" / "utilities" / "string"
8
+ #
9
+ # The idea is not original, but we can't remember where we first saw it.
10
+ # Waves::Ext::Symbol defines the same method, allowing for :files / 'afilename.txt'
11
+ #
12
+
13
+ def / ( s ) ; File.join( self, s.to_s ); end
14
+
15
+ alias_method :lower_camel_case, :subcamelcase
16
+ alias_method :camel_case, :camelcase
17
+ alias_method :snake_case, :snakecase
18
+ alias_method :title_case, :titlecase
19
+
20
+ end
data/lib/ext/symbol.rb ADDED
@@ -0,0 +1,11 @@
1
+ class Symbol
2
+
3
+ # Syntactic sugar for using File.join to concatenate the argument to the receiver.
4
+ #
5
+ # require :lib / :utilities / :string
6
+ #
7
+ # The idea is not original, but we can't remember where we first saw it.
8
+ # Waves::Ext::Symbol defines the same method, allowing for :files / 'afilename.txt'
9
+
10
+ def / ( s ) ; File.join( self.to_s, s.to_s ) ; end
11
+ end
@@ -0,0 +1,5 @@
1
+ require 'tempfile'
2
+ class Tempfile
3
+ # override method to prevent problem uploading files with Rack
4
+ def ==(other) ; eql?(other) || super ; end
5
+ end
@@ -0,0 +1,64 @@
1
+ module Waves
2
+ module Foundations
3
+
4
+ # Provides Sun MVC features for your application.
5
+ # Includes ERb-style templates. You can also include others via Renderer Layers.
6
+ # It does NOT include a default ORM. Use an ORM Layer for that.
7
+
8
+ module Classic
9
+
10
+ def self.included( app )
11
+
12
+ require 'autocode'
13
+ require 'layers/mvc'
14
+ require 'layers/inflect/english'
15
+ require 'helpers/extended'
16
+ require 'layers/renderers/erubis'
17
+
18
+ app.module_eval do
19
+
20
+ include AutoCode
21
+
22
+ app.auto_create_module( :Configurations ) do
23
+ include AutoCode
24
+ auto_create_class :Default
25
+ auto_load :Default, :directories => [ :configurations ]
26
+ end
27
+
28
+ app.auto_eval( :Configurations ) do
29
+ auto_create_class true, app::Configurations::Default
30
+ auto_load true, :directories => [ :configurations ]
31
+ end
32
+
33
+ app.auto_create_module( :Resources ) do
34
+ include AutoCode
35
+ auto_create_class :Default, Waves::Resources::Base
36
+ auto_load :Default, :directories => [ :resources ]
37
+ end
38
+
39
+ app.auto_eval( :Resources ) do
40
+ auto_create_class true, app::Resources::Default
41
+ auto_load true, :directories => [ :resources ]
42
+ auto_eval :Map do
43
+
44
+ handler( Waves::Dispatchers::NotFoundError ) do
45
+ app::Views::Errors.new( request ).not_found_404
46
+ end
47
+
48
+ end
49
+ end
50
+
51
+ include Waves::Layers::Inflect::English
52
+ include Waves::Layers::MVC
53
+ include Waves::Renderers::Erubis
54
+
55
+ end
56
+
57
+ Waves << app
58
+
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+
@@ -0,0 +1,50 @@
1
+ module Waves
2
+ module Foundations
3
+ module Compact
4
+ def self.included( app )
5
+ app.module_eval {
6
+ const_set( :Resources, Module.new {
7
+ const_set( :Map, Class.new {
8
+ include Waves::Resources::Mixin
9
+ handler( Exception ) {
10
+ Waves::Views::Errors.new( request ).server_error_500
11
+ }
12
+
13
+ handler( Waves::Dispatchers::NotFoundError ) {
14
+ Waves::Views::Errors.new( request ).not_found_404
15
+ }
16
+ })
17
+ })
18
+ const_set( :Configurations, Module.new {
19
+ const_set( :Development, Class.new( Waves::Configurations::Default ) {
20
+ log :level => :debug
21
+ host '127.0.0.1'
22
+ port 3000
23
+ server Waves::Servers::Mongrel
24
+ resource app::Resources::Map
25
+ })
26
+ const_set( :Production, Class.new( self::Development ) {
27
+ log :level => :error, :output => ( "log.#{$$}" ), :rotation => :weekly
28
+ port 80
29
+ host '0.0.0.0'
30
+ server Waves::Servers::Mongrel
31
+ application {
32
+ use Rack::Session::Cookie, :key => 'rack.session',
33
+ # :domain => 'foo.com',
34
+ :path => '/',
35
+ :expire_after => 2592000,
36
+ :secret => 'Change it'
37
+
38
+ run ::Waves::Dispatchers::Default.new
39
+ }
40
+
41
+ })
42
+ })
43
+ }
44
+ Waves << app
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+
@@ -0,0 +1,11 @@
1
+ module Waves
2
+ module Helpers
3
+ module Basic
4
+ attr_reader :request
5
+ include Waves::ResponseMixin
6
+
7
+ def app ; Waves.main ; end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,34 @@
1
+ module Waves
2
+
3
+ module Helpers
4
+
5
+ module DocType
6
+
7
+ DOCTYPES = {
8
+ :html3 => "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n",
9
+ :html4_transitional =>
10
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" " <<
11
+ "\"http://www.w3.org/TR/html4/loose.dtd\">\n",
12
+ :html4_strict =>
13
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" " <<
14
+ "\"http://www.w3.org/TR/html4/strict.dtd\">\n",
15
+ :html4_frameset =>
16
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" " <<
17
+ "\"http://www.w3.org/TR/html4/frameset.dtd\">\n",
18
+ :xhtml1_transitional =>
19
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " <<
20
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n",
21
+ :xhtml1_strict =>
22
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " <<
23
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n",
24
+ :xhtml1_frameset =>
25
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" " <<
26
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n",
27
+ :xhtml2 => "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
28
+ }
29
+
30
+ def doctype(type) ; self << DOCTYPES[type||:html4_strict] ; end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'helpers/basic'
2
+ require 'helpers/doc_type'
3
+ require 'helpers/layouts'
4
+ require 'helpers/formatting'
5
+ require 'helpers/model'
6
+ require 'helpers/view'
7
+ require 'helpers/form'
8
+
9
+ module Waves
10
+ module Helpers
11
+ module Extended
12
+ include Waves::Helpers::Basic
13
+ include Waves::Helpers::DocType
14
+ include Waves::Helpers::Layouts
15
+ include Waves::Helpers::Formatting
16
+ include Waves::Helpers::Model
17
+ include Waves::Helpers::View
18
+ include Waves::Helpers::Form
19
+ end
20
+ end
21
+ end
data/lib/helpers/form.rb CHANGED
@@ -15,7 +15,9 @@ module Waves
15
15
  # will invoke the +text+ form view (the template in +templates/form/text.mab+),
16
16
  # passing in the name ('blog.title') and the value (@blog.title) as instance variables.
17
17
  #
18
- # These helpers are Markaby only.
18
+ # These helpers work best with Markaby, but may work for other Renderers.
19
+ #
20
+
19
21
  module Form
20
22
 
21
23
  # This method really is a place-holder for common wrappers around groups of