GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Rubygem
Description: Resource-oriented open source Ruby framework for Web apps.
Homepage: http://rubywaves.com/
Clone URL: git://github.com/dyoder/waves.git
Further improvements, but still a bit shaky.
dyoder (author)
Sun Jun 22 13:06:03 -0700 2008
commit  435b06a0e80708dbe252b0e2c02ebc548357687b
tree    ae88be00e0865c7198cf9d7be2f4d518d3b8ab5e
parent  a431a103b334a78f21de3a46935a7b89bdf7f496
...
63
64
65
66
67
68
69
70
 
 
 
 
 
71
72
73
...
63
64
65
 
 
 
 
 
66
67
68
69
70
71
72
73
0
@@ -63,11 +63,11 @@ module Waves
0
 
0
           auto_eval :Resources do
0
             const_set( :Default, Class.new( Waves::Resources::Base ) ).module_eval do
0
- def __c ; @controller ||= controllers[ resource ].process( @request ) { self } ; end
0
- def __v ; @view ||= views[ resource ].process( @request ) { self } ; end
0
- def action( method, *args ) ; @data = __c.send( method, *args ) ; end
0
- def render( method ) ; puts "RENDER: #{resource}"; __v.send( method, ( @data.kind_of?( Enumerable ) ? resources : resource ) => @data ) ; end
0
- def method_missing( name, *args, &block) ; params[ name ] ; end
0
+ def controller ; @controller ||= controllers[ resource ].process( @request ) { self } ; end
0
+ def view ; @view ||= views[ resource ].process( @request ) { self } ; end
0
+ def action( method, *args ) ; @data = controller.send( method, *args ) ; end
0
+ def render( method ) ; view.send( method, ( @data.kind_of?( Enumerable ) ? resources : resource ) => @data ) ; end
0
+ def method_missing( name, *args, &block) ; params[ name.to_s ] ; end
0
             end
0
             auto_create_class true, self::Default
0
           end
...
21
22
23
24
 
25
26
27
28
 
29
30
31
...
42
43
44
45
46
47
48
 
49
50
51
52
53
54
55
56
57
58
...
21
22
23
 
24
25
26
27
 
28
29
30
31
...
42
43
44
 
 
 
 
45
46
 
47
 
 
 
48
49
50
51
0
@@ -21,11 +21,11 @@ module Waves
0
         resource.paths.instance_eval { meta_def name, &pattern.generator }
0
       end
0
       
0
- def bind( request )
0
+ def bind( request )
0
         ( constraints.satisfy?( request ) and
0
           ( params = pattern.match( request ) ) and Binding.new( self, params ) )
0
       end
0
-
0
+
0
       def threaded?
0
         descriptors.threaded?
0
       end
0
@@ -42,16 +42,9 @@ module Waves
0
         request.params.merge!( @params )
0
         @action.resource.new( request ).send( @action.name )
0
       end
0
-<<<<<<< HEAD:lib/mapping/action.rb
0
-
0
-=======
0
->>>>>>> 9e678f5274615fb8c31a88f62a9119e5e4c78c8a:lib/mapping/action.rb
0
+
0
     end
0
-<<<<<<< HEAD:lib/mapping/action.rb
0
     
0
-=======
0
-
0
->>>>>>> 9e678f5274615fb8c31a88f62a9119e5e4c78c8a:lib/mapping/action.rb
0
   end
0
 
0
 end
0
\ No newline at end of file
...
17
18
19
20
 
21
22
23
24
25
26
27
 
28
29
30
31
32
 
33
34
 
 
 
 
 
 
35
36
37
38
39
 
 
40
41
42
...
17
18
19
 
20
21
22
23
24
25
26
 
27
28
29
30
31
32
33
34
 
35
36
37
38
39
40
41
42
43
44
 
45
46
47
48
49
0
@@ -17,26 +17,33 @@ module Waves
0
       
0
       def match( request )
0
        return false unless m = @pattern.match( request.send( target ) )
