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.
Files changed (166) hide show
  1. data/bin/waves +4 -3
  2. data/doc/VERSION +1 -1
  3. data/lib/waves.rb +52 -40
  4. data/lib/{caches → waves/caches}/file.rb +3 -1
  5. data/lib/waves/caches/memcached.rb +56 -0
  6. data/lib/{caches → waves/caches}/simple.rb +6 -7
  7. data/lib/{caches → waves/caches}/synchronized.rb +15 -1
  8. data/lib/{commands → waves/commands}/console.rb +4 -4
  9. data/lib/{commands → waves/commands}/generate.rb +6 -5
  10. data/lib/{commands → waves/commands}/help.rb +0 -0
  11. data/lib/{commands → waves/commands}/server.rb +1 -1
  12. data/lib/{dispatchers → waves/dispatchers}/base.rb +17 -31
  13. data/lib/waves/dispatchers/default.rb +19 -0
  14. data/lib/{ext → waves/ext}/float.rb +0 -0
  15. data/lib/{ext → waves/ext}/hash.rb +0 -0
  16. data/lib/{ext → waves/ext}/integer.rb +16 -1
  17. data/lib/{ext → waves/ext}/kernel.rb +3 -7
  18. data/lib/{ext → waves/ext}/module.rb +3 -3
  19. data/lib/{ext → waves/ext}/object.rb +2 -0
  20. data/lib/waves/ext/string.rb +73 -0
  21. data/lib/{ext → waves/ext}/symbol.rb +0 -1
  22. data/lib/{ext → waves/ext}/tempfile.rb +0 -0
  23. data/lib/waves/ext/time.rb +5 -0
  24. data/lib/{foundations → waves/foundations}/classic.rb +9 -21
  25. data/lib/{foundations → waves/foundations}/compact.rb +15 -20
  26. data/lib/waves/foundations/rest.rb +311 -0
  27. data/lib/waves/helpers/basic.rb +13 -0
  28. data/lib/{helpers → waves/helpers}/doc_type.rb +3 -0
  29. data/lib/waves/helpers/form.rb +94 -0
  30. data/lib/waves/helpers/formatting.rb +14 -0
  31. data/lib/waves/layers/mvc.rb +65 -0
  32. data/lib/{layers → waves/layers}/mvc/controllers.rb +0 -0
  33. data/lib/{layers → waves/layers}/mvc/extensions.rb +23 -11
  34. data/lib/{layers → waves/layers}/orm/migration.rb +0 -0
  35. data/lib/{layers → waves/layers}/orm/providers/active_record.rb +2 -5
  36. data/lib/{layers → waves/layers}/orm/providers/active_record/migrations/empty.rb.erb +0 -0
  37. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/generate.rb +1 -1
  38. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/schema.rb +1 -1
  39. data/lib/{layers → waves/layers}/orm/providers/data_mapper.rb +0 -0
  40. data/lib/{layers → waves/layers}/orm/providers/filebase.rb +0 -0
  41. data/lib/{layers → waves/layers}/orm/providers/sequel.rb +28 -29
  42. data/lib/{layers → waves/layers}/orm/providers/sequel/migrations/empty.rb.erb +0 -0
  43. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/generate.rb +1 -1
  44. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/schema.rb +2 -0
  45. data/lib/waves/layers/rack/rack_cache.rb +32 -0
  46. data/lib/waves/layers/renderers/erubis.rb +52 -0
  47. data/lib/waves/layers/renderers/haml.rb +67 -0
  48. data/lib/waves/layers/renderers/markaby.rb +41 -0
  49. data/lib/waves/layers/text/inflect/english.rb +42 -0
  50. data/lib/waves/matchers/accept.rb +47 -0
  51. data/lib/waves/matchers/ext.rb +27 -0
  52. data/lib/waves/matchers/path.rb +72 -0
  53. data/lib/waves/matchers/query.rb +43 -0
  54. data/lib/waves/matchers/request.rb +86 -0
  55. data/lib/waves/matchers/requested.rb +31 -0
  56. data/lib/{matchers → waves/matchers}/resource.rb +8 -1
  57. data/lib/waves/matchers/traits.rb +30 -0
  58. data/lib/waves/matchers/uri.rb +69 -0
  59. data/lib/waves/media/mime_types.rb +542 -0
  60. data/lib/waves/renderers/mixin.rb +9 -0
  61. data/lib/waves/request/accept.rb +92 -0
  62. data/lib/{runtime → waves/request}/request.rb +77 -61
  63. data/lib/waves/resources/file_mixin.rb +11 -0
  64. data/lib/{resources → waves/resources}/mixin.rb +42 -44
  65. data/lib/waves/resources/paths.rb +132 -0
  66. data/lib/waves/response/client_errors.rb +10 -0
  67. data/lib/waves/response/packaged.rb +19 -0
  68. data/lib/waves/response/redirects.rb +35 -0
  69. data/lib/{runtime → waves/response}/response.rb +29 -11
  70. data/lib/{runtime → waves/response}/response_mixin.rb +30 -17
  71. data/lib/waves/runtime/applications.rb +18 -0
  72. data/lib/{runtime → waves/runtime}/configuration.rb +31 -25
  73. data/lib/waves/runtime/console.rb +24 -0
  74. data/lib/{runtime → waves/runtime}/logger.rb +3 -3
  75. data/lib/{runtime → waves/runtime}/mocks.rb +2 -2
  76. data/lib/waves/runtime/rackup.rb +37 -0
  77. data/lib/waves/runtime/runtime.rb +48 -0
  78. data/lib/waves/runtime/server.rb +33 -0
  79. data/lib/{servers → waves/servers}/base.rb +0 -0
  80. data/lib/{servers → waves/servers}/mongrel.rb +0 -0
  81. data/lib/{servers → waves/servers}/webrick.rb +0 -0
  82. data/lib/{tasks → waves/tasks}/gem.rb +0 -0
  83. data/lib/{tasks → waves/tasks}/generate.rb +0 -0
  84. data/lib/waves/views/cassy.rb +173 -0
  85. data/lib/{views → waves/views}/errors.rb +8 -7
  86. data/lib/waves/views/mixin.rb +23 -0
  87. data/lib/waves/views/templated.rb +40 -0
  88. data/samples/basic/basic_startup.rb +70 -0
  89. data/samples/basic/config.ru +9 -0
  90. data/samples/blog/configurations/development.rb +17 -16
  91. data/samples/blog/configurations/production.rb +0 -11
  92. data/samples/blog/resources/entry.rb +3 -3
  93. data/samples/blog/resources/map.rb +10 -3
  94. data/samples/blog/startup.rb +4 -3
  95. data/templates/classic/Rakefile +28 -29
  96. data/templates/classic/configurations/default.rb.erb +8 -3
  97. data/templates/classic/configurations/development.rb.erb +1 -20
  98. data/templates/classic/configurations/production.rb.erb +2 -16
  99. data/templates/classic/public/images/favicon.ico +0 -0
  100. data/templates/classic/resources/server.rb.erb +9 -0
  101. data/templates/classic/startup.rb.erb +3 -3
  102. data/templates/classic/views/css.rb.erb +14 -0
  103. data/templates/classic/views/default.rb.erb +17 -0
  104. data/templates/classic/views/errors.rb.erb +10 -0
  105. data/templates/classic/views/pages.rb.erb +14 -0
  106. data/templates/compact/startup.rb.erb +8 -3
  107. data/test/ext/object.rb +55 -0
  108. data/test/ext/shortcuts.rb +73 -0
  109. data/test/helpers.rb +17 -0
  110. data/test/match/accept.rb +78 -0
  111. data/test/match/ext.rb +156 -0
  112. data/test/match/methods.rb +22 -0
  113. data/test/match/params.rb +33 -0
  114. data/test/match/path.rb +106 -0
  115. data/test/match/query.rb +60 -0
  116. data/test/match/request.rb +91 -0
  117. data/test/match/requested.rb +149 -0
  118. data/test/match/uri.rb +136 -0
  119. data/test/process/request.rb +75 -0
  120. data/test/process/resource.rb +53 -0
  121. data/test/resources/path.rb +166 -0
  122. data/test/runtime/configurations.rb +19 -0
  123. data/test/runtime/request.rb +63 -0
  124. data/test/runtime/response.rb +85 -0
  125. data/test/views/views.rb +40 -0
  126. metadata +243 -157
  127. data/lib/caches/memcached.rb +0 -40
  128. data/lib/dispatchers/default.rb +0 -25
  129. data/lib/ext/string.rb +0 -20
  130. data/lib/helpers/basic.rb +0 -11
  131. data/lib/helpers/extended.rb +0 -21
  132. data/lib/helpers/form.rb +0 -42
  133. data/lib/helpers/formatting.rb +0 -30
  134. data/lib/helpers/layouts.rb +0 -37
  135. data/lib/helpers/model.rb +0 -37
  136. data/lib/helpers/view.rb +0 -22
  137. data/lib/layers/inflect/english.rb +0 -67
  138. data/lib/layers/mvc.rb +0 -54
  139. data/lib/layers/renderers/erubis.rb +0 -60
  140. data/lib/layers/renderers/haml.rb +0 -47
  141. data/lib/layers/renderers/markaby.rb +0 -29
  142. data/lib/matchers/accept.rb +0 -21
  143. data/lib/matchers/base.rb +0 -30
  144. data/lib/matchers/content_type.rb +0 -17
  145. data/lib/matchers/path.rb +0 -67
  146. data/lib/matchers/query.rb +0 -21
  147. data/lib/matchers/request.rb +0 -27
  148. data/lib/matchers/traits.rb +0 -19
  149. data/lib/matchers/uri.rb +0 -20
  150. data/lib/renderers/mixin.rb +0 -36
  151. data/lib/resources/paths.rb +0 -34
  152. data/lib/runtime/console.rb +0 -23
  153. data/lib/runtime/mime_types.rb +0 -536
  154. data/lib/runtime/monitor.rb +0 -32
  155. data/lib/runtime/runtime.rb +0 -67
  156. data/lib/runtime/server.rb +0 -20
  157. data/lib/runtime/session.rb +0 -27
  158. data/lib/runtime/worker.rb +0 -86
  159. data/lib/views/mixin.rb +0 -62
  160. data/samples/blog/blog.db +0 -0
  161. data/samples/blog/log/waves.production +0 -3
  162. data/templates/classic/resources/map.rb.erb +0 -8
  163. data/templates/classic/templates/errors/not_found_404.mab +0 -7
  164. data/templates/classic/templates/errors/server_error_500.mab +0 -7
  165. data/templates/classic/templates/layouts/default.mab +0 -14
  166. data/templates/classic/tmp/sessions/.gitignore +0 -0
