dyoder-waves 0.7.7 → 0.8.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.
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