wee 0.5.0 → 0.6.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 (157) hide show
  1. data/ChangeLog +132 -0
  2. data/INSTALL +13 -3
  3. data/README +3 -3
  4. data/Rakefile +5 -1
  5. data/bin/wee +100 -0
  6. data/doc/rdoc/classes/Array.html +12 -12
  7. data/doc/rdoc/classes/Cache/StorageCache.html +38 -38
  8. data/doc/rdoc/classes/Cache/Strategy/CapacityBounded.html +30 -30
  9. data/doc/rdoc/classes/Cache/Strategy/LFU.html +24 -24
  10. data/doc/rdoc/classes/Cache/Strategy/LRU.html +24 -24
  11. data/doc/rdoc/classes/Cache/Strategy/Unbounded.html +24 -24
  12. data/doc/rdoc/classes/Enumerable.html +6 -6
  13. data/doc/rdoc/classes/Main.html +265 -0
  14. data/doc/rdoc/classes/Object.html +12 -12
  15. data/doc/rdoc/classes/OgApplication.html +2 -2
  16. data/doc/rdoc/classes/OgScaffolder.html +444 -64
  17. data/doc/rdoc/classes/OgScaffolder/Editor.html +490 -0
  18. data/doc/rdoc/classes/OgSession.html +4 -4
  19. data/doc/rdoc/classes/Recipe.html +113 -0
  20. data/doc/rdoc/classes/String.html +12 -12
  21. data/doc/rdoc/classes/Struct.html +12 -12
  22. data/doc/rdoc/classes/Wee.html +10 -1
  23. data/doc/rdoc/classes/Wee/AnswerDecoration.html +9 -9
  24. data/doc/rdoc/classes/Wee/Application.html +48 -47
  25. data/doc/rdoc/classes/Wee/Brush.html +19 -23
  26. data/doc/rdoc/classes/Wee/Brush/AnchorTag.html +17 -14
  27. data/doc/rdoc/classes/Wee/Brush/FileUploadTag.html +20 -14
  28. data/doc/rdoc/classes/Wee/Brush/FormTag.html +25 -21
  29. data/doc/rdoc/classes/Wee/Brush/GenericEncodedTextBrush.html +12 -12
  30. data/doc/rdoc/classes/Wee/Brush/GenericSingleTagBrush.html +7 -7
  31. data/doc/rdoc/classes/Wee/Brush/GenericTagBrush.html +234 -100
  32. data/doc/rdoc/classes/Wee/Brush/GenericTextBrush.html +12 -12
  33. data/doc/rdoc/classes/Wee/Brush/ImageButtonTag.html +28 -22
  34. data/doc/rdoc/classes/Wee/Brush/ImageTag.html +23 -24
  35. data/doc/rdoc/classes/Wee/Brush/InputTag.html +14 -14
  36. data/doc/rdoc/classes/Wee/Brush/JavascriptTag.html +7 -7
  37. data/doc/rdoc/classes/Wee/Brush/Page.html +14 -14
  38. data/doc/rdoc/classes/Wee/Brush/SelectListTag.html +33 -57
  39. data/doc/rdoc/classes/Wee/Brush/SelectListTag/SelectListCallback.html +154 -0
  40. data/doc/rdoc/classes/Wee/Brush/SelectOptionTag.html +7 -7
  41. data/doc/rdoc/classes/Wee/Brush/SubmitButtonTag.html +20 -14
  42. data/doc/rdoc/classes/Wee/Brush/TableDataTag.html +14 -14
  43. data/doc/rdoc/classes/Wee/Brush/TableHeaderTag.html +7 -7
  44. data/doc/rdoc/classes/Wee/Brush/TableRowTag.html +42 -42
  45. data/doc/rdoc/classes/Wee/Brush/TableTag.html +7 -7
  46. data/doc/rdoc/classes/Wee/Brush/TextAreaTag.html +27 -21
  47. data/doc/rdoc/classes/Wee/Brush/TextInputTag.html +20 -14
  48. data/doc/rdoc/classes/Wee/CallbackRegistry.html +64 -36
  49. data/doc/rdoc/classes/Wee/CallbackStream.html +21 -21
  50. data/doc/rdoc/classes/Wee/Canvas.html +24 -24
  51. data/doc/rdoc/classes/Wee/Component.html +179 -151
  52. data/doc/rdoc/classes/Wee/Component/OnAnswer.html +12 -12
  53. data/doc/rdoc/classes/Wee/Decoration.html +42 -42
  54. data/doc/rdoc/classes/Wee/Delegate.html +27 -27
  55. data/doc/rdoc/classes/Wee/ErrorResponse.html +14 -14
  56. data/doc/rdoc/classes/Wee/FormDecoration.html +6 -6
  57. data/doc/rdoc/classes/Wee/GenericResponse.html +7 -7
  58. data/doc/rdoc/classes/Wee/HtmlCanvas.html +326 -219
  59. data/doc/rdoc/classes/Wee/HtmlWriter.html +40 -40
  60. data/doc/rdoc/classes/Wee/LiteralMethodCallback.html +19 -19
  61. data/doc/rdoc/classes/Wee/Md5IdGenerator.html +181 -0
  62. data/doc/rdoc/classes/Wee/MessageBox.html +12 -12
  63. data/doc/rdoc/classes/Wee/PageDecoration.html +18 -18
  64. data/doc/rdoc/classes/Wee/PagelessApplication.html +152 -0
  65. data/doc/rdoc/classes/Wee/PagelessRequest.html +177 -0
  66. data/doc/rdoc/classes/Wee/PagelessSession.html +320 -0
  67. data/doc/rdoc/classes/Wee/Presenter.html +145 -89
  68. data/doc/rdoc/classes/Wee/RedirectResponse.html +7 -7
  69. data/doc/rdoc/classes/Wee/RefreshResponse.html +7 -7
  70. data/doc/rdoc/classes/Wee/Request.html +116 -50
  71. data/doc/rdoc/classes/Wee/RequestHandler.html +31 -31
  72. data/doc/rdoc/classes/Wee/Response.html +76 -28
  73. data/doc/rdoc/classes/Wee/Session.html +129 -506
  74. data/doc/rdoc/classes/Wee/SimpleIdGenerator.html +22 -40
  75. data/doc/rdoc/classes/Wee/Snapshot.html +19 -19
  76. data/doc/rdoc/classes/Wee/Utils.html +70 -17
  77. data/doc/rdoc/classes/Wee/Utils/LRUCache.html +6 -6
  78. data/doc/rdoc/classes/Wee/ValueHolder.html +18 -18
  79. data/doc/rdoc/classes/Wee/WEBrickAdaptor.html +82 -49
  80. data/doc/rdoc/classes/Wee/WrapperDecoration.html +6 -6
  81. data/doc/rdoc/created.rid +1 -1
  82. data/doc/rdoc/files/INSTALL.html +17 -5
  83. data/doc/rdoc/files/README.html +9 -11
  84. data/doc/rdoc/files/lib/wee/adaptors/webrick_rb.html +1 -1
  85. data/doc/rdoc/files/lib/wee/application_rb.html +1 -1
  86. data/doc/rdoc/files/lib/wee/components/page_decoration_rb.html +1 -1
  87. data/doc/rdoc/files/lib/wee/continuation/session_rb.html +1 -3
  88. data/doc/rdoc/files/lib/wee/core/callback_rb.html +1 -1
  89. data/doc/rdoc/files/lib/wee/core/component_rb.html +1 -1
  90. data/doc/rdoc/files/lib/wee/core_rb.html +3 -3
  91. data/doc/rdoc/files/lib/wee/databases/og/application_rb.html +101 -0
  92. data/doc/rdoc/files/lib/wee/databases/og/old_scaffolder_rb.html +101 -0
  93. data/doc/rdoc/files/lib/wee/databases/og/scaffolder_rb.html +108 -0
  94. data/doc/rdoc/files/lib/wee/databases/og/session_rb.html +101 -0
  95. data/doc/rdoc/files/lib/wee/databases/og_rb.html +4 -1
  96. data/doc/rdoc/files/lib/wee/idgen/md5_rb.html +115 -0
  97. data/doc/rdoc/files/lib/wee/idgen/simple_rb.html +107 -0
  98. data/doc/rdoc/files/lib/wee/pageless/application_rb.html +101 -0
  99. data/doc/rdoc/files/lib/wee/pageless/request_rb.html +101 -0
  100. data/doc/rdoc/files/lib/wee/pageless/session_rb.html +108 -0
  101. data/doc/rdoc/files/lib/wee/pageless_rb.html +110 -0
  102. data/doc/rdoc/files/lib/wee/renderer/html/brushes_rb.html +1 -1
  103. data/doc/rdoc/files/lib/wee/renderer/html/canvas_rb.html +8 -1
  104. data/doc/rdoc/files/lib/wee/request_rb.html +1 -1
  105. data/doc/rdoc/files/lib/wee/response_rb.html +1 -1
  106. data/doc/rdoc/files/lib/wee/session_rb.html +1 -1
  107. data/doc/rdoc/files/lib/wee/skeleton/og/components/main_rb.html +101 -0
  108. data/doc/rdoc/files/lib/wee/skeleton/og/conf/db_rb.html +114 -0
  109. data/doc/rdoc/files/lib/wee/skeleton/og/models/recipe_rb.html +101 -0
  110. data/doc/rdoc/files/lib/wee/skeleton/og/run_rb.html +115 -0
  111. data/doc/rdoc/files/lib/wee/skeleton/simple/components/main_rb.html +101 -0
  112. data/doc/rdoc/files/lib/wee/skeleton/simple/run_rb.html +111 -0
  113. data/doc/rdoc/files/lib/wee/template_rb.html +101 -0
  114. data/doc/rdoc/files/lib/wee/utils/autoreload_rb.html +1 -1
  115. data/doc/rdoc/files/lib/wee/utils/helper_rb.html +1 -1
  116. data/doc/rdoc/files/lib/wee_rb.html +4 -2
  117. data/doc/rdoc/fr_class_index.html +8 -4
  118. data/doc/rdoc/fr_file_index.html +17 -1
  119. data/doc/rdoc/fr_method_index.html +312 -267
  120. data/examples/live-update.rb +1 -1
  121. data/install.rb +14 -0
  122. data/lib/wee.rb +6 -2
  123. data/lib/wee/adaptors/webrick.rb +17 -5
  124. data/lib/wee/application.rb +2 -1
  125. data/lib/wee/continuation/session.rb +1 -146
  126. data/lib/wee/core/callback.rb +11 -5
  127. data/lib/wee/core/component.rb +14 -10
  128. data/lib/wee/databases/og.rb +3 -113
  129. data/lib/wee/databases/og/application.rb +3 -0
  130. data/lib/wee/databases/og/old_scaffolder.rb +98 -0
  131. data/lib/wee/databases/og/scaffolder.rb +174 -0
  132. data/lib/wee/databases/og/session.rb +9 -0
  133. data/lib/wee/idgen/md5.rb +21 -0
  134. data/lib/wee/{idgen.rb → idgen/simple.rb} +2 -4
  135. data/lib/wee/pageless.rb +3 -0
  136. data/lib/wee/pageless/application.rb +9 -0
  137. data/lib/wee/pageless/request.rb +15 -0
  138. data/lib/wee/pageless/session.rb +89 -0
  139. data/lib/wee/renderer/html/brushes.rb +100 -115
  140. data/lib/wee/renderer/html/canvas.rb +32 -2
  141. data/lib/wee/request.rb +36 -24
  142. data/lib/wee/response.rb +8 -1
  143. data/lib/wee/session.rb +13 -7
  144. data/lib/wee/skeleton/og/README +38 -0
  145. data/lib/wee/skeleton/og/components/main.rb +16 -0
  146. data/lib/wee/skeleton/og/conf/db.rb +8 -0
  147. data/lib/wee/skeleton/og/models/recipe.rb +5 -0
  148. data/lib/wee/skeleton/og/run.rb +23 -0
  149. data/lib/wee/skeleton/simple/README +32 -0
  150. data/lib/wee/skeleton/simple/components/main.rb +25 -0
  151. data/lib/wee/skeleton/simple/run.rb +12 -0
  152. data/lib/wee/template.rb +28 -0
  153. data/lib/wee/utils/autoreload.rb +29 -0
  154. data/lib/wee/utils/helper.rb +9 -5
  155. data/test/test_request.rb +4 -3
  156. data/wee.gemspec +3 -1
  157. metadata +91 -22
