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
@@ -1,16 +1,11 @@
1
- gem 'sequel', '>= 2.0.0'
2
- require 'sequel'
3
- require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
4
- require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
5
-
6
1
  module Waves
7
2
  module Layers
8
3
  module ORM # :nodoc:
9
4
 
10
- # Sets up the Sequel connection and configures AutoCode on Models, so that constants in that
11
- # namespace get loaded from file or created as subclasses of Models::Default
5
+ # The Sequel ORM layer sets up the Sequel connection and configures AutoCode on Models, so that constants in that
6
+ # namespace get loaded from file or created as subclasses of Models::Default. The dataset for models is set to the
7
+ # snakecased version of the model's class name.
12
8
  module Sequel
13
-
14
9
  # On inclusion, this module:
15
10
  # - creates on the application module a database method that establishes the Sequel connection
16
11
  # - arranges for autoloading/autocreation of missing constants in the Models namespace
@@ -23,9 +18,16 @@ module Waves
23
18
  # - delete(name)
24
19
  # - update(name)
25
20
  #
21
+
22
+
26
23
  def self.included(app)
27
24
 
28
- def app.database ; @sequel ||= ::Sequel.open( config.database ) ; end
25
+ gem 'sequel', '>= 2.0.0'
26
+ require 'sequel'
27
+ require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
28
+ require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
29
+
30
+ def app.database ; @sequel ||= ::Sequel.open( Waves.config.database ) ; end
29
31
 
30
32
  app.auto_create_module( :Models ) do
31
33
  include AutoCode
@@ -44,7 +46,9 @@ module Waves
44
46
  if @dataset && @dataset.opts[:from] != [ default ]
45
47
  # don't clobber dataset from autoloaded file
46
48
  else
47
- set_dataset Waves.application.database[ basename.snake_case.pluralize.intern ]
49
+ if respond_to? :set_dataset
50
+ set_dataset Waves.main.database[ basename.snake_case.pluralize.intern ]
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -66,7 +70,7 @@ module Waves
66
70
  end
67
71
 
68
72
  def create
69
- model.create( attributes )
73
+ model.create( attributes.to_hash )
70
74
  end
71
75
 
72
76
  def delete( name )
@@ -75,7 +79,7 @@ module Waves
75
79
 
76
80
  def update( name )
77
81
  instance = find( name )
78
- instance.update_with_params( attributes )
82
+ instance.update_with_params( attributes.to_hash )
79
83
  instance
80
84
  end
81
85
  end
@@ -2,8 +2,10 @@ namespace :generate do
2
2
 
3
3
  desc 'Generate a Sequel model, with name=<name>'
4
4
  task :model do |task|
5
- name = ENV['name']
6
- model_name = name.camel_case
5
+
6
+ model_name = ENV['name'].camel_case
7
+ app_name = ( ENV['app'] || Dir.pwd.split('/').last ).camel_case
8
+
7
9
  raise "Cannot generate Default yet" if model_name == 'Default'
8
10
 
9
11
  filename = File.expand_path "models/#{name}.rb"
@@ -13,7 +15,7 @@ namespace :generate do
13
15
  end
14
16
 
15
17
  model = <<TEXT
16
- module #{Waves.application.name}
18
+ module #{app_name}
17
19
  module Models
18
20
  class #{model_name} < Default
19
21
 
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../migration"
1
+ require "#{File.dirname(__FILE__)}/../../../migration"
2
2
 
3
3
  namespace :schema do
4
4
 
@@ -10,7 +10,7 @@ namespace :schema do
10
10
  desc "Performs Sequel migrations to version=<version>"
11
11
  task :migrate do |task|
12
12
  version = ENV['version']; version = version.to_i unless version.nil?
13
- Sequel::Migrator.apply( Waves.application.database, Waves::Layers::ORM.migration_directory , version )
13
+ Sequel::Migrator.apply( Waves.main.database, Waves::Layers::ORM.migration_directory , version )
14
14
  end
