waves 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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