@@ -30,7 +30,7 @@ class LiveUpdateTest < Wee::Component
30
30
  # simply omit this and just return the response with some html/xml filled
31
31
  # in.
32
32
  rendering_context = Wee::RenderingContext.new(context.request,
33
- context.response, session.current_page.callbacks,
33
+ context.response, session.current_callbacks,
34
34
  Wee::HtmlWriter.new(response.content))
35
35
 
36
36
  with_renderer_for(rendering_context) do
data/install.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'rbconfig'
2
+ require 'ftools'
3
+
4
+ # Install lib
5
+ dst_dir = Config::CONFIG['sitelibdir']
6
+ Dir.chdir('lib') {
7
+ Dir['**/*'].reject {|f| f =~ /\.svn($|\/)/ or not File.file?(f) }.each {|file|
8
+ File.mkpath File.join(dst_dir, File.dirname(file)), true
9
+ File.install file, File.join(dst_dir, file), 0644, true
10
+ }
11
+ }
12
+
13
+ # Install bin
14
+ File.install 'bin/wee', File.join(Config::CONFIG['bindir'], 'wee'), 0755, true
data/lib/wee.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Wee
2
- Version = "0.5.0"
2
+ Version = "0.6.0"
3
+ LibPath = File.dirname(__FILE__)
3
4
  end