15
15
 
16
16
  end
@@ -5,10 +5,6 @@ module Erubis # :nodoc:
5
5
  # This is added to the Erubis Content class to allow the same helper methods
6
6
  # to be used with both Markaby and Erubis.
7
7
  class Context
8
- include Waves::Helpers::UrlHelper
9
- include Waves::Helpers::TagHelper
10
- include Waves::Helpers::AssetHelper
11
- include Waves::Helpers::NumberHelper
12
8
 
13
9
  def <<(s)
14
10
  eval("_buf", @binding).concat s # add to rendered output
@@ -34,15 +30,15 @@ module Erubis # :nodoc:
34
30
  end
35
31
 
36
32
  module Waves
37
-
33
+
38
34
  module Renderers
39
35
 
40
- class Erubis
41
-
42
- include Renderers::Mixin
43
-
44
- extension :erb
45
-
36
+ module Erubis
37
+
38
+ Extension = :erb
39
+
40
+ extend Waves::Renderers::Mixin
41
+
46
42
  def self.render( path, assigns )
47
43
  eruby = ::Erubis::Eruby.new( template( path ) )
48
44
  helper = helper( path )
@@ -56,8 +52,9 @@ module Waves
56
52
  context.render(eruby)
57
53
  end
58
54
 
59
- end
60
55
 
56
+ end
57
+
61
58
  end
62
59
 