0
- returning( Hash.new ) { | r | @keys.zip( m[1..-1] ) { | k, v | r[ k ] = v } }
0
+ zip( @keys, m[1..-1] )
0
       end
0
       
0
       private
0
       
0
       functor( :compile, Array ) do | path |
0
         @generator = lambda { |*args| self.instance_eval { generate( path, args ) } }
0
- @pattern = Regexp.new( path.map { |component| compile( component ) }.join('/') )
0
+ @pattern = Regexp.new( '^/' + path.map { |component| compile( component ) }.join('/') + '/?$' )
0
       end
0
       
0
       functor( :compile, String ) { |s| Regexp.escape( s ) }
0
       functor( :compile, Regexp ) { |re| s }
0
       functor( :compile, Symbol ) { |sy| @keys << sy.to_s ; '([\w\_\-\#]+)' }
0
+ functor( :compile, Hash ) { |h| @keys << h; '([\w\_\-\#]+)?' }
0
 
0
- functor( :generate, Array, Array ) { | keys, vals | keys.map { |key| generate( key, vals ) }.join('/') }
0
+ # this is a bit different than Array#zip ...
0
+ functor( :zip, Array, Array ) { | keys, vals | keys.inject( {} ) { | h, key | n, m = zip( key, vals ) ; h[ n ] = m ; h } }
0
+ functor( :zip, String, Array ) { | key, vals | [ key, vals.shift ] }
0
+ functor( :zip, Hash, Array ) { | h, vals | key = h.keys.first ; [ key.to_s, ( vals.shift || h[ key ] ) ] }
0
+
0
+ functor( :generate, Array, Array ) { | keys, vals | keys.map { |key| generate( key, vals ) }.compact.join('/') }
0
       functor( :generate, :resource, Array ) { | key, vals | resource }
0
       functor( :generate, :resources, Array ) { | key, vals | resources }
0
       functor( :generate, Symbol, Array ) { | key, vals | generate( key, vals.shift ) }
0
       functor( :generate, Symbol, Symbol ) { | key, val | val }
0
- functor( :generate, Regexp, Array ) { | key, vals | raise ArgumentError.new( "Can't generate a path from Regexp." ) }
0
+ functor( :generate, Regexp, Array ) { | key, vals | nil }
0
+ functor( :generate, Hash, Array ) { | h, vals | vals.shift || h.values.first }
0
       
0
     end
0
 
...
7
8
9
10
 
11
12
13
14
15
16
17
18
19
 
 
20
21
22
...
7
8
9
 
10
11
12
13
14
15
 
 
16
 
17
18
19
20
21
0
@@ -7,16 +7,15 @@ module Blog
0
       extend Waves::Mapping
0
       
0
       # specific to comments - on create redirect to the entry, not the comment itself
0
- path :create, :resource => :comment, :post => [ :comments ] do
0
+ path :create, :resource => :comment, :post => [ '/comments' ] do
0
         redirect( Blog::Resources::Entries.paths.show( action( :create ).entry.name ) )
0
       end
0
       
0
       # defaults for generic resources
0
       path( :list, :get => [ :resources ] ) { action( :all ) and render( :list ) }
0
- path( :show, :get => [ :resource, :name ] ) { action( :find, name ) and render( :show ) }
0
- path( :edit, :get => [ :resource, :name, :view ] ) { action( :find, name ) and render( view ) }
0
       path( :create, :post => [ :resources ] ) { redirect( paths.edit( action( :create ).name ) ) }
0
- path( :update, :post => [ :resource, :name ] ) { action( :update, name ) and redirect( paths.show( name ) ) }
0
+ path( :read, :get => [ :resource, :name, { :mode => 'show' } ] ) { action( :find, name ) and render( mode ) }
0
+ path( :update, :put => [ :resource, :name ] ) { action( :update, name ) and redirect( paths.show( name ) ) }
0
       path( :delete, :delete => [ :resource, :name ] ) { action( :delete, name ) }
0
       
0
     end

Comments

    No one has commented yet.