4
5
 
5
6
  require 'wee/core'
@@ -14,9 +15,12 @@ require 'wee/session'
14
15
  require 'wee/components'
15
16
  require 'wee/snapshot_ext'
16
17
 
18
+ require 'wee/template'
19
+
17
20
  require 'wee/renderer/html/writer'
18
21
  require 'wee/renderer/html/brushes'
19
22
  require 'wee/renderer/html/canvas'
20
23
  Wee::DefaultRenderer = Wee::HtmlCanvas
21
24
 
22
- require 'wee/idgen'
25
+ require 'wee/idgen/simple'
26
+ require 'wee/idgen/md5'
@@ -13,6 +13,7 @@ require 'webrick'
13
13
  #
14
14
  # require 'wee/adaptors/webrick'
15
15
  # Wee::WEBrickAdaptor.
16
+ # request_class(Wee::Request). # this is the default!
16
17
  # register('/app' => application).
17
18
  # register('/cnt' => application2).
18
19
  # mount('/', WEBrick::HTTPServlet::FileHandler, '.').
@@ -28,8 +29,8 @@ class Wee::WEBrickAdaptor < WEBrick::HTTPServlet::AbstractServlet
28
29
  server = WEBrick::HTTPServer.new({:Port => 2000}.update(options))
29
30
  trap("INT") { server.shutdown }
