apotomo 1.0.1 → 1.0.2
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.
- data/CHANGES.textile +8 -0
- data/Gemfile +7 -4
- data/README.rdoc +1 -1
- data/Rakefile +1 -1
- data/lib/apotomo/event_methods.rb +30 -41
- data/lib/apotomo/invoke_event_handler.rb +1 -7
- data/lib/apotomo/rails/controller_methods.rb +10 -33
- data/lib/apotomo/rails/view_helper.rb +3 -32
- data/lib/apotomo/version.rb +1 -1
- data/lib/apotomo/widget.rb +10 -6
- data/lib/apotomo/widget_shortcuts.rb +1 -0
- data/test/rails/controller_methods_test.rb +1 -1
- data/test/rails/view_helper_test.rb +58 -40
- data/test/support/test_case_methods.rb +9 -6
- data/test/test_helper.rb +18 -1
- data/test/unit/event_methods_test.rb +32 -2
- data/test/unit/invoke_test.rb +0 -2
- data/test/unit/widget_test.rb +20 -0
- metadata +234 -108
data/CHANGES.textile
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
h2. 1.0.2
|
|
2
|
+
|
|
3
|
+
h3. Changes
|
|
4
|
+
* removals from ViewHelper: #trigger_event, #form_to_event and friends as they use deprecated Rails helpers.
|
|
5
|
+
|
|
6
|
+
h3. Bugfixes
|
|
7
|
+
* Widget#fire now accepts payload data for the fired event.
|
|
8
|
+
* triggered states now receive the event object if they expect one argument.
|
data/Gemfile
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
source "http://rubygems.org"
|
|
2
2
|
|
|
3
|
-
gem "rails",
|
|
4
|
-
gem "
|
|
5
|
-
|
|
6
|
-
gem "
|
|
3
|
+
gem "rails", "~> 3.0"
|
|
4
|
+
#gem "rails", :path => "/home/nick/projects/rayls"
|
|
5
|
+
|
|
6
|
+
gem "cells", "~> 3.4"
|
|
7
|
+
gem "onfire", "~> 0.1.1"
|
|
8
|
+
gem "hooks", "~> 0.1.3"
|
|
9
|
+
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
gem "jeweler"
|
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
|
@@ -34,7 +34,7 @@ Jeweler::Tasks.new do |spec|
|
|
|
34
34
|
spec.test_files = FileList["test/**/*"] - FileList["test/dummy/tmp", "test/dummy/tmp/**/*", "test/dummy/log/*"]
|
|
35
35
|
|
|
36
36
|
spec.add_dependency 'cells', '~> 3.4.2'
|
|
37
|
-
spec.add_dependency 'rails', '
|
|
37
|
+
spec.add_dependency 'rails', '~> 3.0.0'
|
|
38
38
|
spec.add_dependency 'onfire', '>= 0.1.0'
|
|
39
39
|
spec.add_dependency 'hooks', '~> 0.1.3'
|
|
40
40
|
end
|
|
@@ -2,19 +2,19 @@ require 'apotomo/event_handler'
|
|
|
2
2
|
|
|
3
3
|
module Apotomo
|
|
4
4
|
# Introduces event-processing functions into the StatefulWidget.
|
|
5
|
-
|
|
6
5
|
module EventMethods
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
after_initialize :add_class_event_handlers
|
|
10
|
+
end
|
|
11
|
+
|
|
7
12
|
attr_writer :page_updates
|
|
8
|
-
|
|
13
|
+
|
|
9
14
|
def page_updates
|
|
10
15
|
@page_updates ||= []
|
|
11
16
|
end
|
|
12
17
|
|
|
13
|
-
def self.included(base)
|
|
14
|
-
base.extend(ClassMethods)
|
|
15
|
-
base.after_initialize :add_class_event_handlers
|
|
16
|
-
end
|
|
17
|
-
|
|
18
18
|
def add_class_event_handlers(*)
|
|
19
19
|
self.class.responds_to_event_options.each { |options| respond_to_event(*options) }
|
|
20
20
|
end
|
|
@@ -34,66 +34,55 @@ module Apotomo
|
|
|
34
34
|
# state, which implies an update of the invoked widget.
|
|
35
35
|
#
|
|
36
36
|
# You may configure the event handler with the following <tt>options</tt>:
|
|
37
|
-
# :with => (
|
|
37
|
+
# :with => (optional) the state to invoke on the target widget, defaults to +type+.
|
|
38
38
|
# :on => (optional) the targeted widget's id, defaults to <tt>self.name</tt>
|
|
39
39
|
# :from => (optional) the source id of the widget that triggered the event, defaults to any widget
|
|
40
40
|
#
|
|
41
41
|
# Example:
|
|
42
42
|
#
|
|
43
|
-
# trap =
|
|
43
|
+
# trap = widget(:trap, :charged, 'mouse_trap')
|
|
44
44
|
# trap.respond_to_event :mouseOver, :with => :catch_mouse
|
|
45
45
|
#
|
|
46
|
-
# This would instruct
|
|
46
|
+
# This would instruct +trap+ to catch a <tt>:mouseOver</tt> event from any widget (including itself) and
|
|
47
47
|
# to invoke the state <tt>:catch_mouse</tt> on itself as trigger.
|
|
48
48
|
#
|
|
49
49
|
#
|
|
50
|
-
# hunter =
|
|
51
|
-
# hunter <<
|
|
52
|
-
# hunter <<
|
|
50
|
+
# hunter = widget(:form, :hunt_for_mice, 'my_form')
|
|
51
|
+
# hunter << widget(:input_field, :smell_like_cheese, 'mouse_trap')
|
|
52
|
+
# hunter << widget(:text_area, :stick_like_honey, 'bear_trap')
|
|
53
53
|
# hunter.respond_to_event :captured, :from => 'mouse_trap', :with => :refill_cheese, :on => 'mouse_trap'
|
|
54
54
|
#
|
|
55
55
|
# As both the bear- and the mouse trap can trigger a <tt>:captured</tt> event the later <tt>respond_to_event</tt>
|
|
56
56
|
# would invoke <tt>:refill_cheese</tt> on the <tt>mouse_trap</tt> widget as soon as this and only this widget fired.
|
|
57
57
|
# It is important to understand the <tt>:from</tt> parameter as it filters the event source - it wouldn't make
|
|
58
|
-
# sense to refill the mouse trap if the bear trap snapped, would it?
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
# sense to refill the mouse trap if the bear trap snapped, would it?
|
|
59
|
+
def respond_to_event(type, options={})
|
|
60
|
+
options.reverse_merge!( :once => true,
|
|
61
|
+
:with => type,
|
|
62
|
+
:on => self.name )
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
handler_opts[:widget_id] = options[:on] || self.name
|
|
65
|
-
handler_opts[:state] = options[:with]
|
|
66
|
-
|
|
67
|
-
handler = InvokeEventHandler.new(handler_opts)
|
|
64
|
+
handler = InvokeEventHandler.new(:widget_id => options[:on], :state => options[:with])
|
|
68
65
|
|
|
69
66
|
return if options[:once] and event_table.all_handlers_for(type, options[:from]).include?(handler)
|
|
70
67
|
|
|
71
68
|
on(type, :do => handler, :from => options[:from])
|
|
72
69
|
end
|
|
73
70
|
|
|
71
|
+
# Fire an event of +type+ and let it bubble up. You may add arbitrary payload data to the event.
|
|
72
|
+
#
|
|
73
|
+
# Example:
|
|
74
|
+
#
|
|
75
|
+
# trigger(:dropped, :area => 59)
|
|
76
|
+
#
|
|
77
|
+
# which can be queried in a triggered state.
|
|
78
|
+
#
|
|
79
|
+
# def on_drop(event)
|
|
80
|
+
# if event.data[:area] == 59
|
|
74
81
|
def trigger(*args)
|
|
75
82
|
fire(*args)
|
|
76
83
|
end
|
|
77
84
|
|
|
78
|
-
|
|
79
|
-
# never be called from outside but in setters when some internal value changed and must be
|
|
80
|
-
# displayed instantly.
|
|
81
|
-
#
|
|
82
|
-
# Implements the following pattern (TODO: remove example as soon as invoke! proofed):
|
|
83
|
-
#
|
|
84
|
-
# def title=(str)
|
|
85
|
-
# @title = str
|
|
86
|
-
# peek(:update, self.name, :display, self.name)
|
|
87
|
-
# trigger(:update)
|
|
88
|
-
# end
|
|
89
|
-
def invoke!(state)
|
|
90
|
-
### TODO: encapsulate in PageUpdateQueue:
|
|
91
|
-
Apotomo::EventProcessor.instance.processed_handlers << [name, invoke(:state)]
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
protected
|
|
85
|
+
protected
|
|
97
86
|
# Get all handlers from self for the passed event (overriding Onfire#local_event_handlers).
|
|
98
87
|
def local_event_handlers(event)
|
|
99
88
|
event_table.all_handlers_for(event.type, event.source.name) # we key with widget_id.
|
|
@@ -10,13 +10,7 @@ module Apotomo
|
|
|
10
10
|
def process_event(event)
|
|
11
11
|
target = event.source.root.find_by_path(widget_id) ### DISCUSS: widget_id or widget_selector?
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
### DISCUSS: let target access event?
|
|
15
|
-
### pass additional opts to #invoke?
|
|
16
|
-
### DISCUSS: pass block here?
|
|
17
|
-
target.opts[:event] = event
|
|
18
|
-
|
|
19
|
-
target.invoke(state)
|
|
13
|
+
target.invoke(state, event)
|
|
20
14
|
end
|
|
21
15
|
|
|
22
16
|
def to_s; "InvokeEventHandler:#{widget_id}##{state}"; end
|
|
@@ -5,19 +5,17 @@ require 'apotomo/rails/view_methods'
|
|
|
5
5
|
module Rails
|
|
6
6
|
module ControllerMethods
|
|
7
7
|
include WidgetShortcuts
|
|
8
|
+
extend ActiveSupport::Concern
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
after_filter :apotomo_freeze
|
|
20
|
-
end
|
|
10
|
+
included do
|
|
11
|
+
extend WidgetShortcuts
|
|
12
|
+
|
|
13
|
+
class_inheritable_array :has_widgets_blocks
|
|
14
|
+
self.has_widgets_blocks = []
|
|
15
|
+
|
|
16
|
+
helper ::Apotomo::Rails::ViewMethods
|
|
17
|
+
|
|
18
|
+
after_filter :apotomo_freeze
|
|
21
19
|
end
|
|
22
20
|
|
|
23
21
|
module ClassMethods
|
|
@@ -33,8 +31,6 @@ require 'apotomo/rails/view_methods'
|
|
|
33
31
|
def has_widgets(&block)
|
|
34
32
|
has_widgets_blocks << block
|
|
35
33
|
end
|
|
36
|
-
|
|
37
|
-
alias_method :uses_widgets, :has_widgets
|
|
38
34
|
end
|
|
39
35
|
|
|
40
36
|
def bound_use_widgets_blocks
|
|
@@ -138,25 +134,6 @@ with(window.parent) { setTimeout(function() { window.eval('#{escaped_script}');
|
|
|
138
134
|
</script></body></html>", :content_type => 'text/html'
|
|
139
135
|
end
|
|
140
136
|
|
|
141
|
-
def respond_to_event(type, options)
|
|
142
|
-
handler = ProcEventHandler.new
|
|
143
|
-
handler.proc = options[:with]
|
|
144
|
-
### TODO: pass :from => (event source).
|
|
145
|
-
|
|
146
|
-
# attach once, not every request:
|
|
147
|
-
apotomo_root.evt_table.add_handler_once(handler, :event_type => type)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
### DISCUSS: rename? should say "this controller action wants apotomo's deep linking!"
|
|
153
|
-
### DISCUSS: move to deep_link_methods?
|
|
154
|
-
def respond_to_url_change
|
|
155
|
-
return if apotomo_root.find_widget('deep_link') # add only once.
|
|
156
|
-
apotomo_root << widget("apotomo/deep_link_widget", :setup, 'deep_link')
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
|
|
160
137
|
class ProcHash < Array
|
|
161
138
|
def id_for_proc(proc)
|
|
162
139
|
proc.to_s.split('@').last
|
|
@@ -7,31 +7,7 @@ module Apotomo
|
|
|
7
7
|
def js_generator
|
|
8
8
|
Apotomo.js_generator
|
|
9
9
|
end
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
# Generates the JavaScript code to report an event of <tt>type</tt> to Apotomo with AJAX.
|
|
13
|
-
# As always per default the event source is the currently rendered widget.
|
|
14
|
-
# Internally this method just uses <tt>remote_function</tt> for JS output.
|
|
15
|
-
#
|
|
16
|
-
# Example:
|
|
17
|
-
#
|
|
18
|
-
# <%= image_tag "cheese.png", :onMouseover => trigger_event(:mouseAlarm) %>
|
|
19
|
-
#
|
|
20
|
-
# will trigger the event <tt>:mouseAlarm</tt> when moving the mouse over the cheese image.
|
|
21
|
-
def trigger_event(type, options={})
|
|
22
|
-
js_generator.xhr(url_for_event(type, options))
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Creates a form tag that triggers an event via AJAX when submitted.
|
|
26
|
-
# See StatefulWidget::address_for_event for options.
|
|
27
|
-
#
|
|
28
|
-
# The values of form elements are available via StatefulWidget#param.
|
|
29
|
-
def form_to_event(type, options={}, html_options={}, &block)
|
|
30
|
-
return multipart_form_to_event(type, options, html_options, &block) if options.delete(:multipart)
|
|
31
|
-
|
|
32
|
-
form_remote_tag({:url => url_for_event(type, options), :html => html_options}, &block)
|
|
33
|
-
end
|
|
34
|
-
|
|
10
|
+
|
|
35
11
|
# Creates a form that submits itself via an iFrame and executes the response
|
|
36
12
|
# in the parent window. This is needed to upload files via AJAX.
|
|
37
13
|
#
|
|
@@ -53,12 +29,7 @@ module Apotomo
|
|
|
53
29
|
# url_for_event(:paginate, :page => 2)
|
|
54
30
|
# #=> http://apotomo.de/mouse/process_event_request?type=paginate&source=mouse&page=2
|
|
55
31
|
def url_for_event(type, options={})
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
### TODO: test me.
|
|
60
|
-
def update_url(fragment)
|
|
61
|
-
'SWFAddress.setValue("' + fragment + '");'
|
|
32
|
+
controller.url_for_event(type, options)
|
|
62
33
|
end
|
|
63
34
|
|
|
64
35
|
### TODO: test me.
|
|
@@ -93,7 +64,7 @@ module Apotomo
|
|
|
93
64
|
|
|
94
65
|
# Returns the widget id you passed in a has_widgets block.
|
|
95
66
|
def widget_id
|
|
96
|
-
|
|
67
|
+
controller.name
|
|
97
68
|
end
|
|
98
69
|
end
|
|
99
70
|
end
|
data/lib/apotomo/version.rb
CHANGED
data/lib/apotomo/widget.rb
CHANGED
|
@@ -31,8 +31,6 @@ module Apotomo
|
|
|
31
31
|
attr_accessor :opts
|
|
32
32
|
attr_writer :visible
|
|
33
33
|
|
|
34
|
-
attr_writer :controller
|
|
35
|
-
|
|
36
34
|
include TreeNode
|
|
37
35
|
|
|
38
36
|
include Onfire
|
|
@@ -43,6 +41,8 @@ module Apotomo
|
|
|
43
41
|
|
|
44
42
|
helper Apotomo::Rails::ViewHelper
|
|
45
43
|
|
|
44
|
+
abstract!
|
|
45
|
+
undef :display # We don't want #display to be listed in #internal_methods.
|
|
46
46
|
|
|
47
47
|
# Runs callbacks for +name+ hook in instance context.
|
|
48
48
|
def run_widget_hook(name, *args)
|
|
@@ -80,8 +80,7 @@ module Apotomo
|
|
|
80
80
|
|
|
81
81
|
# Returns the rendered content for the widget by running the state method for <tt>state</tt>.
|
|
82
82
|
# This might lead us to some other state since the state method could call #jump_to_state.
|
|
83
|
-
def invoke(state=nil,
|
|
84
|
-
@invoke_block = block ### DISCUSS: store block so we don't have to pass it 10 times?
|
|
83
|
+
def invoke(state=nil, event=nil)
|
|
85
84
|
logger.debug "\ninvoke on #{name} with #{state.inspect}"
|
|
86
85
|
|
|
87
86
|
if state.blank?
|
|
@@ -91,7 +90,12 @@ module Apotomo
|
|
|
91
90
|
logger.debug "#{name}: transition: #{last_state} to #{state}"
|
|
92
91
|
logger.debug " ...#{state}"
|
|
93
92
|
|
|
94
|
-
render_state(state)
|
|
93
|
+
#render_state(state)
|
|
94
|
+
|
|
95
|
+
return process(state, event) if method(state).arity == 1
|
|
96
|
+
|
|
97
|
+
opts[:event] = event
|
|
98
|
+
process(state)
|
|
95
99
|
end
|
|
96
100
|
|
|
97
101
|
|
|
@@ -236,7 +240,7 @@ module Apotomo
|
|
|
236
240
|
def address_for_event(type, options={})
|
|
237
241
|
options.reverse_merge! :source => name,
|
|
238
242
|
:type => type,
|
|
239
|
-
:controller => parent_controller.
|
|
243
|
+
:controller => parent_controller.controller_path # DISCUSS: dependency to parent_controller.
|
|
240
244
|
end
|
|
241
245
|
|
|
242
246
|
def url_for_event(type, options={})
|
|
@@ -116,7 +116,7 @@ class ControllerMethodsTest < ActionController::TestCase
|
|
|
116
116
|
|
|
117
117
|
context "invoking #url_for_event" do
|
|
118
118
|
should "compute an url for any widget" do
|
|
119
|
-
assert_equal "/barn/render_event_response?source=mouse&volume=9
|
|
119
|
+
assert_equal "/barn/render_event_response?source=mouse&type=footsteps&volume=9", @controller.url_for_event(:footsteps, :source => :mouse, :volume => 9)
|
|
120
120
|
end
|
|
121
121
|
end
|
|
122
122
|
|
|
@@ -1,74 +1,92 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
require 'action_view/test_case'
|
|
3
3
|
|
|
4
|
-
class ViewHelperTest <
|
|
5
|
-
include
|
|
4
|
+
class ViewHelperTest < Apotomo::TestCase
|
|
5
|
+
include ActionDispatch::Assertions::DomAssertions
|
|
6
|
+
include Apotomo::TestCase::TestController
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
# TODO: move to Apotomo::TestCase, refactor, test.
|
|
9
|
+
class MouseWidget < Apotomo::Widget
|
|
10
|
+
end
|
|
11
|
+
def in_view(subject, &block)
|
|
12
|
+
if subject.kind_of?(Apotomo::Widget)
|
|
13
|
+
subject.opts[:block] = block
|
|
14
|
+
else
|
|
15
|
+
subject = subject.new(@controller, 'mum', :display, :block => block)
|
|
12
16
|
end
|
|
17
|
+
|
|
18
|
+
setup_test_states_in(subject) unless subject.respond_to?(:in_view)# add #in_view state to subject cell.
|
|
13
19
|
|
|
20
|
+
subject.class.action_methods << "in_view"
|
|
21
|
+
|
|
22
|
+
subject.invoke(:in_view)
|
|
23
|
+
end
|
|
24
|
+
def mouse_mock(id='mum', start_state=:eat, opts={}, &block)
|
|
25
|
+
mouse = MouseWidget.new(parent_controller, id, start_state, opts)
|
|
26
|
+
mouse.instance_eval &block if block_given?
|
|
27
|
+
mouse
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
context "A widget state view" do
|
|
14
32
|
teardown do
|
|
15
33
|
Apotomo.js_framework = :prototype
|
|
16
34
|
end
|
|
17
35
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
should "render multipart form if :multipart => true" do
|
|
25
|
-
assert_dom_equal "<iframe id=\"apotomo_iframe\" name=\"apotomo_iframe\" style=\"display: none;\"></iframe><form accept-charset=\"UTF-8\" action=\"/barn/render_event_response?apotomo_iframe=true&source=mum&type=footsteps\" enctype=\"multipart/form-data\" method=\"post\" target=\"apotomo_iframe\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"utf8\" type=\"hidden\" value=\"✓\" /></div></form>",
|
|
26
|
-
form_to_event(:footsteps, :multipart => true)
|
|
36
|
+
should_eventually "respond to #multipart_form_to_event" do
|
|
37
|
+
assert_dom_equal( "<iframe id=\"apotomo_iframe\" name=\"apotomo_iframe\" style=\"display: none;\"></iframe><form accept-charset=\"UTF-8\" action=\"/barn/render_event_response?apotomo_iframe=true&source=mum&type=footsteps\" enctype=\"multipart/form-data\" method=\"post\" target=\"apotomo_iframe\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"utf8\" type=\"hidden\" value=\"✓\" /></div></form>",
|
|
38
|
+
in_view(MouseWidget) do
|
|
39
|
+
multipart_form_to_event(:footsteps)
|
|
40
|
+
end)
|
|
27
41
|
end
|
|
28
42
|
|
|
29
|
-
should "respond to #
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
should "render RightJS if set" do
|
|
35
|
-
Apotomo.js_framework = :right
|
|
36
|
-
|
|
37
|
-
assert_dom_equal "new Xhr(\"/barn/render_event_response?source=mum&type=footsteps\", {evalScripts:true}).send()", trigger_event(:footsteps)
|
|
43
|
+
should "respond to #url_for_event" do
|
|
44
|
+
assert_equal("/barn/render_event_response?source=mum&type=footsteps", in_view(MouseWidget) do
|
|
45
|
+
url_for_event(:footsteps)
|
|
46
|
+
end)
|
|
38
47
|
end
|
|
39
48
|
|
|
40
|
-
should "respond to #url_for_event" do
|
|
41
|
-
|
|
49
|
+
should "respond to #url_for_event with a namespaced controller" do
|
|
50
|
+
@controller = namespaced_controller
|
|
51
|
+
assert_equal("/farm/barn/render_event_response?source=mum&type=footsteps", in_view(MouseWidget) do
|
|
52
|
+
url_for_event(:footsteps)
|
|
53
|
+
end)
|
|
42
54
|
end
|
|
43
55
|
|
|
44
56
|
should "respond to #widget_div" do
|
|
45
|
-
assert_equal
|
|
57
|
+
assert_equal('<div id="mum">squeak!</div>', in_view(MouseWidget) do widget_div { "squeak!" } end)
|
|
46
58
|
end
|
|
47
59
|
|
|
48
60
|
should "respond to #widget_div with options" do
|
|
49
|
-
assert_equal
|
|
61
|
+
assert_equal('<div class="mouse" id="kid">squeak!</div>', in_view(MouseWidget) do
|
|
62
|
+
widget_div(:id => 'kid', :class => "mouse") { "squeak!" }
|
|
63
|
+
end)
|
|
50
64
|
end
|
|
51
65
|
|
|
52
66
|
should "respond to #widget_id" do
|
|
53
|
-
assert_equal
|
|
67
|
+
assert_equal('mum', in_view(MouseWidget){ widget_id })
|
|
54
68
|
end
|
|
55
69
|
|
|
56
70
|
context "#widget_javascript" do
|
|
57
71
|
|
|
58
72
|
should "usually render a javascript block" do
|
|
59
|
-
assert_equal
|
|
73
|
+
assert_equal("<script type=\"text/javascript\">\n//<![CDATA[\nalert("Beer!")\n//]]>\n</script>", in_view(MouseWidget) do
|
|
74
|
+
widget_javascript { 'alert("Beer!")' }
|
|
75
|
+
end)
|
|
60
76
|
end
|
|
61
77
|
|
|
62
|
-
|
|
78
|
+
# FIXME: get the test running?
|
|
79
|
+
should_eventually "be quiet if suppress_js is set" do
|
|
63
80
|
@suppress_js = true ### TODO: use a local, not an instance variable.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
81
|
+
mum = mouse_mock do
|
|
82
|
+
def in_view
|
|
83
|
+
render :suppress_js => true
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
assert_equal(nil, in_view(mum) do
|
|
88
|
+
widget_javascript { 'alert("Beer!")' }
|
|
89
|
+
end)
|
|
72
90
|
end
|
|
73
91
|
end
|
|
74
92
|
end
|
|
@@ -71,25 +71,28 @@ module Apotomo
|
|
|
71
71
|
# Creates a mock controller instance. Currently, each widget needs a parent controller instance due to some
|
|
72
72
|
# sucky dependency in cells.
|
|
73
73
|
def barn_controller!
|
|
74
|
-
@controller = Class.new(
|
|
75
|
-
def initialize
|
|
76
|
-
|
|
77
|
-
self.params = {}
|
|
74
|
+
@controller = Class.new(ApotomoController) do
|
|
75
|
+
def initialize(*)
|
|
76
|
+
super
|
|
78
77
|
self.request = ActionController::TestRequest.new
|
|
79
78
|
end
|
|
80
79
|
|
|
81
80
|
def self.name; "BarnController"; end
|
|
82
81
|
|
|
83
82
|
def self.default_url_options; {:controller => :barn}; end
|
|
84
|
-
include Apotomo::Rails::ControllerMethods
|
|
85
83
|
end.new
|
|
86
|
-
### FIXME: @controller.session = {}
|
|
87
84
|
end
|
|
88
85
|
|
|
89
86
|
def parent_controller
|
|
90
87
|
@controller
|
|
91
88
|
end
|
|
92
89
|
|
|
90
|
+
def namespaced_controller
|
|
91
|
+
controller = Farm::BarnController.new
|
|
92
|
+
controller.request = ActionController::TestRequest.new
|
|
93
|
+
controller
|
|
94
|
+
end
|
|
95
|
+
|
|
93
96
|
end
|
|
94
97
|
end
|
|
95
98
|
end
|
data/test/test_helper.rb
CHANGED
|
@@ -29,12 +29,29 @@ end
|
|
|
29
29
|
|
|
30
30
|
class ApotomoController < ActionController::Base
|
|
31
31
|
include Apotomo::Rails::ControllerMethods
|
|
32
|
+
include Rails.application.routes.url_helpers
|
|
32
33
|
end
|
|
33
34
|
|
|
35
|
+
module Farm
|
|
36
|
+
class BarnController < ApotomoController
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
34
41
|
class MouseCell < Apotomo::StatefulWidget
|
|
35
42
|
def eating; render; end
|
|
43
|
+
def squeak; render; end
|
|
44
|
+
def educate; render; end
|
|
45
|
+
def snooze; render; end
|
|
46
|
+
def listen; render; end
|
|
47
|
+
def answer_squeak; render; end
|
|
48
|
+
def peek; render; end
|
|
49
|
+
def alert; end
|
|
50
|
+
def escape; end
|
|
51
|
+
def snuggle; end
|
|
36
52
|
end
|
|
37
53
|
|
|
54
|
+
### TODO: 2brm?
|
|
38
55
|
class RenderingTestCell < Apotomo::StatefulWidget
|
|
39
56
|
attr_reader :brain
|
|
40
57
|
attr_reader :rendered_children
|
|
@@ -48,6 +65,6 @@ end
|
|
|
48
65
|
|
|
49
66
|
|
|
50
67
|
# Enable dynamic states so we can do Cell.class_eval { def ... } at runtime.
|
|
51
|
-
|
|
68
|
+
Apotomo::Widget.class_eval do
|
|
52
69
|
def action_method?(*); true; end
|
|
53
70
|
end
|
|
@@ -39,6 +39,38 @@ class EventMethodsTest < Test::Unit::TestCase
|
|
|
39
39
|
assert_equal ['answer squeak', 'answer squeak'], @mum.list
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
should "also accept an event argument only" do
|
|
43
|
+
@mum.respond_to_event :answer_squeak
|
|
44
|
+
@mum.fire :answer_squeak
|
|
45
|
+
assert_equal ['answer squeak'], @mum.list
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
should "make pass the event into the triggered state" do
|
|
49
|
+
@mum.instance_eval do
|
|
50
|
+
respond_to_event :footsteps
|
|
51
|
+
|
|
52
|
+
def footsteps(evt)
|
|
53
|
+
list << evt.type
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
@mum.trigger :footsteps
|
|
58
|
+
assert_equal ["escape", :footsteps], @mum.list
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
should "accept payload data for the event" do
|
|
62
|
+
@mum.respond_to_event :answer_squeak
|
|
63
|
+
@mum.instance_eval do
|
|
64
|
+
def answer_squeak
|
|
65
|
+
evt = @opts[:event]
|
|
66
|
+
list << evt.data
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
@mum.fire :answer_squeak, :volume => 9
|
|
71
|
+
assert_equal [{:volume => 9}], @mum.list
|
|
72
|
+
end
|
|
73
|
+
|
|
42
74
|
context "#responds_to_event in class context" do
|
|
43
75
|
setup do
|
|
44
76
|
class AdultMouseCell < MouseCell
|
|
@@ -58,7 +90,6 @@ class EventMethodsTest < Test::Unit::TestCase
|
|
|
58
90
|
end
|
|
59
91
|
end
|
|
60
92
|
|
|
61
|
-
|
|
62
93
|
context "#trigger" do
|
|
63
94
|
should "be an alias for #fire" do
|
|
64
95
|
@kid.trigger :footsteps
|
|
@@ -77,7 +108,6 @@ class EventMethodsTest < Test::Unit::TestCase
|
|
|
77
108
|
@mum.fire :footsteps
|
|
78
109
|
assert_equal ["escape"], @mum.page_updates
|
|
79
110
|
end
|
|
80
|
-
|
|
81
111
|
end
|
|
82
112
|
|
|
83
113
|
end
|
data/test/unit/invoke_test.rb
CHANGED
|
@@ -44,8 +44,6 @@ class InvokeTest < Test::Unit::TestCase
|
|
|
44
44
|
|
|
45
45
|
should "automatically follow the transitions if defined" do
|
|
46
46
|
assert_equal 'snuggle', @mum.last_state
|
|
47
|
-
puts "invoooooooooooooogue"
|
|
48
|
-
puts @mum.last_state.inspect
|
|
49
47
|
@mum.invoke
|
|
50
48
|
assert_equal 'educate', @mum.last_state
|
|
51
49
|
end
|
data/test/unit/widget_test.rb
CHANGED
|
@@ -75,6 +75,11 @@ class WidgetTest < ActiveSupport::TestCase
|
|
|
75
75
|
should "accept arbitrary options" do
|
|
76
76
|
assert_equal({:volume=>"loud", :source=>"mum", :type=>:squeak, :controller=>"barn"}, @mum.address_for_event(:squeak, :volume => 'loud'))
|
|
77
77
|
end
|
|
78
|
+
|
|
79
|
+
should "work with controller namespaces" do
|
|
80
|
+
@mum = Apotomo::Widget.new(namespaced_controller, 'mum', :squeak)
|
|
81
|
+
assert_equal({:source=>"mum", :type=>:squeak, :controller=>"farm/barn"}, @mum.address_for_event(:squeak))
|
|
82
|
+
end
|
|
78
83
|
end
|
|
79
84
|
|
|
80
85
|
context "implementing visibility" do
|
|
@@ -132,5 +137,20 @@ class WidgetTest < ActiveSupport::TestCase
|
|
|
132
137
|
assert_equal 'shrew', @mum.param(:type)
|
|
133
138
|
assert_equal 'Logitech', @mum.param(:brand)
|
|
134
139
|
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# internal_methods:
|
|
143
|
+
should "not list internal methods in action_methods" do
|
|
144
|
+
assert_equal [], Class.new(Apotomo::Widget).action_methods
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
should "list both local and inherited states in Widget.action_methods" do
|
|
148
|
+
assert MouseCell.action_methods.collect{ |m| m.to_s }.include?("eating")
|
|
149
|
+
assert Class.new(MouseCell).action_methods.collect{ |m| m.to_s }.include?("eating")
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
should "not list #display in internal_methods although it's defined in Object" do
|
|
153
|
+
assert_not Apotomo::Widget.internal_methods.include?(:display)
|
|
154
|
+
end
|
|
135
155
|
end
|
|
136
156
|
end
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 1
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
9
|
-
version: 1.0.
|
|
8
|
+
- 2
|
|
9
|
+
version: 1.0.2
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Nick Sutterer
|
|
@@ -14,13 +14,138 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date:
|
|
17
|
+
date: 2011-01-06 00:00:00 +01:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
21
|
-
name:
|
|
21
|
+
name: rails
|
|
22
22
|
prerelease: false
|
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
|
24
|
+
none: false
|
|
25
|
+
requirements:
|
|
26
|
+
- - ~>
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
segments:
|
|
29
|
+
- 3
|
|
30
|
+
- 0
|
|
31
|
+
version: "3.0"
|
|
32
|
+
type: :runtime
|
|
33
|
+
version_requirements: *id001
|
|
34
|
+
- !ruby/object:Gem::Dependency
|
|
35
|
+
name: cells
|
|
36
|
+
prerelease: false
|
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
38
|
+
none: false
|
|
39
|
+
requirements:
|
|
40
|
+
- - ~>
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
segments:
|
|
43
|
+
- 3
|
|
44
|
+
- 4
|
|
45
|
+
version: "3.4"
|
|
46
|
+
type: :runtime
|
|
47
|
+
version_requirements: *id002
|
|
48
|
+
- !ruby/object:Gem::Dependency
|
|
49
|
+
name: onfire
|
|
50
|
+
prerelease: false
|
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
52
|
+
none: false
|
|
53
|
+
requirements:
|
|
54
|
+
- - ~>
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
segments:
|
|
57
|
+
- 0
|
|
58
|
+
- 1
|
|
59
|
+
- 1
|
|
60
|
+
version: 0.1.1
|
|
61
|
+
type: :runtime
|
|
62
|
+
version_requirements: *id003
|
|
63
|
+
- !ruby/object:Gem::Dependency
|
|
64
|
+
name: hooks
|
|
65
|
+
prerelease: false
|
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
67
|
+
none: false
|
|
68
|
+
requirements:
|
|
69
|
+
- - ~>
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
segments:
|
|
72
|
+
- 0
|
|
73
|
+
- 1
|
|
74
|
+
- 3
|
|
75
|
+
version: 0.1.3
|
|
76
|
+
type: :runtime
|
|
77
|
+
version_requirements: *id004
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: jeweler
|
|
80
|
+
prerelease: false
|
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
82
|
+
none: false
|
|
83
|
+
requirements:
|
|
84
|
+
- - ">="
|
|
85
|
+
- !ruby/object:Gem::Version
|
|
86
|
+
segments:
|
|
87
|
+
- 0
|
|
88
|
+
version: "0"
|
|
89
|
+
type: :runtime
|
|
90
|
+
version_requirements: *id005
|
|
91
|
+
- !ruby/object:Gem::Dependency
|
|
92
|
+
name: shoulda
|
|
93
|
+
prerelease: false
|
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
|
95
|
+
none: false
|
|
96
|
+
requirements:
|
|
97
|
+
- - ">="
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
segments:
|
|
100
|
+
- 0
|
|
101
|
+
version: "0"
|
|
102
|
+
type: :runtime
|
|
103
|
+
version_requirements: *id006
|
|
104
|
+
- !ruby/object:Gem::Dependency
|
|
105
|
+
name: mocha
|
|
106
|
+
prerelease: false
|
|
107
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
|
108
|
+
none: false
|
|
109
|
+
requirements:
|
|
110
|
+
- - ">="
|
|
111
|
+
- !ruby/object:Gem::Version
|
|
112
|
+
segments:
|
|
113
|
+
- 0
|
|
114
|
+
version: "0"
|
|
115
|
+
type: :runtime
|
|
116
|
+
version_requirements: *id007
|
|
117
|
+
- !ruby/object:Gem::Dependency
|
|
118
|
+
name: sqlite3-ruby
|
|
119
|
+
prerelease: false
|
|
120
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
|
121
|
+
none: false
|
|
122
|
+
requirements:
|
|
123
|
+
- - "="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
segments:
|
|
126
|
+
- 1
|
|
127
|
+
- 2
|
|
128
|
+
- 5
|
|
129
|
+
version: 1.2.5
|
|
130
|
+
type: :runtime
|
|
131
|
+
version_requirements: *id008
|
|
132
|
+
- !ruby/object:Gem::Dependency
|
|
133
|
+
name: capybara
|
|
134
|
+
prerelease: false
|
|
135
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
|
136
|
+
none: false
|
|
137
|
+
requirements:
|
|
138
|
+
- - ">="
|
|
139
|
+
- !ruby/object:Gem::Version
|
|
140
|
+
segments:
|
|
141
|
+
- 0
|
|
142
|
+
version: "0"
|
|
143
|
+
type: :runtime
|
|
144
|
+
version_requirements: *id009
|
|
145
|
+
- !ruby/object:Gem::Dependency
|
|
146
|
+
name: cells
|
|
147
|
+
prerelease: false
|
|
148
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
|
24
149
|
none: false
|
|
25
150
|
requirements:
|
|
26
151
|
- - ~>
|
|
@@ -31,14 +156,14 @@ dependencies:
|
|
|
31
156
|
- 2
|
|
32
157
|
version: 3.4.2
|
|
33
158
|
type: :runtime
|
|
34
|
-
version_requirements: *
|
|
159
|
+
version_requirements: *id010
|
|
35
160
|
- !ruby/object:Gem::Dependency
|
|
36
161
|
name: rails
|
|
37
162
|
prerelease: false
|
|
38
|
-
requirement: &
|
|
163
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
|
39
164
|
none: false
|
|
40
165
|
requirements:
|
|
41
|
-
- -
|
|
166
|
+
- - ~>
|
|
42
167
|
- !ruby/object:Gem::Version
|
|
43
168
|
segments:
|
|
44
169
|
- 3
|
|
@@ -46,11 +171,11 @@ dependencies:
|
|
|
46
171
|
- 0
|
|
47
172
|
version: 3.0.0
|
|
48
173
|
type: :runtime
|
|
49
|
-
version_requirements: *
|
|
174
|
+
version_requirements: *id011
|
|
50
175
|
- !ruby/object:Gem::Dependency
|
|
51
176
|
name: onfire
|
|
52
177
|
prerelease: false
|
|
53
|
-
requirement: &
|
|
178
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
|
54
179
|
none: false
|
|
55
180
|
requirements:
|
|
56
181
|
- - ">="
|
|
@@ -61,11 +186,11 @@ dependencies:
|
|
|
61
186
|
- 0
|
|
62
187
|
version: 0.1.0
|
|
63
188
|
type: :runtime
|
|
64
|
-
version_requirements: *
|
|
189
|
+
version_requirements: *id012
|
|
65
190
|
- !ruby/object:Gem::Dependency
|
|
66
191
|
name: hooks
|
|
67
192
|
prerelease: false
|
|
68
|
-
requirement: &
|
|
193
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
|
69
194
|
none: false
|
|
70
195
|
requirements:
|
|
71
196
|
- - ~>
|
|
@@ -76,7 +201,7 @@ dependencies:
|
|
|
76
201
|
- 3
|
|
77
202
|
version: 0.1.3
|
|
78
203
|
type: :runtime
|
|
79
|
-
version_requirements: *
|
|
204
|
+
version_requirements: *id013
|
|
80
205
|
description: Web component framework for Rails providing page widgets that trigger events and know when and how to update themselves with AJAX.
|
|
81
206
|
email: apotonick@gmail.com
|
|
82
207
|
executables: []
|
|
@@ -87,6 +212,7 @@ extra_rdoc_files:
|
|
|
87
212
|
- README.rdoc
|
|
88
213
|
- TODO
|
|
89
214
|
files:
|
|
215
|
+
- CHANGES.textile
|
|
90
216
|
- Gemfile
|
|
91
217
|
- README.rdoc
|
|
92
218
|
- Rakefile
|
|
@@ -119,78 +245,78 @@ files:
|
|
|
119
245
|
- lib/generators/apotomo/templates/widget_test.rb
|
|
120
246
|
- lib/generators/apotomo/widget_generator.rb
|
|
121
247
|
- lib/tasks.rake
|
|
122
|
-
- test/
|
|
123
|
-
- test/
|
|
124
|
-
- test/
|
|
125
|
-
- test/
|
|
126
|
-
- test/
|
|
127
|
-
- test/fixtures/mouse/snuggle.html.erb
|
|
128
|
-
- test/fixtures/mouse/content.html.erb
|
|
129
|
-
- test/fixtures/application_widget_tree.rb
|
|
130
|
-
- test/rails/view_methods_test.rb
|
|
131
|
-
- test/rails/controller_methods_test.rb
|
|
132
|
-
- test/rails/view_helper_test.rb
|
|
133
|
-
- test/rails/widget_generator_test.rb
|
|
134
|
-
- test/rails/rails_integration_test.rb
|
|
135
|
-
- test/test_helper.rb
|
|
136
|
-
- test/support/test_case_methods.rb
|
|
248
|
+
- test/dummy/Rakefile
|
|
249
|
+
- test/dummy/app/controllers/application_controller.rb
|
|
250
|
+
- test/dummy/app/helpers/application_helper.rb
|
|
251
|
+
- test/dummy/app/views/layouts/application.html.erb
|
|
252
|
+
- test/dummy/config.ru
|
|
137
253
|
- test/dummy/config/application.rb
|
|
138
|
-
- test/dummy/config/initializers/session_store.rb
|
|
139
|
-
- test/dummy/config/initializers/mime_types.rb
|
|
140
|
-
- test/dummy/config/initializers/secret_token.rb
|
|
141
|
-
- test/dummy/config/initializers/inflections.rb
|
|
142
|
-
- test/dummy/config/initializers/backtrace_silencers.rb
|
|
143
|
-
- test/dummy/config/locales/en.yml
|
|
144
|
-
- test/dummy/config/routes.rb
|
|
145
254
|
- test/dummy/config/boot.rb
|
|
255
|
+
- test/dummy/config/database.yml
|
|
146
256
|
- test/dummy/config/environment.rb
|
|
257
|
+
- test/dummy/config/environments/development.rb
|
|
147
258
|
- test/dummy/config/environments/production.rb
|
|
148
259
|
- test/dummy/config/environments/test.rb
|
|
149
|
-
- test/dummy/config/
|
|
150
|
-
- test/dummy/config/
|
|
151
|
-
- test/dummy/
|
|
152
|
-
- test/dummy/config.
|
|
260
|
+
- test/dummy/config/initializers/backtrace_silencers.rb
|
|
261
|
+
- test/dummy/config/initializers/inflections.rb
|
|
262
|
+
- test/dummy/config/initializers/mime_types.rb
|
|
263
|
+
- test/dummy/config/initializers/secret_token.rb
|
|
264
|
+
- test/dummy/config/initializers/session_store.rb
|
|
265
|
+
- test/dummy/config/locales/en.yml
|
|
266
|
+
- test/dummy/config/routes.rb
|
|
153
267
|
- test/dummy/db/test.sqlite3
|
|
154
|
-
- test/dummy/
|
|
268
|
+
- test/dummy/public/404.html
|
|
155
269
|
- test/dummy/public/422.html
|
|
156
|
-
- test/dummy/public/favicon.ico
|
|
157
270
|
- test/dummy/public/500.html
|
|
158
|
-
- test/dummy/public/
|
|
159
|
-
- test/dummy/public/javascripts/controls.js
|
|
271
|
+
- test/dummy/public/favicon.ico
|
|
160
272
|
- test/dummy/public/javascripts/application.js
|
|
161
|
-
- test/dummy/public/javascripts/
|
|
273
|
+
- test/dummy/public/javascripts/controls.js
|
|
162
274
|
- test/dummy/public/javascripts/dragdrop.js
|
|
163
|
-
- test/dummy/public/javascripts/prototype.js
|
|
164
275
|
- test/dummy/public/javascripts/effects.js
|
|
165
|
-
- test/dummy/
|
|
166
|
-
- test/dummy/
|
|
167
|
-
- test/dummy/
|
|
276
|
+
- test/dummy/public/javascripts/prototype.js
|
|
277
|
+
- test/dummy/public/javascripts/rails.js
|
|
278
|
+
- test/dummy/script/rails
|
|
279
|
+
- test/fixtures/application_widget_tree.rb
|
|
280
|
+
- test/fixtures/mouse/content.html.erb
|
|
281
|
+
- test/fixtures/mouse/eating.html.erb
|
|
282
|
+
- test/fixtures/mouse/educate.html.erb
|
|
283
|
+
- test/fixtures/mouse/feed.html.erb
|
|
284
|
+
- test/fixtures/mouse/make_me_squeak.html.erb
|
|
285
|
+
- test/fixtures/mouse/posing.html.erb
|
|
286
|
+
- test/fixtures/mouse/snuggle.html.erb
|
|
287
|
+
- test/rails/controller_methods_test.rb
|
|
288
|
+
- test/rails/rails_integration_test.rb
|
|
289
|
+
- test/rails/view_helper_test.rb
|
|
290
|
+
- test/rails/view_methods_test.rb
|
|
291
|
+
- test/rails/widget_generator_test.rb
|
|
292
|
+
- test/support/test_case_methods.rb
|
|
293
|
+
- test/test_helper.rb
|
|
294
|
+
- test/unit/apotomo_test.rb
|
|
295
|
+
- test/unit/container_test.rb
|
|
168
296
|
- test/unit/event_handler_test.rb
|
|
169
|
-
- test/unit/
|
|
170
|
-
- test/unit/
|
|
171
|
-
- test/unit/test_addressing.rb
|
|
297
|
+
- test/unit/event_methods_test.rb
|
|
298
|
+
- test/unit/event_test.rb
|
|
172
299
|
- test/unit/invoke_test.rb
|
|
173
|
-
- test/unit/container_test.rb
|
|
174
|
-
- test/unit/test_tab_panel.rb
|
|
175
|
-
- test/unit/test_jump_to_state.rb
|
|
176
|
-
- test/unit/render_test.rb
|
|
177
|
-
- test/unit/test_case_test.rb
|
|
178
|
-
- test/unit/apotomo_test.rb
|
|
179
|
-
- test/unit/request_processor_test.rb
|
|
180
300
|
- test/unit/javascript_generator_test.rb
|
|
181
301
|
- test/unit/onfire_integration_test.rb
|
|
182
302
|
- test/unit/persistence_test.rb
|
|
303
|
+
- test/unit/render_test.rb
|
|
304
|
+
- test/unit/request_processor_test.rb
|
|
305
|
+
- test/unit/stateful_widget_test.rb
|
|
306
|
+
- test/unit/test_addressing.rb
|
|
307
|
+
- test/unit/test_case_test.rb
|
|
308
|
+
- test/unit/test_jump_to_state.rb
|
|
309
|
+
- test/unit/test_tab_panel.rb
|
|
183
310
|
- test/unit/transition_test.rb
|
|
184
|
-
- test/unit/
|
|
185
|
-
- test/unit/event_methods_test.rb
|
|
311
|
+
- test/unit/widget_shortcuts_test.rb
|
|
186
312
|
- test/unit/widget_test.rb
|
|
187
313
|
has_rdoc: true
|
|
188
314
|
homepage: http://apotomo.de
|
|
189
315
|
licenses: []
|
|
190
316
|
|
|
191
317
|
post_install_message:
|
|
192
|
-
rdoc_options:
|
|
193
|
-
|
|
318
|
+
rdoc_options: []
|
|
319
|
+
|
|
194
320
|
require_paths:
|
|
195
321
|
- lib
|
|
196
322
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
@@ -217,68 +343,68 @@ signing_key:
|
|
|
217
343
|
specification_version: 3
|
|
218
344
|
summary: Web components for Rails.
|
|
219
345
|
test_files:
|
|
220
|
-
- test/
|
|
221
|
-
- test/
|
|
222
|
-
- test/
|
|
223
|
-
- test/
|
|
224
|
-
- test/
|
|
225
|
-
- test/fixtures/mouse/snuggle.html.erb
|
|
226
|
-
- test/fixtures/mouse/content.html.erb
|
|
227
|
-
- test/fixtures/application_widget_tree.rb
|
|
228
|
-
- test/rails/view_methods_test.rb
|
|
229
|
-
- test/rails/controller_methods_test.rb
|
|
230
|
-
- test/rails/view_helper_test.rb
|
|
231
|
-
- test/rails/widget_generator_test.rb
|
|
232
|
-
- test/rails/rails_integration_test.rb
|
|
233
|
-
- test/test_helper.rb
|
|
234
|
-
- test/support/test_case_methods.rb
|
|
346
|
+
- test/dummy/Rakefile
|
|
347
|
+
- test/dummy/app/controllers/application_controller.rb
|
|
348
|
+
- test/dummy/app/helpers/application_helper.rb
|
|
349
|
+
- test/dummy/app/views/layouts/application.html.erb
|
|
350
|
+
- test/dummy/config.ru
|
|
235
351
|
- test/dummy/config/application.rb
|
|
236
|
-
- test/dummy/config/initializers/session_store.rb
|
|
237
|
-
- test/dummy/config/initializers/mime_types.rb
|
|
238
|
-
- test/dummy/config/initializers/secret_token.rb
|
|
239
|
-
- test/dummy/config/initializers/inflections.rb
|
|
240
|
-
- test/dummy/config/initializers/backtrace_silencers.rb
|
|
241
|
-
- test/dummy/config/locales/en.yml
|
|
242
|
-
- test/dummy/config/routes.rb
|
|
243
352
|
- test/dummy/config/boot.rb
|
|
353
|
+
- test/dummy/config/database.yml
|
|
244
354
|
- test/dummy/config/environment.rb
|
|
355
|
+
- test/dummy/config/environments/development.rb
|
|
245
356
|
- test/dummy/config/environments/production.rb
|
|
246
357
|
- test/dummy/config/environments/test.rb
|
|
247
|
-
- test/dummy/config/
|
|
248
|
-
- test/dummy/config/
|
|
249
|
-
- test/dummy/
|
|
250
|
-
- test/dummy/config.
|
|
358
|
+
- test/dummy/config/initializers/backtrace_silencers.rb
|
|
359
|
+
- test/dummy/config/initializers/inflections.rb
|
|
360
|
+
- test/dummy/config/initializers/mime_types.rb
|
|
361
|
+
- test/dummy/config/initializers/secret_token.rb
|
|
362
|
+
- test/dummy/config/initializers/session_store.rb
|
|
363
|
+
- test/dummy/config/locales/en.yml
|
|
364
|
+
- test/dummy/config/routes.rb
|
|
251
365
|
- test/dummy/db/test.sqlite3
|
|
252
|
-
- test/dummy/
|
|
366
|
+
- test/dummy/public/404.html
|
|
253
367
|
- test/dummy/public/422.html
|
|
254
|
-
- test/dummy/public/favicon.ico
|
|
255
368
|
- test/dummy/public/500.html
|
|
256
|
-
- test/dummy/public/
|
|
257
|
-
- test/dummy/public/javascripts/controls.js
|
|
369
|
+
- test/dummy/public/favicon.ico
|
|
258
370
|
- test/dummy/public/javascripts/application.js
|
|
259
|
-
- test/dummy/public/javascripts/
|
|
371
|
+
- test/dummy/public/javascripts/controls.js
|
|
260
372
|
- test/dummy/public/javascripts/dragdrop.js
|
|
261
|
-
- test/dummy/public/javascripts/prototype.js
|
|
262
373
|
- test/dummy/public/javascripts/effects.js
|
|
263
|
-
- test/dummy/
|
|
264
|
-
- test/dummy/
|
|
265
|
-
- test/dummy/
|
|
374
|
+
- test/dummy/public/javascripts/prototype.js
|
|
375
|
+
- test/dummy/public/javascripts/rails.js
|
|
376
|
+
- test/dummy/script/rails
|
|
377
|
+
- test/fixtures/application_widget_tree.rb
|
|
378
|
+
- test/fixtures/mouse/content.html.erb
|
|
379
|
+
- test/fixtures/mouse/eating.html.erb
|
|
380
|
+
- test/fixtures/mouse/educate.html.erb
|
|
381
|
+
- test/fixtures/mouse/feed.html.erb
|
|
382
|
+
- test/fixtures/mouse/make_me_squeak.html.erb
|
|
383
|
+
- test/fixtures/mouse/posing.html.erb
|
|
384
|
+
- test/fixtures/mouse/snuggle.html.erb
|
|
385
|
+
- test/rails/controller_methods_test.rb
|
|
386
|
+
- test/rails/rails_integration_test.rb
|
|
387
|
+
- test/rails/view_helper_test.rb
|
|
388
|
+
- test/rails/view_methods_test.rb
|
|
389
|
+
- test/rails/widget_generator_test.rb
|
|
390
|
+
- test/support/test_case_methods.rb
|
|
391
|
+
- test/test_helper.rb
|
|
392
|
+
- test/unit/apotomo_test.rb
|
|
393
|
+
- test/unit/container_test.rb
|
|
266
394
|
- test/unit/event_handler_test.rb
|
|
267
|
-
- test/unit/
|
|
268
|
-
- test/unit/
|
|
269
|
-
- test/unit/test_addressing.rb
|
|
395
|
+
- test/unit/event_methods_test.rb
|
|
396
|
+
- test/unit/event_test.rb
|
|
270
397
|
- test/unit/invoke_test.rb
|
|
271
|
-
- test/unit/container_test.rb
|
|
272
|
-
- test/unit/test_tab_panel.rb
|
|
273
|
-
- test/unit/test_jump_to_state.rb
|
|
274
|
-
- test/unit/render_test.rb
|
|
275
|
-
- test/unit/test_case_test.rb
|
|
276
|
-
- test/unit/apotomo_test.rb
|
|
277
|
-
- test/unit/request_processor_test.rb
|
|
278
398
|
- test/unit/javascript_generator_test.rb
|
|
279
399
|
- test/unit/onfire_integration_test.rb
|
|
280
400
|
- test/unit/persistence_test.rb
|
|
401
|
+
- test/unit/render_test.rb
|
|
402
|
+
- test/unit/request_processor_test.rb
|
|
403
|
+
- test/unit/stateful_widget_test.rb
|
|
404
|
+
- test/unit/test_addressing.rb
|
|
405
|
+
- test/unit/test_case_test.rb
|
|
406
|
+
- test/unit/test_jump_to_state.rb
|
|
407
|
+
- test/unit/test_tab_panel.rb
|
|
281
408
|
- test/unit/transition_test.rb
|
|
282
|
-
- test/unit/
|
|
283
|
-
- test/unit/event_methods_test.rb
|
|
409
|
+
- test/unit/widget_shortcuts_test.rb
|
|
284
410
|
- test/unit/widget_test.rb
|