@@ -0,0 +1,13 @@
1
+ module Waves
2
+ module Helpers
3
+ module Basic
4
+
5
+ # Escape a string as HTML content.
6
+ def escape_html(s); Rack::Utils.escape_html(s); end
7
+
8
+ # Escape a URI, converting quotes and spaces and so on.
9
+ def escape_uri(s); Rack::Utils.escape(s); end
10
+
11
+ end
12
+ end
13
+ end
@@ -27,6 +27,9 @@ module Waves
27
27
  :xhtml2 => "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
28
28
  }
29
29
 
30
+ # Allows you to generate a doctype declaration. Note that if you'll only
31
+ # need this helper if you're not using Hoshi, since Hoshi already provides
32
+ # this built-in.
30
33
  def doctype(type) ; self << DOCTYPES[type||:html4_strict] ; end
31
34
 
32
35
  end
@@ -0,0 +1,94 @@
1
+ module Waves
2
+
3
+ module Helpers
4
+
5
+ # Form helpers are used in generating forms. Since Hoshi already provides Ruby
6
+ # methods for basic form generation, the focus of this helper is on providing methods
7
+ # to handle things that go beyond the basics.
8
+ #
9
+ # Example:
10
+ #
11
+ # editor( @blog.entry, :heading => 'Edit Blog Entry', :method => :put) {
12
+ # property @blog.entry, :name => :title, :type => :text
13
+ # property @blog.entry, :name => :content, :type => :text, :size => large
14
+ # property @blog.entry, :name => :published?, :type => :boolean
15
+ # }
16
+ #
17
+
18
+ module Form
19
+
20
+ def editor( instance, options = {})
21
+ options = { :method => :put, :buttons => true,
22
+ :heading => instance.class.name.in_words.title_case }.merge( options )
23
+ h1 options[:heading] if options[:heading]
24
+ form( :method => :post, :action => paths.put( instance.key ) ) {
25
+ input( :type => :hidden, :name => :_method, :value => :put ) if options[:method] == :put
26
+ div.properties { yield }
27
+ p( :class => 'button panel' ) { submit; cancel } if options[:buttons]
28
+ }
29
+ end
30
+
31
+ def properties(&block)
32
+ fieldset do
33
+ yield
34
+ end
35
+ end
36
+
37
+ def property( instance, options )
38
+ div( :class => "property #{options[:type]} #{options[:size]}") {
39
+ label options[:name].capitalize
40
+ div( :class => 'control' ) { self.send( "#{options[:type]}_field", instance, options ) }
41
+ }
42
+ end
43
+
44
+ def text_field( instance, options )
45
+ if options[:size] == :large
46
+ textarea( instance.send( options[:name] ),
47
+ :name => "#{instance.class.basename.snake_case}.#{options[:name]}" )
48
+ else
49
+ input( :name => "#{instance.class.basename.snake_case}.#{options[:name]}",
50
+ :type => :text, :value => instance.send( options[:name] ) )
51
+ end
52
+ end
53
+
54
+ def integer_field( instance, options )
55
+ input( :name => "#{instance.class.basename.snake_case}.#{options[:name]}",
56
+ :type => :text, :value => instance.send( options[:name] ) )
57
+ end
58
+
59
+ def float_field( instance, options )
60
+ input( :name => "#{instance.class.basename.snake_case}.#{options[:name]}",
61
+ :type => :text, :value => instance.send( options[:name] ) )
62
+ end
63
+
64
+ def boolean_field( instance, options )
65
+ on = instance.send( options[:name] )
66
+ radio_button( 'Yes', "#{instance.class.basename.snake_case}.#{options[:name]}", 't', on )
67
+ radio_button( 'No', "#{instance.class.basename.snake_case}.#{options[:name]}", 'f', !on )
68
+ end
69
+
70
+ def radio_button( label, name, value, on )
71
+ # can't use hoshi input method here thx 2 checked
72
+ span label
73
+ raw( "<input type='radio' name='#{name}' \
74
+ value='#{value}' #{'checked' if on}/>" )
75
+ end
76
+
77
+ def file_field( instance, options )
78
+ input( :type => :file, :name => "#{instance.class.basename.snake_case}.#{options[:name]}" )
79
+ end
80
+
81
+ def submit( label = "Save")
82
+ input :type => :submit, :value => label
83
+ end
84
+
85
+ def cancel( label = "Cancel" )
86
+ a label, :href => 'javascript:window.history.back()'
87
+ end
88
+
89
+
90
+ end
91
+
92
+ end
93
+
94
+ end
@@ -0,0 +1,14 @@
1
+ require 'redcloth'
2
+ module Waves
3
+ module Helpers
4
+
5
+ module Formatting
6
+
7
+ # Treat content as Textile.
8
+ def textile( content )
9
+ raw ::RedCloth.new( content ).to_html
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,65 @@
1
+ module Waves
2
+ module Layers
3
+ module MVC
4
+
5
+ def self.included( app )
6
+
7
+ require 'waves/layers/mvc/extensions'
8
+ require 'waves/layers/mvc/controllers'
9
+ require 'hoshi'
10
+ require 'waves/helpers/basic'
11
+ require 'waves/helpers/formatting'
12
+ require 'waves/helpers/form'
13
+
14
+ app.auto_create_module( :Models ) do
15
+ auto_create_class :Default
16
+ auto_load :Default, :directories => [ :models ]
17
+ auto_create_class true, :Default
18
+ auto_load true, :directories => [ :models ]
19
+ end
20
+
21
+ app.auto_create_module( :Views ) do
22
+ auto_create_class :Default, Hoshi::View[:html4] do
23
+ include Waves::Views::Mixin
24
+ include Waves::Helpers::Basic
25
+ include Waves::Helpers::Formatting
26
+ include Waves::Helpers::Form
27
+ end
28
+ auto_create_class :Templated do
29
+ include Waves::Views::Mixin
30
+ include Waves::Views::Templated
31
+ end
32
+ auto_load :Default, :directories => [ :views ]
33
+ auto_create_class true, :Default
34
+ auto_load true, :directories => [ :views ]
35
+ end
36
+
37
+ app.auto_create_module( :Controllers ) do
38
+ auto_create_class :Default, Waves::Controllers::Base
39
+ auto_load :Default, :directories => [ :controllers ]
40
+ auto_create_class true, :Default
41
+ auto_load true, :directories => [ :controllers ]
42
+ end
43
+
44
+ #
45
+ # We autoload helpers and so forth to emulate Rails technique
46
+ # of having an application-level helper (Default) and then one
47
+ # per view class. However, we only use this with templated views
48
+ # (since mixing in a helper module is sometimes a bit tricky).
49
+ # "Native" Waves views (aka Hoshi) are ordinary classes so they
50
+ # don't really need this, but you can always just include a class
51
+ # level helper and it will automatically pick up your defaults
52
+ # if it is not explicitly defined.
53
+ #
54
+
55
+ app.auto_create_module( :Helpers ) do
56
+ auto_create_module( :Default )
57
+ auto_load :Default, :directories => [ :helpers ]
58
+ auto_create_module( true ) { include app::Helpers::Default }
59
+ auto_load true, :directories => [ :helpers ]
60
+ end
61
+
62
+ end
63
+ end
64
+ end
65
+ end
File without changes
@@ -4,16 +4,6 @@ module Waves
4
4
 
5
5
  module Mixin
6
6
 
7
- def controller( resource = nil )
8
- resource ||= self.class.basename
9
- @controller ||= app::Controllers[ resource ].new( @request )
10
- end
11
-
12
- def view( resource = nil )
13
- resource ||= self.class.basename
14
- @view ||= app::Views[ resource ].new( @request )
15
- end
16
-
17
7
  end
18
8
 
19
9
  end
@@ -32,7 +22,22 @@ module Waves
32
22
  #
33
23
  # to find an instance of a given model. Again, the plurality of the controller and
34
24
  # model must be the same for this to work.
35
- def model; app::Models[ model_name.intern ]; end
25
+ def model( resource = nil )
26
+ resource ||= self.class.basename.snake_case
27
+ app::Models[ resource ]
28
+ end
29
+
30
+ def controller( resource = nil )
31
+ resource ||= self.class.basename.snake_case
32
+ @controller ||= {}
33
+ @controller[resource] ||= app::Controllers[ resource ].new( @request )
34
+ end
35
+
36
+ def view( resource = nil )
37
+ resource ||= self.class.basename.snake_case
38
+ @view ||= {}
39
+ @view[resource] ||= app::Views[ resource ].new( @request )
40
+ end
36
41
 
37
42
  # MVC Params get automatically destructured with the keys as accessors methods.
38
43
  # You can still access the original query by calling request.query
@@ -40,6 +45,13 @@ module Waves
40
45
  @query ||= Waves::Request::Query.new(
41
46
  Waves::Request::Utilities.destructure( request.query ) )
42
47
  end
48
+
49
+ # Both the query and capture merged together
50
+ def params
51
+ @params ||= Waves::Request::Query.new( captured ?
52
+ Waves::Request::Utilities.destructure( request.query ).merge( captured.to_h ) :
53
+ Waves::Request::Utilities.destructure( request.query ) )
54
+ end
43
55
 
44
56
  # Attributes are just the query elements specific to the model associated with
45
57
  # the current resource.
File without changes
@@ -34,18 +34,15 @@ module Waves
34
34
  end
35
35
 
36
36
  app.auto_create_module( :Models ) do
37
- include AutoCode
38
37
  auto_create_class :Default, ::ActiveRecord::Base
39
38
  auto_load :Default, :directories => [ :models ]
40
- end
41
-
42
- app.auto_eval :Models do
43
39
  auto_create_class true, app::Models::Default
44
40
  auto_load true, :directories => [ :models ]
45
41
 
46
42
  auto_eval true do
43
+ next if self.basename == "Default"
47
44
  app.database
48
- set_table_name basename.snake_case.pluralize.intern
45
+ set_table_name self.basename.snake_case.pluralize.intern
49
46
  end
50
47
  end
51
48
 
@@ -6,7 +6,7 @@ namespace :generate do
6
6
  model_name = name.camel_case
7
7
  raise "Cannot generate Default yet" if model_name == 'Default'
8
8
 
9
- filename = File.expand_path "models/#{name}.rb"
9
+ filename = File.expand_path "models/#{model_name}.rb"
10
10
  if File.exist?(filename)
11
11
  $stderr.puts "#{filename} already exists"
12
12
  exit
@@ -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
 
@@ -1,7 +1,7 @@
1
1
  module Waves
2
2
  module Layers
3
3
  module ORM # :nodoc:
4
-
4
+
5
5
  # The Sequel ORM layer sets up the Sequel connection and configures AutoCode on Models, so that constants in that
6
6
  # namespace get loaded from file or created as subclasses of Models::Default. The dataset for models is set to the
7
7
  # snakecased version of the model's class name.
@@ -10,7 +10,7 @@ module Waves
10
10
  # - creates on the application module a database method that establishes the Sequel connection
11
11
  # - arranges for autoloading/autocreation of missing constants in the Models namespace
12
12
  # - defines Sequel-specific helper methods on Waves::Controllers::Base
13
- #
13
+ #
14
14
  # The controller helper methdods are:
15
15
  # - all
16
16
  # - find(name)
@@ -18,45 +18,43 @@ module Waves
18
18
  # - delete(name)
19
19
  # - update(name)
20
20
  #
21
-
22
-
21
+
22
+
23
23
  def self.included(app)
24
-
25
24
  gem 'sequel', '>= 2.0.0'
26
25
  require 'sequel'
27
26
  require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
28
27
  require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
29
-
30
- def app.database ; @sequel ||= ::Sequel.open( Waves.config.database ) ; end
31
-
28
+
29
+ def app.database ; @sequel ||= ::Sequel.connect( Waves.config.database ) ; end
30
+
31
+ app.database.loggers << Waves.log
32
+
32
33
  app.auto_create_module( :Models ) do
33
- include AutoCode
34
34
  auto_create_class :Default, ::Sequel::Model
35
35
  auto_load :Default, :directories => [ :models ]
36
- end
37
-
38
- app.auto_eval :Models do
39
- auto_create_class true, app::Models::Default
36
+ auto_create_class true, :Default
40
37
  auto_load true, :directories => [ :models ]
38
+
41
39
  # set the Sequel dataset based on the model class name
42
- # note that this is not done for app::Models::Default, as it isn't
40
+ # note that this is not done for app::Models::Default, as it isn't
43
41
  # supposed to represent a table
44
42
  auto_eval true do
45
- default = superclass.basename.snake_case.pluralize.intern
43
+ next if self.basename == "Default"
44
+ default = self.superclass.basename.snake_case.pluralize.intern
46
45
  if @dataset && @dataset.opts[:from] != [ default ]
47
46
  # don't clobber dataset from autoloaded file
48
- else
49
- if respond_to? :set_dataset
50
- set_dataset Waves.main.database[ basename.snake_case.pluralize.intern ]
51
- end
47
+ elsif respond_to? :set_dataset
48
+ set_dataset Waves.main.database[ basename.snake_case.pluralize.intern ]
52
49
  end
53
50
  end
51
+
54
52
  end
55
-
53
+
56
54
  Waves::Controllers::Base.instance_eval do
57
55
  include Waves::Layers::ORM::Sequel::ControllerMethods
58
56
  end
59
-
57
+
60
58
  end
61
59
 
62
60
  # Mixed into Waves::Controllers::Base. Provides ORM-specific helper methods for model access.
@@ -64,27 +62,28 @@ module Waves
64
62
  def all
65
63
  model.all
66
64
  end
67
-
65
+
68
66
  def find( name )
69
67
  model[ :name => name ] or not_found
70
68
  end
71
-
72
- def create
73
- model.create( attributes.to_hash )
69
+
70
+ def create(attrs = nil)
71
+ ats = attrs || attributes
72
+ model.create( ats.to_hash )
74
73
  end
75
-
74
+
76
75
  def delete( name )
77
76
  find( name ).destroy
78
77
  end
79
-
78
+
80
79
  def update( name )
81
80
  instance = find( name )
82
81
  instance.update_with_params( attributes.to_hash )
83
82
  instance
84
83
  end
85
84
  end
86
-
87
- end
85
+
86
+ end
88
87
  end
89
88
  end
90
89
  end
@@ -8,7 +8,7 @@ namespace :generate do
8
8
 
9
9
  raise "Cannot generate Default yet" if model_name == 'Default'
10
10
 
11
- filename = File.expand_path "models/#{name}.rb"
11
+ filename = File.expand_path "models/#{model_name}.rb"
12
12
  if File.exist?(filename)
13
13
  $stderr.puts "#{filename} already exists"
14
14
  exit
@@ -1,4 +1,5 @@
1
1
  require "#{File.dirname(__FILE__)}/../../../migration"
2
+ require 'sequel/extensions/migration'
2
3
 
3
4
  namespace :schema do
4
5
 
@@ -9,6 +10,7 @@ namespace :schema do
9
10
 
10
11
  desc "Performs Sequel migrations to version=<version>"
11
12
  task :migrate do |task|
13
+
12
14
  version = ENV['version']; version = version.to_i unless version.nil?
13
15
  Sequel::Migrator.apply( Waves.main.database, Waves::Layers::ORM.migration_directory , version )
14
16
  end