30
31
 
31
- (@apps||[]).each do |path, app|
32
- server.mount(path, self, path, app)
32
+ (@apps||[]).each do |path, app, request_class|
33
+ server.mount(path, self, path, app, request_class)
33
34
  end
34
35
 
35
36
  (@mounts||[]).each do |args, block|
@@ -42,11 +43,18 @@ class Wee::WEBrickAdaptor < WEBrick::HTTPServlet::AbstractServlet
42
43
  server
43
44
  end
44
45
 
46
+ # Sets the used request_class for all following calls to #register
47
+
48
+ def self.request_class(request_class)
49
+ @request_class = request_class
50
+ self
51
+ end
52
+
45
53
  # Convenience method
46
54
  def self.register(hash)
47
55
  @apps ||= []
48
56
  hash.each do |path, application|
49
- @apps << [path, application]
57
+ @apps << [path, application, @request_class]
50
58
  end
51
59
  self
52
60
  end
@@ -58,18 +66,22 @@ class Wee::WEBrickAdaptor < WEBrick::HTTPServlet::AbstractServlet
58
66
  self
59
67
  end
60
68
 
61
- def initialize(server, mount_path, application)
69
+ def initialize(server, mount_path, application, request_class=Wee::Request)
62
70
  super(server)
63
71
  @mount_path = mount_path
64
72
  @application = application
73
+ @request_class = request_class || Wee::Request
65
74
  end
66
75
 
67
76
  def handle_request(req, res)
68
- context = Wee::Context.new(Wee::Request.new(@mount_path, req.path, req.header, req.query))
77
+ context = Wee::Context.new(@request_class.new(@mount_path, req.path, req.header, req.query, req.cookies))
69
78
  @application.handle_request(context)
70
79
  res.status = context.response.status
71
80
  res.body = context.response.content
72
81
  context.response.header.each { |k,v| res.header[k] = v }
82
+ if context.response.cookies?
83
+ context.response.cookies.each {|c| res.cookies << c }
84
+ end
73
85
  end
74
86
 
75
87
  alias do_GET handle_request
@@ -76,7 +76,8 @@ class Wee::Application
76
76
  @request_handlers[request_handler_id] = request_handler