63
- end
60
+ end
@@ -0,0 +1,47 @@
1
+ require 'haml'
2
+
3
+ module Waves
4
+
5
+ module Renderers
6
+
7
+ module Haml
8
+
9
+ Extension = :haml
10
+
11
+ extend Waves::Renderers::Mixin
12
+
13
+ def self.render( path, assigns )
14
+ engine = ::Haml::Engine.new( template( path ) )
15
+ scope = Scope.new
16
+ helper = helper( path )
17
+ scope.meta_eval { include( helper ) }
18
+ scope.instance_eval do
19
+ assigns.each { |key,val| instance_variable_set("@#{key}",val) unless key == :request }
20
+ end
21
+ engine.render(scope, assigns)
22
+ end
23
+
24
+ class Scope
25
+ include Waves::Helpers::DocType
26
+ include Waves::Helpers::Layouts
27
+ include Waves::Helpers::Model
28
+ include Waves::Helpers::View
29
+
30
+ def <<(s)
31
+ eval("@haml_buffer", @binding).push_text s # add to rendered output
32
+ end
33
+
34
+ def capture(&block)
35
+ capture_haml(nil, &block)
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+
47
+
@@ -0,0 +1,29 @@
1
+ module Waves
2
+
3
+ module Renderers
4
+
5
+ module Markaby
6
+
7
+ Extension = :mab
8
+
9
+ extend Waves::Renderers::Mixin
10
+
11
+ def self.included( app )
12
+ require 'markaby'
13
+ ::Markaby::Builder.set( :indent, 2 )
14
+ super
15
+ end
16
+
17
+ def self.render( path, assigns )
18
+ builder = ::Markaby::Builder.new( assigns )
19
+ helper = helper( path )
20
+ builder.meta_eval { include( helper ) }
21
+ builder.instance_eval( template( path ) )
22
+ builder.to_s
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,21 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Accept < Base
6
+
7
+ def initialize( options )
8
+ @constraints = {
9
+ :accept => options[ :accept ],
10
+ :lang => options[ :lang ],
11
+ :charset => options[ :charset ]
12
+ }
13
+ end
14
+
15
+ def call( request ) ; test( request ) ; end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,30 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Base
6
+
7
+ attr_accessor :constraints
8
+
9
+ def []( *args ) ; call( *args ) ; end
10
+
11
+ # used to provide consisting matching logic across all matchers
12
+ def test( request )
13
+ constraints.all? do | key, val |
14
+ if val.nil? or val == true
15
+ true
16
+ else
17
+ if val.respond_to? :call
18
+ val.call( request )
19
+ else
20
+ val == request.send( key ) or val === request.send( key ) or request.send( key ) === val
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,17 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class ContentType < Base
6
+
7
+ def initialize( content_type ) ; @constraints = { :content_type => content_type } ; end
8
+
9
+ # we could maybe do something more sophisticated here, matching against content type patterns
10
+ # such */html or */xml, etc.; adapt from the matching done on accepts ... ?
11
+ def call( request ) ; test( request ) ; end
12
+
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,67 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Path < Base
6
+
7
+ # Takes an array of pattern elements ... coming soon, support for formatted strings!
8
+ def initialize( pattern ) ; @pattern = pattern ; end
9
+
10
+ def call( request )
11
+ return {} if @pattern == true or @pattern == false or @pattern.nil?
12
+ path = extract_path( request ).reverse
13
+ return {} if ( path.empty? and @pattern.empty? )
14
+ capture = {}
15
+ match = @pattern.all? do | want |
16
+ case want
17
+ when true # means 1..-1
18
+ path = [] unless path.empty?
19
+ when Range
20
+ if want.end == -1
21
+ path = [] if path.length >= want.begin
22
+ else
23
+ path = [] if want.include? path.length
24
+ end
25
+ when String then want == path.pop
26
+ when Symbol then capture[ want ] = path.pop
27
+ when Regexp then want === path.pop
28
+ when Hash
29
+ key, value = want.to_a.first
30
+ case value
31
+ when true
32
+ ( capture[ key ], path = path.reverse, [] ) unless path.empty?
33
+ when Range
34
+ if value.end == -1
35
+ ( capture[ key ], path = path.reverse, [] ) if path.length >= value.begin
36
+ else
37
+ ( capture[ key ], path = path.reverse, [] ) if value.include? path.length
38
+ end
39
+ when String, Symbol
40
+ got = path.pop
41
+ capture[ key ] = got ? got : value.to_s
42
+ when Regexp then
43
+ got = path.pop
44
+ capture[ key ] = got if value === got
45
+ end
46
+ end
47
+ end
48
+ capture if match && path.empty?
49
+ end
50
+
51
+ private
52
+
53
+ # just a little helper method
54
+ def extract_path( request )
55
+ path = request.traits.waves.path
56
+ return path if path
57
+ path = request.path.split('/')
58
+ path.shift unless path.empty?
59
+ request.traits.waves.path = path
60
+ end
61
+
62
+ end
63
+
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,21 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Query < Base
6
+
7
+ def initialize( pattern ) ; @pattern = ( pattern or {} ) ; end
8
+
9
+ def call( request )
10
+ @pattern.all? do | key, val |
11
+ key = key.to_s
12
+ ( ( val.respond_to?(:call) and val.call( request.query[ key ] ) ) or
13
+ ( request.query[ key ] and ( ( val == true ) or ( val === request.query[ key ] ) ) ) )
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,27 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Request < Base
6
+
7
+ def initialize( options )
8
+ @uri = Matchers::URI.new( options )
9
+ @constraints = {
10
+ :content_type => Matchers::ContentType.new( options[ :content_type ] ),
11
+ :accept => Matchers::Accept.new( options ),
12
+ :query => Matchers::Query.new( options[:query] ),
13
+ :traits => Matchers::Traits.new( options[:traits] )
14
+ }
15
+ end
16
+
17
+ def call( request )
18
+ if test( request ) and captured = @uri[ request ]
19
+ request.traits.waves.captured = captured
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,19 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Resource
6
+
7
+ def initialize( options )
8
+ @matcher = Waves::Matchers::Request.new( options )
9
+ end
10
+
11
+ def call( resource ) ; @matcher.call( resource.request ) ; end
12
+ def []( *args ) ; call( *args ) ; end
13
+
14
+
15
+ end
16
+
17
+ end
18
+
19
+ end