apotomo 0.1.4 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -2
- data/Gemfile.lock +70 -21
- data/Rakefile +7 -7
- data/config/routes.rb +3 -3
- data/lib/apotomo/persistence.rb +21 -48
- data/lib/apotomo/rails/view_helper.rb +3 -11
- data/lib/apotomo/request_processor.rb +7 -10
- data/lib/apotomo/transition.rb +2 -2
- data/lib/apotomo/version.rb +1 -1
- data/lib/apotomo/widget.rb +12 -25
- data/lib/apotomo/widget_shortcuts.rb +1 -1
- data/lib/apotomo.rb +6 -0
- data/{generators/widget → lib/generators/apotomo}/USAGE +0 -0
- data/lib/generators/apotomo/templates/view.erb +7 -0
- data/lib/generators/apotomo/templates/view.haml +4 -0
- data/{generators/widget → lib/generators/apotomo}/templates/widget.rb +2 -1
- data/lib/generators/apotomo/templates/widget_test.rb +11 -0
- data/lib/generators/apotomo/widget_generator.rb +19 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/config/application.rb +45 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +26 -0
- data/test/dummy/config/environments/production.rb +49 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/routes.rb +59 -0
- data/test/dummy/tmp/app/cells/mouse_widget.rb +11 -0
- data/test/dummy/tmp/test/widgets/mouse_widget_test.rb +15 -0
- data/test/rails/controller_methods_test.rb +11 -14
- data/test/rails/rails_integration_test.rb +12 -11
- data/test/rails/view_helper_test.rb +4 -27
- data/test/rails/view_methods_test.rb +4 -6
- data/test/rails/widget_generator_test.rb +40 -37
- data/test/support/test_case_methods.rb +34 -7
- data/test/test_helper.rb +12 -24
- data/test/unit/container_test.rb +2 -1
- data/test/unit/event_handler_test.rb +2 -0
- data/test/unit/event_methods_test.rb +4 -3
- data/test/unit/invoke_test.rb +27 -22
- data/test/unit/onfire_integration_test.rb +2 -0
- data/test/unit/persistence_test.rb +51 -90
- data/test/unit/render_test.rb +6 -4
- data/test/unit/request_processor_test.rb +70 -48
- data/test/unit/stateful_widget_test.rb +3 -1
- data/test/unit/transition_test.rb +1 -0
- data/test/unit/widget_shortcuts_test.rb +3 -2
- data/test/unit/widget_test.rb +69 -56
- metadata +57 -34
- data/app/.jeweler_doesnt_like_empty_directories +0 -0
- data/generators/widget/templates/functional_test.rb +0 -8
- data/generators/widget/templates/view.html.erb +0 -2
- data/generators/widget/templates/view.html.haml +0 -3
- data/generators/widget/widget_generator.rb +0 -34
- data/lib/apotomo/test_methods.rb +0 -8
- data/test/support/assertions_helper.rb +0 -13
- data/test/unit/test_methods_test.rb +0 -11
data/Gemfile
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem "rails", "~>
|
4
|
-
gem "cells", "3.
|
3
|
+
gem "rails", "~> 3.0.0"
|
4
|
+
gem "cells", :path => "/home/nick/projects/cells"#"3.4.1"
|
5
5
|
gem "onfire"
|
6
6
|
gem "hooks", "~> 0.1.2"
|
7
|
+
|
8
|
+
|
7
9
|
gem "jeweler"
|
8
10
|
|
9
11
|
# for test env:
|
10
12
|
gem "shoulda"
|
11
13
|
gem "mocha"
|
14
|
+
gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3' # needed in router_test, whatever.
|
data/Gemfile.lock
CHANGED
@@ -1,49 +1,98 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /home/nick/projects/cells
|
3
|
+
specs:
|
4
|
+
cells (3.4.2)
|
5
|
+
|
1
6
|
GEM
|
2
7
|
remote: http://rubygems.org/
|
3
8
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
activesupport (=
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
abstract (1.0.0)
|
10
|
+
actionmailer (3.0.0)
|
11
|
+
actionpack (= 3.0.0)
|
12
|
+
mail (~> 2.2.5)
|
13
|
+
actionpack (3.0.0)
|
14
|
+
activemodel (= 3.0.0)
|
15
|
+
activesupport (= 3.0.0)
|
16
|
+
builder (~> 2.1.2)
|
17
|
+
erubis (~> 2.6.6)
|
18
|
+
i18n (~> 0.4.1)
|
19
|
+
rack (~> 1.2.1)
|
20
|
+
rack-mount (~> 0.6.12)
|
21
|
+
rack-test (~> 0.5.4)
|
22
|
+
tzinfo (~> 0.3.23)
|
23
|
+
activemodel (3.0.0)
|
24
|
+
activesupport (= 3.0.0)
|
25
|
+
builder (~> 2.1.2)
|
26
|
+
i18n (~> 0.4.1)
|
27
|
+
activerecord (3.0.0)
|
28
|
+
activemodel (= 3.0.0)
|
29
|
+
activesupport (= 3.0.0)
|
30
|
+
arel (~> 1.0.0)
|
31
|
+
tzinfo (~> 0.3.23)
|
32
|
+
activeresource (3.0.0)
|
33
|
+
activemodel (= 3.0.0)
|
34
|
+
activesupport (= 3.0.0)
|
35
|
+
activesupport (3.0.0)
|
36
|
+
arel (1.0.1)
|
37
|
+
activesupport (~> 3.0.0)
|
38
|
+
builder (2.1.2)
|
39
|
+
erubis (2.6.6)
|
40
|
+
abstract (>= 1.0.0)
|
15
41
|
gemcutter (0.6.1)
|
16
42
|
git (1.2.5)
|
17
43
|
hooks (0.1.2)
|
44
|
+
i18n (0.4.1)
|
18
45
|
jeweler (1.4.0)
|
19
46
|
gemcutter (>= 0.1.0)
|
20
47
|
git (>= 1.2.5)
|
21
48
|
rubyforge (>= 2.0.0)
|
22
49
|
json_pure (1.4.6)
|
50
|
+
mail (2.2.6.1)
|
51
|
+
activesupport (>= 2.3.6)
|
52
|
+
mime-types
|
53
|
+
treetop (>= 1.4.5)
|
54
|
+
mime-types (1.16)
|
23
55
|
mocha (0.9.8)
|
24
56
|
rake
|
25
57
|
onfire (0.1.0)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
58
|
+
polyglot (0.3.1)
|
59
|
+
rack (1.2.1)
|
60
|
+
rack-mount (0.6.13)
|
61
|
+
rack (>= 1.0.0)
|
62
|
+
rack-test (0.5.6)
|
63
|
+
rack (>= 1.0)
|
64
|
+
rails (3.0.0)
|
65
|
+
actionmailer (= 3.0.0)
|
66
|
+
actionpack (= 3.0.0)
|
67
|
+
activerecord (= 3.0.0)
|
68
|
+
activeresource (= 3.0.0)
|
69
|
+
activesupport (= 3.0.0)
|
70
|
+
bundler (~> 1.0.0)
|
71
|
+
railties (= 3.0.0)
|
72
|
+
railties (3.0.0)
|
73
|
+
actionpack (= 3.0.0)
|
74
|
+
activesupport (= 3.0.0)
|
75
|
+
rake (>= 0.8.4)
|
76
|
+
thor (~> 0.14.0)
|
34
77
|
rake (0.8.7)
|
35
78
|
rubyforge (2.0.4)
|
36
79
|
json_pure (>= 1.1.7)
|
37
80
|
shoulda (2.11.3)
|
81
|
+
sqlite3-ruby (1.2.5)
|
82
|
+
thor (0.14.3)
|
83
|
+
treetop (1.4.8)
|
84
|
+
polyglot (>= 0.3.1)
|
85
|
+
tzinfo (0.3.23)
|
38
86
|
|
39
87
|
PLATFORMS
|
40
88
|
ruby
|
41
89
|
|
42
90
|
DEPENDENCIES
|
43
|
-
cells
|
91
|
+
cells!
|
44
92
|
hooks (~> 0.1.2)
|
45
93
|
jeweler
|
46
94
|
mocha
|
47
95
|
onfire
|
48
|
-
rails (~>
|
96
|
+
rails (~> 3.0.0)
|
49
97
|
shoulda
|
98
|
+
sqlite3-ruby (= 1.2.5)
|
data/Rakefile
CHANGED
@@ -11,9 +11,9 @@ desc 'Default: run unit tests.'
|
|
11
11
|
task :default => :test
|
12
12
|
|
13
13
|
desc 'Test the Apotomo plugin.'
|
14
|
-
Rake::TestTask.new(:test) do |t|
|
14
|
+
Rake::TestTask.new(:test) do |t|
|
15
15
|
t.libs << 'test'
|
16
|
-
t.
|
16
|
+
t.test_files = FileList['test/unit/*_test.rb', 'test/rails/*_test.rb']# - ['test/rails/capture_test.rb']
|
17
17
|
t.verbose = true
|
18
18
|
end
|
19
19
|
|
@@ -24,16 +24,16 @@ require 'apotomo/version'
|
|
24
24
|
Jeweler::Tasks.new do |spec|
|
25
25
|
spec.name = "apotomo"
|
26
26
|
spec.version = ::Apotomo::VERSION
|
27
|
-
spec.summary = %{
|
28
|
-
spec.description = "
|
27
|
+
spec.summary = %{Web components for Rails.}
|
28
|
+
spec.description = "Web components for Rails. Event-driven. Clean. Fast. Free optional statefulness included."
|
29
29
|
spec.homepage = "http://apotomo.de"
|
30
30
|
spec.authors = ["Nick Sutterer"]
|
31
31
|
spec.email = "apotonick@gmail.com"
|
32
32
|
|
33
|
-
spec.files = FileList["
|
33
|
+
spec.files = FileList["[A-Z]*", File.join(*%w[{generators,lib,rails,app,config} ** *]).to_s]
|
34
34
|
|
35
|
-
spec.add_dependency 'cells', '~> 3.
|
36
|
-
spec.add_dependency '
|
35
|
+
spec.add_dependency 'cells', '~> 3.4.2'
|
36
|
+
spec.add_dependency 'rails', '>= 3.0.0'
|
37
37
|
spec.add_dependency 'onfire', '>= 0.1.0'
|
38
38
|
spec.add_dependency 'hooks', '~> 0.1.2'
|
39
39
|
end
|
data/config/routes.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
end
|
1
|
+
Rails.application.routes.draw do |map|
|
2
|
+
match ":controller/render_event_response", :to => "#render_event_response", :as => "apotomo_event"
|
3
|
+
end
|
data/lib/apotomo/persistence.rb
CHANGED
@@ -42,59 +42,29 @@ module Apotomo
|
|
42
42
|
end
|
43
43
|
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
field_sep = self.class.field_sep
|
48
|
-
"#{@name}#{field_sep}#{self.class}#{field_sep}#{root? ? @name : parent.name}"
|
45
|
+
def dump_tree
|
46
|
+
collect { |n| [n.class, n.name, n.root? ? nil : n.parent.name] }
|
49
47
|
end
|
50
48
|
|
51
|
-
# Serializes the tree structure.
|
52
|
-
def _dump(depth)
|
53
|
-
inject("") { |str, node| str << node.dump_node << self.class.node_sep }
|
54
|
-
end
|
55
49
|
|
56
50
|
module ClassMethods
|
57
|
-
|
58
|
-
def node_sep; "\n"; end
|
59
|
-
|
60
|
-
# Creates an empty widget instance from <tt>line</tt>.
|
61
|
-
def load_node(line)
|
62
|
-
name, klass, parent = line.split(field_sep)
|
63
|
-
[klass.constantize.new(name, nil), parent]
|
64
|
-
end
|
65
|
-
|
66
|
-
def _load(str)
|
67
|
-
nodes = {}
|
68
|
-
root = nil
|
69
|
-
str.split(node_sep).each do |line|
|
70
|
-
node, parent = load_node(line)
|
71
|
-
nodes[node.name] = node
|
72
|
-
|
73
|
-
if node.name == parent # we're at the root node.
|
74
|
-
root = node and next
|
75
|
-
end
|
76
|
-
|
77
|
-
nodes[parent].add(node)
|
78
|
-
end
|
79
|
-
root
|
80
|
-
end
|
81
|
-
|
51
|
+
# Dump the shit to storage.
|
82
52
|
def freeze_for(storage, root)
|
83
53
|
storage[:apotomo_stateful_branches] = []
|
84
54
|
storage[:apotomo_widget_ivars] = {}
|
85
55
|
|
86
56
|
stateful_branches_for(root).each do |branch|
|
87
57
|
branch.freeze_data_to(storage[:apotomo_widget_ivars]) # save ivars.
|
88
|
-
storage[:apotomo_stateful_branches] <<
|
89
|
-
branch.root! # disconnect from tree.
|
58
|
+
storage[:apotomo_stateful_branches] << branch.dump_tree
|
90
59
|
end
|
91
60
|
end
|
92
61
|
|
93
|
-
|
62
|
+
# Create tree from storage and add branches to root/stateless parents.
|
63
|
+
def thaw_for(controller, storage, root)
|
94
64
|
branches = storage.delete(:apotomo_stateful_branches) || []
|
95
|
-
branches.each do |
|
96
|
-
branch =
|
97
|
-
parent = root.find_widget(
|
65
|
+
branches.each do |data|
|
66
|
+
branch = load_tree(controller, data)
|
67
|
+
parent = root.find_widget(data.first.last) or raise "Couldn't find parent `#{data.first.last}` for `#{branch.name}`"
|
98
68
|
|
99
69
|
parent << branch
|
100
70
|
branch.thaw_data_from(storage.delete(:apotomo_widget_ivars) || {})
|
@@ -102,16 +72,9 @@ module Apotomo
|
|
102
72
|
|
103
73
|
root
|
104
74
|
end
|
105
|
-
|
106
|
-
def thaw_from(storage)
|
107
|
-
root = storage[:apotomo_root]
|
108
|
-
root.thaw_data_from(storage.fetch(:apotomo_widget_ivars, {}))
|
109
|
-
root
|
110
|
-
end
|
111
75
|
|
112
76
|
def frozen_widget_in?(storage)
|
113
|
-
|
114
|
-
branches.present? and branches.first.first.kind_of? Apotomo::StatefulWidget
|
77
|
+
storage[:apotomo_stateful_branches].kind_of? Array
|
115
78
|
end
|
116
79
|
|
117
80
|
def flush_storage(storage)
|
@@ -134,6 +97,16 @@ module Apotomo
|
|
134
97
|
stateful_roots
|
135
98
|
end
|
136
99
|
|
100
|
+
private
|
101
|
+
def load_tree(parent_controller, cold_widgets)
|
102
|
+
root = nil
|
103
|
+
cold_widgets.each do |data|
|
104
|
+
node = data[0].new(parent_controller, data[1], "")
|
105
|
+
root = node and next unless root
|
106
|
+
root.find_widget(data[2]) << node
|
107
|
+
end
|
108
|
+
root
|
109
|
+
end
|
137
110
|
end
|
138
111
|
end
|
139
|
-
end
|
112
|
+
end
|
@@ -22,14 +22,6 @@ module Apotomo
|
|
22
22
|
js_generator.xhr(url_for_event(type, options))
|
23
23
|
end
|
24
24
|
|
25
|
-
# Creates a link that triggers an event via AJAX.
|
26
|
-
# This link will <em>only</em> work in JavaScript-able browsers.
|
27
|
-
#
|
28
|
-
# Note that the link is created using #link_to_remote.
|
29
|
-
def link_to_event(title, type, options={}, html_options={})
|
30
|
-
link_to_remote(title, {:url => url_for_event(type, options)}, html_options)
|
31
|
-
end
|
32
|
-
|
33
25
|
# Creates a form tag that triggers an event via AJAX when submitted.
|
34
26
|
# See StatefulWidget::address_for_event for options.
|
35
27
|
#
|
@@ -49,7 +41,7 @@ module Apotomo
|
|
49
41
|
html_options.reverse_merge! :target => :apotomo_iframe, :multipart => true
|
50
42
|
|
51
43
|
# i hate rails:
|
52
|
-
concat('<iframe id="apotomo_iframe" name="apotomo_iframe" style="display: none;"></iframe>') << form_tag(url_for_event(type, options), html_options, &block)
|
44
|
+
concat('<iframe id="apotomo_iframe" name="apotomo_iframe" style="display: none;"></iframe>'.html_safe) << form_tag(url_for_event(type, options), html_options, &block)
|
53
45
|
end
|
54
46
|
|
55
47
|
# Returns the url to trigger a +type+ event from the currently rendered widget.
|
@@ -62,7 +54,7 @@ module Apotomo
|
|
62
54
|
# #=> http://apotomo.de/mouse/process_event_request?type=paginate&source=mouse&page=2
|
63
55
|
def url_for_event(type, options={})
|
64
56
|
options.reverse_merge! :source => widget_id
|
65
|
-
|
57
|
+
@cell.url_for_event(type, options) # FIXME: don't access @parent_controller but @cell.
|
66
58
|
end
|
67
59
|
|
68
60
|
### TODO: test me.
|
@@ -73,7 +65,7 @@ module Apotomo
|
|
73
65
|
### TODO: test me.
|
74
66
|
### DISCUSS: rename to rendered_children ?
|
75
67
|
def content
|
76
|
-
@rendered_children.collect{|e| e.last}.join("\n")
|
68
|
+
@rendered_children.collect{|e| e.last}.join("\n").html_safe
|
77
69
|
end
|
78
70
|
|
79
71
|
# needs: suppress_javascript
|
@@ -1,20 +1,17 @@
|
|
1
1
|
module Apotomo
|
2
2
|
class RequestProcessor
|
3
|
-
include WidgetShortcuts
|
4
|
-
|
5
3
|
attr_reader :session, :root
|
6
4
|
|
7
5
|
def initialize(controller, session, options={}, has_widgets_blocks=[])
|
8
6
|
@session = session
|
9
7
|
@widgets_flushed = false
|
10
8
|
|
11
|
-
@root =
|
12
|
-
@root.controller = controller
|
9
|
+
@root = Widget.new(controller, 'root', :display)
|
13
10
|
|
14
11
|
attach_stateless_blocks_for(has_widgets_blocks, @root, controller)
|
15
12
|
|
16
13
|
if options[:flush_widgets].blank? and ::Apotomo::StatefulWidget.frozen_widget_in?(session)
|
17
|
-
@root = ::Apotomo::StatefulWidget.thaw_for(session, @root)
|
14
|
+
@root = ::Apotomo::StatefulWidget.thaw_for(controller, session, @root)
|
18
15
|
else
|
19
16
|
#@root = flushed_root
|
20
17
|
|
@@ -27,14 +24,14 @@ module Apotomo
|
|
27
24
|
def attach_stateless_blocks_for(blocks, root, controller)
|
28
25
|
blocks.each do |blk|
|
29
26
|
if blk.arity == 1
|
30
|
-
blk.call(root) and next # fixes misbehaviour in ruby 1.8.
|
27
|
+
#blk.call(root) and next # fixes misbehaviour in ruby 1.8.
|
28
|
+
root.instance_exec(root, &blk) and next
|
31
29
|
end
|
32
|
-
|
33
|
-
|
30
|
+
### FIXME: use Widget.has_widgets func.
|
31
|
+
root.instance_exec(root, controller, &blk)
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
37
|
-
|
38
35
|
def flushed_root
|
39
36
|
StatefulWidget.flush_storage(session)
|
40
37
|
@widgets_flushed = true
|
@@ -95,4 +92,4 @@ module Apotomo
|
|
95
92
|
options
|
96
93
|
end
|
97
94
|
end
|
98
|
-
end
|
95
|
+
end
|
data/lib/apotomo/transition.rb
CHANGED
@@ -26,7 +26,7 @@ module Apotomo::Transition
|
|
26
26
|
# to the start state.
|
27
27
|
def transition(options)
|
28
28
|
if from = options[:from]
|
29
|
-
class_transitions[from] = options[:to]
|
29
|
+
class_transitions[from.to_s] = options[:to]
|
30
30
|
elsif loop = options[:in]
|
31
31
|
transition :from => loop, :to => loop
|
32
32
|
end
|
@@ -41,6 +41,6 @@ module Apotomo::Transition
|
|
41
41
|
# Returns the next state for <tt>state</tt> or nil. A next state must have been defined
|
42
42
|
# with #transition.
|
43
43
|
def next_state_for(state)
|
44
|
-
self.class.class_transitions[state]
|
44
|
+
self.class.class_transitions[state.to_s]
|
45
45
|
end
|
46
46
|
end
|
data/lib/apotomo/version.rb
CHANGED
data/lib/apotomo/widget.rb
CHANGED
@@ -35,10 +35,6 @@ module Apotomo
|
|
35
35
|
attr_writer :controller
|
36
36
|
attr_accessor :version
|
37
37
|
|
38
|
-
#class << self
|
39
|
-
# include WidgetShortcuts
|
40
|
-
#end
|
41
|
-
|
42
38
|
include TreeNode
|
43
39
|
|
44
40
|
include Onfire
|
@@ -56,30 +52,29 @@ module Apotomo
|
|
56
52
|
self.class.callbacks_for_hook(name).each { |blk| instance_exec(*args, &blk) }
|
57
53
|
end
|
58
54
|
|
59
|
-
|
60
55
|
def add_has_widgets_blocks(*)
|
61
56
|
run_widget_hook(:has_widgets, self)
|
62
57
|
end
|
63
58
|
after_initialize :add_has_widgets_blocks
|
64
59
|
|
65
60
|
|
66
|
-
# Constructor which needs a unique id for the widget and one or multiple start states.
|
67
|
-
|
68
|
-
|
69
|
-
|
61
|
+
# Constructor which needs a unique id for the widget and one or multiple start states.
|
62
|
+
def initialize(parent_controller, id, start_state, opts={})
|
63
|
+
super(parent_controller, opts) # do that as long as cells do need a parent_controller.
|
64
|
+
|
70
65
|
@name = id
|
71
66
|
@start_state = start_state
|
72
67
|
|
73
68
|
@visible = true
|
74
|
-
@version = 0
|
69
|
+
@version = 0 ### DISCUSS: neeed in stateLESS?
|
75
70
|
|
76
|
-
@cell = self
|
71
|
+
@cell = self ### DISCUSS: needed?
|
77
72
|
|
78
73
|
run_hook(:after_initialize, id, start_state, opts)
|
79
74
|
end
|
80
75
|
|
81
76
|
def last_state
|
82
|
-
|
77
|
+
action_name
|
83
78
|
end
|
84
79
|
|
85
80
|
def visible?
|
@@ -93,7 +88,7 @@ module Apotomo
|
|
93
88
|
end
|
94
89
|
|
95
90
|
def unfreezable_ivars
|
96
|
-
[:@childrenHash, :@children, :@parent, :@
|
91
|
+
[:@childrenHash, :@children, :@parent, :@parent_controller, :@_request, :@_config, :@cell, :@invoke_block, :@rendered_children, :@page_updates, :@opts,
|
97
92
|
:@suppress_javascript ### FIXME: implement with ActiveHelper and :locals.
|
98
93
|
|
99
94
|
]
|
@@ -126,13 +121,6 @@ module Apotomo
|
|
126
121
|
end
|
127
122
|
|
128
123
|
|
129
|
-
|
130
|
-
# called in Cell::Base#render_state
|
131
|
-
def dispatch_state(state)
|
132
|
-
send(state, &@invoke_block)
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
124
|
# Render the view for the current state. Usually called at the end of a state method.
|
137
125
|
#
|
138
126
|
# ==== Options
|
@@ -184,11 +172,10 @@ module Apotomo
|
|
184
172
|
|
185
173
|
options[:locals].reverse_merge!(:rendered_children => rendered_children)
|
186
174
|
|
187
|
-
@controller = controller # that dependency SUCKS.
|
188
175
|
@suppress_js = options[:suppress_js] ### FIXME: implement with ActiveHelper and :locals.
|
189
176
|
|
190
177
|
|
191
|
-
render_view_for(options,
|
178
|
+
render_view_for(options, action_name) # defined in Cell::Base.
|
192
179
|
end
|
193
180
|
|
194
181
|
alias_method :emit, :render
|
@@ -242,7 +229,7 @@ module Apotomo
|
|
242
229
|
end
|
243
230
|
|
244
231
|
def render_children(invoke_options={})
|
245
|
-
|
232
|
+
ActiveSupport::OrderedHash.new.tap do |rendered_children|
|
246
233
|
visible_children.each do |kid|
|
247
234
|
child_state = decide_state_for(kid, invoke_options)
|
248
235
|
logger.debug " #{kid.name} -> #{child_state}"
|
@@ -295,8 +282,8 @@ module Apotomo
|
|
295
282
|
find {|node| node.name.to_s == widget_id.to_s}
|
296
283
|
end
|
297
284
|
|
298
|
-
def
|
299
|
-
|
285
|
+
def url_for_event(*args)
|
286
|
+
parent_controller.url_for_event(*args)
|
300
287
|
end
|
301
288
|
|
302
289
|
alias_method :widget_id, :name
|
@@ -12,7 +12,7 @@ module Apotomo
|
|
12
12
|
#
|
13
13
|
# widget('jquery/tabs', 'panel')
|
14
14
|
def widget(class_name, id, state=:display, *args)
|
15
|
-
object = constant_for(class_name).new(id, state, *args)
|
15
|
+
object = constant_for(class_name).new(parent_controller, id, state, *args)
|
16
16
|
yield object if block_given?
|
17
17
|
object
|
18
18
|
end
|
data/lib/apotomo.rb
CHANGED
@@ -40,6 +40,9 @@ module Apotomo
|
|
40
40
|
yield self
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
class Engine < Rails::Engine
|
45
|
+
end
|
43
46
|
end
|
44
47
|
|
45
48
|
require 'apotomo/javascript_generator'
|
@@ -49,3 +52,6 @@ require 'apotomo/widget'
|
|
49
52
|
require 'apotomo/stateful_widget'
|
50
53
|
require 'apotomo/container_widget'
|
51
54
|
require 'apotomo/widget_shortcuts'
|
55
|
+
require 'apotomo/rails/controller_methods'
|
56
|
+
|
57
|
+
#require 'apotomo/engine' if defined?(Rails)
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'generators/cells/cell_generator'
|
2
|
+
|
3
|
+
module Apotomo
|
4
|
+
module Generators
|
5
|
+
class WidgetGenerator < Cells::Generators::CellGenerator
|
6
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
7
|
+
|
8
|
+
def create_cell_file
|
9
|
+
puts "creating #{file_name}.rb"
|
10
|
+
template 'widget.rb', File.join('app/cells', class_path, "#{file_name}.rb")
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_test
|
14
|
+
@states = actions
|
15
|
+
template 'widget_test.rb', File.join('test/widgets/', "#{file_name}_test.rb")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require "active_model/railtie"
|
4
|
+
require "active_record/railtie"
|
5
|
+
require "action_controller/railtie"
|
6
|
+
require "action_view/railtie"
|
7
|
+
require "action_mailer/railtie"
|
8
|
+
|
9
|
+
Bundler.require
|
10
|
+
#require "dummy"
|
11
|
+
|
12
|
+
module Dummy
|
13
|
+
class Application < Rails::Application
|
14
|
+
# Settings in config/environments/* take precedence over those specified here.
|
15
|
+
# Application configuration should go into files in config/initializers
|
16
|
+
# -- all .rb files in that directory are automatically loaded.
|
17
|
+
|
18
|
+
# Custom directories with classes and modules you want to be autoloadable.
|
19
|
+
# config.autoload_paths += %W(#{config.root}/extras)
|
20
|
+
|
21
|
+
# Only load the plugins named here, in the order given (default is alphabetical).
|
22
|
+
# :all can be used as a placeholder for all plugins not explicitly named.
|
23
|
+
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
24
|
+
|
25
|
+
# Activate observers that should always be running.
|
26
|
+
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
27
|
+
|
28
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
29
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
30
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
31
|
+
|
32
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
33
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
34
|
+
# config.i18n.default_locale = :de
|
35
|
+
|
36
|
+
# JavaScript files you want as :defaults (application.js is always included).
|
37
|
+
# config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
|
38
|
+
|
39
|
+
# Configure the default encoding used in templates for Ruby 1.9.
|
40
|
+
config.encoding = "utf-8"
|
41
|
+
|
42
|
+
# Configure sensitive parameters which will be filtered from the log file.
|
43
|
+
config.filter_parameters += [:password]
|
44
|
+
end
|
45
|
+
end
|