77
77
  }
78
78
 
79
- context.response = Wee::RedirectResponse.new(context.request.build_url(request_handler_id))
79
+ context.request.request_handler_id = request_handler_id
80
+ handle_request(context)
80
81
  return
81
82
 
82
83
  elsif request_handler.nil?
@@ -1,16 +1,6 @@
1
- require 'wee/page'
2
- require 'thread'
3
1
  require 'timeout'
4
2
 
5
- class Wee::Session < Wee::RequestHandler
6
- attr_accessor :root_component, :page_store
7
-
8
- def self.current
9
- sess = Thread.current[:wee_session]
10
- raise "not in session" if sess.nil?
11
- return sess
12
- end
13
-
3
+ class Wee::Session
14
4
  def initialize(&block)
15
5
  Thread.current[:wee_session] = self
16
6
 
@@ -30,11 +20,6 @@ class Wee::Session < Wee::RequestHandler
30
20
  Thread.current[:wee_session] = nil
31
21
  end
32
22
 
33
- def snapshot
34
- @root_component.backtrack_state_chain(snap = Wee::Snapshot.new)
35
- return snap.freeze
36
- end
37
-
38
23
  # called by application to send the session a request
39
24
  def handle_request(context)
40
25
  super
@@ -84,134 +69,4 @@ class Wee::Session < Wee::RequestHandler
84
69
  }
85
70
  end
86
71
 
87
- def create_page(snapshot)
88
- idgen = Wee::SimpleIdGenerator.new
89
- page = Wee::Page.new(snapshot, Wee::CallbackRegistry.new(idgen))
90
- end
91
-
92
- # Is called before process_request is invoked
93
- # Can be used to setup e.g. a database connection.
94
- def awake
95
- end
96
-
97
- # Is called after process_request is run
98
- # Can be used to release e.g. a database connection.
99
- def sleep
100
- end
101
-
102
- def process_request
103
- if @context.request.page_id.nil?
104
-
105
- # No page_id was specified in the URL. This means that we start with a
106
- # fresh component and a fresh page_id, then redirect to render itself.
107
-
108
- handle_new_page_view(@context, @initial_snapshot)
109
-
110
- elsif @page = @page_store.fetch(@context.request.page_id, false)
111
-
112
- # A valid page_id was specified and the corresponding page exists.
113
-
114
- @page.snapshot.restore
115
-
116
- p @context.request.fields if $DEBUG
117
-
118
- if @context.request.fields.empty?
119
-
120
- # No action/inputs were specified -> render page
121
- #
122
- # 1. Reset the action/input fields (as they are regenerated in the
123
- # rendering process).
124
- # 2. Render the page (respond).
125
- # 3. Store the page back into the store
126
-
127
- @page = create_page(@page.snapshot) # remove all action/input handlers
128
- respond(@context, @page.callbacks) # render
129
- @page_store[@context.request.page_id] = @page # store
130
-
131
- else
132
-
133
- # Actions/inputs were specified.
134
- #
135
- # We process the request and invoke actions/inputs. Then we generate a
136
- # new page view.
137
-
138
- callback_stream = Wee::CallbackStream.new(@page.callbacks, @context.request.fields)
139
-
140
- if callback_stream.all_of_type(:action).size > 1
141
- raise "Not allowed to specify more than one action callback"
142
- end
143
-
144
- live_update_response = catch(:wee_live_update) {
145
- catch(:wee_back_to_session) {
146
- @root_component.process_callbacks_chain(callback_stream)
147
- }
148
- nil
149
- }
150
-
151
- if live_update_response
152
- # replace existing page with new snapshot
153
- @page.snapshot = self.snapshot
154
- @page_store[@context.request.page_id] = @page
155
- @context.response = live_update_response
156
- else
157
- handle_new_page_view(@context)
158
- end
159
-
160
- end
161
-
162
- else
163
-
164
- # A page_id was specified in the URL, but there's no page for it in the
165
- # page store. Either the page has timed out, or an invalid page_id was
166
- # specified.
167
- #
168
- # TODO:: Display an "invalid page or page timed out" message, which
169
- # forwards to /app/session-id
170
-
171
- raise "Not yet implemented"
172
-
173
- end
174
- end
175
-
176
- def current_context
177
- @context
178
- end
179
-
180
- def current_page
181
- @page
182
- end
183
-
184
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
185
- # :section: Properties
186
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
187
-
188
- attr_accessor :properties
189
-
190
- # Returns an "owned" property for the given +klass+.
191
-
192
- def get_property(prop, klass)
193
- if @properties
194
- @properties.fetch(klass, {})[prop]
195
- else
196
- nil
197
- end
198
- end
199
-
200
- private
201
-
202
- def handle_new_page_view(context, snapshot=nil)
203
- new_page_id = @idgen.next.to_s
204
- new_page = create_page(snapshot || self.snapshot())
205
- @page_store[new_page_id] = new_page
206
- redirect_url = context.request.build_url(context.request.request_handler_id, new_page_id)
207
- context.response = Wee::RedirectResponse.new(redirect_url)
208
- end
209
-
210
- def respond(context, callbacks)
211
- context.response = Wee::GenericResponse.new('text/html', '')
212
-
213
- rctx = Wee::RenderingContext.new(context.request, context.response, callbacks, Wee::HtmlWriter.new(context.response.content))
214
- @root_component.do_render_chain(rctx)
215
- end
216
-
217
72
  end
@@ -17,9 +17,15 @@ class Wee::CallbackRegistry
17
17
  # Register +callback+ for +object+ under +type+ and return a unique callback id.
18
18
 
19
19
  def register_for(object, type, callback)
20
+ register_named_for(object, type, callback, @idgen.next)
21
+ end
22
+
23
+ # Register +callback+ for +object+ under +type+ with the id +named_id+.
24
+
25
+ def register_named_for(object, type, callback, named_id)
26
+ cid = named_id.to_s
20
27
  c = (@callbacks[type] ||= Hash.new)
21
28
  o = (@obj_to_id_map[type] ||= Hash.new)
22
- cid = @idgen.next.to_s
23
29
  raise "duplicate callback id" if c.has_key?(cid)
24
30
  c[cid] = callback
25
31
  (o[object] ||= []) << cid
@@ -98,14 +104,14 @@ end
98
104
 
99
105
  # A serializable callback.
100
106
  class Wee::LiteralMethodCallback
101
- def initialize(obj, method_id=:call, *additional_args)
107
+ def initialize(obj, method_id=:call, *args)
102
108
  @obj, @method_id = obj, method_id
103
- @additional_args = additional_args unless additional_args.empty?
109
+ @args = args unless args.empty?
104
110
  end
105
111
 
106
112
  def call(*args)
107
- if @additional_args
108
- @obj.send(@method_id, *(args+@additional_args))
113
+ if @args
114
+ @obj.send(@method_id, *(@args+args))
109
115
  else
110
116
  @obj.send(@method_id, *args)
111
117
  end
@@ -152,6 +152,8 @@ class Wee::Component < Wee::Presenter
152
152
  # A global decoration is added in front of the decoration chain, a local
153
153
  # decoration is added in front of all other local decorations but after all
154
154
  # global decorations.
155
+ #
156
+ # Returns: +self+
155
157
 
156
158
  def add_decoration(d)
157
159
  if d.global?
@@ -176,6 +178,8 @@ class Wee::Component < Wee::Presenter
176
178
  last_global.owner = d
177
179
  end
178
180
  end
181
+
182
+ return self
179
183
  end
180
184
 
181
185
  # Remove decoration +d+ from the decoration chain.
@@ -288,13 +292,12 @@ class Wee::Component < Wee::Presenter
288
292
  # Either a symbol or any object that responds to #call. If it's a symbol,
289
293
  # then the corresponding method of the current component will be called.
290
294
  #
291
- # [+additional_args+]
292
- # Additional arguments that are passed (after the arguments given in
293
- # #answer) to the +return_callback+
295
+ # [+args+]
296
+ # Arguments that are passed to the +return_callback+ before the 'onanswer'
297
+ # arguments.
294
298
  #
295
299
  # <b>How it works</b>
296
300
  #
297
-
298
301
  # The component to be called is wrapped with an AnswerDecoration and the
299
302
  # +return_callback+ parameter is assigned to it's +on_answer+ attribute (not
300
303
  # directly as there are cleanup actions to be taken before the
@@ -313,26 +316,27 @@ class Wee::Component < Wee::Presenter
313
316
  # AnswerDecoration. The AnswerDecoration then invokes the +on_answer+
314
317
  # callback which cleans up the decorations we added during #call, and finally
315
318
  # passes control to the +return_callback+.
319
+ #
316
320
 
317
- def call(component, return_callback=nil, *additional_args)
321
+ def call(component, return_callback=nil, *args)
318
322
  add_decoration(delegate = Wee::Delegate.new(component))
319
323
  component.add_decoration(answer = Wee::AnswerDecoration.new)
320
324
  answer.on_answer = OnAnswer.new(self, component, delegate, answer,
321
- return_callback, additional_args)
325
+ return_callback, args)
322
326
  throw :wee_back_to_session
323
327
  end
324
328
 
325
329
  class OnAnswer < Struct.new(:calling_component, :called_component, :delegate,
326
- :answer, :return_callback, :additional_args)
330
+ :answer, :return_callback, :args)
327
331
 
328
- def call(*args)
332
+ def call(*answer_args)
329
333
  calling_component.remove_decoration(delegate)
330
334
  called_component.remove_decoration(answer)
331
335
  return if return_callback.nil?
332
336
  if return_callback.respond_to?(:call)
333
- return_callback.call(*(args + additional_args))
337
+ return_callback.call(*(args + answer_args))
334
338
  else
335
- calling_component.send(return_callback, *(args + additional_args))
339
+ calling_component.send(return_callback, *(args + answer_args))
336
340
  end
337
341
  end
338
342
  end
@@ -1,114 +1,4 @@
1
1
  require 'og'
2
-
3
- class OgApplication < Wee::Application
4
- attr_accessor :db
5
- end
6
-
7
- class OgSession < Wee::Session
8
- def awake
9
- application.db.get_connection
10
- end
11
-
12
- def sleep
13
- application.db.put_connection
14
- end
15
- end
16
-
17
- class OgScaffolder < Wee::Component
18
- def initialize(domain_class)
19
- super()
20
- @domain_class = domain_class
21
- @attributes = domain_class.__props.map {|a| a.name}.reject {|a| a == 'oid'}
22
- end
23
-
24
- def delete(obj)
25
- call Wee::MessageBox.new('Really delete?'), :confirm_delete, obj
26
- end
27
-
28
- def confirm_delete(confirmed, obj)
29
- if confirmed
30
- @objs.delete(obj)
31
- obj.delete!
32
- end
33
- end
34
-
35
- def edit(obj)
36
- @edit = obj
37
- end
38
-
39
- def save(obj)
40
- obj.save!
41
- @edit = nil
42
- end
43
-
44
- def cancel
45
- @objs.delete(@edit) if @edit and @edit.oid.nil?
46
- @edit = nil
47
- end
48
-
49
- def refresh
50
- @objs = @domain_class.all || []
51
- end
52
-
53
- def create
54
- @objs << (@edit = @domain_class.new)
55
- end
56
-
57
- def render
58
- refresh if @objs.nil?
59
-
60
- r.h1 "#{ @domain_class } List"
61
- r.anchor.callback { refresh }.with("Refresh")
62
-
63
- r.form do
64
- r.table.border(1).with {
65
-
66
- r.table_row.with {
67
- @attributes.each {|a|
68
- r.table_header.with {
69
- r.bold(a.capitalize)
70
- }
71
- }
72
- r.table_header.with(" ")
73
- }
74
-
75
- @objs.each {|o|
76
- r.table_row.with do
77
- if @edit == o
78
-
79
- @attributes.each { |attr|
80
- r.table_data.with { r.text_input.callback {|v| o.send(attr+"=",v) }.value(o.send(attr)) }
81
- }
82
-
83
- r.table_data.with {
84
- r.submit_button.callback { save(o) }.value("Save")
85
- r.space
86
- r.submit_button.callback { cancel() }.value("Cancel")
87
- r.space
88
- r.anchor.callback { delete(o) }.with("Delete")
89
- }
90
-
91
- else
92
-
93
- @attributes.each { |attr|
94
- r.table_data(o.send(attr))
95
- }
96
-
97
- r.table_data.with {
98
- r.anchor.callback { edit(o) }.with("Edit")
99
- r.space
100
- r.anchor.callback { delete(o) }.with("Delete")
101
- }
102
-
103
- end
104
- end
105
- }
106
- }
107
- end
108
-
109
- r.anchor.callback { create() }.with("Add new #{ @domain_class }")
110
-
111
- end
112
-
113
- end
114
-
2
+ require 'wee/databases/og/application'
3
+ require 'wee/databases/og/session'
4
+ require 'wee/databases/og/scaffolder'