apotomo 1.2.6 → 1.3.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.
- checksums.yaml +4 -4
- data/CHANGES.textile +4 -0
- data/Gemfile +2 -0
- data/README.md +10 -11
- data/lib/apotomo/railtie.rb +4 -8
- data/lib/apotomo/version.rb +1 -1
- data/lib/apotomo/widget.rb +33 -33
- metadata +24 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f65804220c4a86e32ec48fd0966e1fc89922c598
|
4
|
+
data.tar.gz: 780bf3c9e9f688c4c2bbd4879dfdfa6edd540d94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dee577216e9fb9a740e464fd9fcebe549d77b9f654004cbb73141924dc00a580f4bc4d6a953085216dfe5087eafbe18e36f1744bd0f2383692b279c0a53af5d
|
7
|
+
data.tar.gz: e2d28c8832a7640e8a7bec5e50a723bcf1887074c7c7cb8e38364a9817d27ad3827a77e58da9bc22e092d9b70506b6d00c8b232e82a24c8a78cf8bd74b6b86e8
|
data/CHANGES.textile
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
**Web Components for Rails.**
|
4
4
|
|
5
|
-
[](http://travis-ci.org/apotonick/apotomo)
|
6
5
|
|
7
6
|
## Overview
|
8
7
|
|
@@ -10,7 +9,7 @@ Do you need an _interactive user interface_ for your Rails application? A cool R
|
|
10
9
|
|
11
10
|
Is your controller gettin' fat? And your partial-helper-AJAX pile is getting out of control?
|
12
11
|
|
13
|
-
Do you want a framework to make the implementation easier? _You want Apotomo._
|
12
|
+
Do you want a framework to make the implementation easier? _You want Apotomo._
|
14
13
|
|
15
14
|
**Apotomo** is based on [Cells](http://github.com/apotonick/cells), the popular View Components framework for Rails.
|
16
15
|
|
@@ -23,7 +22,7 @@ Easy as hell. You just need Ruby 1.9.3/2.0.0 and Rails 3/4.
|
|
23
22
|
Add Apotomo to your `Gemfile`:
|
24
23
|
|
25
24
|
```ruby
|
26
|
-
gem
|
25
|
+
gem 'apotomo'
|
27
26
|
```
|
28
27
|
|
29
28
|
## Example
|
@@ -60,7 +59,7 @@ You now tell your controller about the new widget.
|
|
60
59
|
|
61
60
|
```ruby
|
62
61
|
class PostsController < ApplicationController
|
63
|
-
|
62
|
+
|
64
63
|
has_widgets do |root|
|
65
64
|
root << widget(:comments, :post => @post)
|
66
65
|
end
|
@@ -77,7 +76,7 @@ Rendering usually happens in your controller view, `app/views/posts/show.html.ha
|
|
77
76
|
%p
|
78
77
|
= @post.body
|
79
78
|
%p
|
80
|
-
= render_widget :comments
|
79
|
+
= render_widget :comments, post: @post
|
81
80
|
```
|
82
81
|
|
83
82
|
## Write the widget
|
@@ -87,7 +86,7 @@ A widget is like a cell which is like a mini-controller.
|
|
87
86
|
```ruby
|
88
87
|
class CommentsWidget < Apotomo::Widget
|
89
88
|
responds_to_event :post
|
90
|
-
|
89
|
+
|
91
90
|
def display(args)
|
92
91
|
@comments = args[:post].comments # the parameter from outside.
|
93
92
|
|
@@ -97,13 +96,13 @@ class CommentsWidget < Apotomo::Widget
|
|
97
96
|
|
98
97
|
Having `display` as the default state when rendering, this method collects comments to show and renders its view.
|
99
98
|
|
100
|
-
And look at line 2 - if encountering a `:post` event we invoke `#post`, which is simply another state. How cool is that?
|
99
|
+
And look at line 2 - if encountering a `:post` event we invoke `#post`, which is simply another state. How cool is that?
|
101
100
|
|
102
101
|
```ruby
|
103
102
|
def post(event)
|
104
103
|
@comment = Comment.new :post_id => event[:post_id]
|
105
104
|
@comment.update_attributes event[:comment] # a bit like params[].
|
106
|
-
|
105
|
+
|
107
106
|
update :state => :display
|
108
107
|
end
|
109
108
|
end
|
@@ -128,7 +127,7 @@ Take a look at the widget's view `display.html.haml`.
|
|
128
127
|
%ul
|
129
128
|
- for comment in @comments
|
130
129
|
%li= comment.text
|
131
|
-
|
130
|
+
|
132
131
|
= form_for :comment, :url => url_for_event(:post), :remote => true do |f|
|
133
132
|
= f.text_field :text
|
134
133
|
= f.submit
|
@@ -179,11 +178,11 @@ class CommentsWidgetTest < Apotomo::TestCase
|
|
179
178
|
has_widgets do |root|
|
180
179
|
root << widget(:comments, :post => @pervert_post)
|
181
180
|
end
|
182
|
-
|
181
|
+
|
183
182
|
def test_render
|
184
183
|
render_widget :comments
|
185
184
|
assert_select "li#me"
|
186
|
-
|
185
|
+
|
187
186
|
trigger :post, :comment => {:text => "Sex on the beach"}
|
188
187
|
assert_response 'alert("Hey, you wanted to submit a pervert comment!");'
|
189
188
|
end
|
data/lib/apotomo/railtie.rb
CHANGED
@@ -5,20 +5,16 @@ module Apotomo
|
|
5
5
|
rake_tasks do
|
6
6
|
load "apotomo/apotomo.rake"
|
7
7
|
end
|
8
|
-
|
9
|
-
# As we are a Railtie only, the routes won't be loaded automatically. Beside that, we want our
|
8
|
+
|
9
|
+
# As we are a Railtie only, the routes won't be loaded automatically. Beside that, we want our
|
10
10
|
# route to be the very first (otherwise #resources might supersede it).
|
11
11
|
initializer 'apotomo.prepend_routes', :after => :add_routing_paths do |app|
|
12
12
|
app.routes_reloader.paths.unshift(File.dirname(__FILE__) + "/../../config/routes.rb")
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
# Include a lazy loader via has_widgets.
|
16
16
|
initializer 'apotomo.add_has_widgets' do |app|
|
17
17
|
ActionController::Base.extend Apotomo::Rails::ControllerMethodsLoader
|
18
18
|
end
|
19
|
-
|
20
|
-
initializer 'apotomo.setup_view_paths', :after => 'cells.setup_view_paths' do |app|
|
21
|
-
Apotomo::Widget.setup_view_paths!
|
22
|
-
end
|
23
|
-
end
|
19
|
+
end
|
24
20
|
end
|
data/lib/apotomo/version.rb
CHANGED
data/lib/apotomo/widget.rb
CHANGED
@@ -30,16 +30,16 @@ module Apotomo
|
|
30
30
|
# def display
|
31
31
|
# @cheese = options[:favorites].first
|
32
32
|
#
|
33
|
-
# 2. Request data from forms etc. is available through <tt>event.data</tt> in the triggered states.
|
33
|
+
# 2. Request data from forms etc. is available through <tt>event.data</tt> in the triggered states.
|
34
34
|
# Use the <tt>#[]</tt> shortcut to access values directly.
|
35
35
|
#
|
36
36
|
# def update(evt)
|
37
37
|
# @cheese = Cheese.find evt[:cheese_id]
|
38
38
|
class Widget < Cell::Rails
|
39
|
-
|
40
|
-
|
39
|
+
self.view_paths = "app/widgets"
|
40
|
+
|
41
41
|
include Hooks
|
42
|
-
|
42
|
+
|
43
43
|
# Use this for setup code you're calling in every state. Almost like a +before_filter+ except that it's
|
44
44
|
# invoked after the initialization in #has_widgets.
|
45
45
|
#
|
@@ -51,60 +51,60 @@ module Apotomo
|
|
51
51
|
# end
|
52
52
|
define_hook :after_initialize
|
53
53
|
define_hook :has_widgets
|
54
|
-
|
54
|
+
|
55
55
|
attr_writer :visible
|
56
|
-
|
56
|
+
|
57
57
|
include TreeNode
|
58
|
-
|
58
|
+
|
59
59
|
include Onfire
|
60
|
-
|
60
|
+
|
61
61
|
include EventMethods
|
62
62
|
include WidgetShortcuts
|
63
63
|
include JavascriptMethods
|
64
|
-
|
64
|
+
|
65
65
|
helper Apotomo::Rails::ViewHelper
|
66
66
|
helper Apotomo::Rails::ActionViewMethods
|
67
|
-
|
67
|
+
|
68
68
|
abstract!
|
69
69
|
undef :display # We don't want #display to be listed in #internal_methods.
|
70
|
-
|
70
|
+
|
71
71
|
attr_reader :name
|
72
72
|
alias_method :widget_id, :name
|
73
73
|
|
74
74
|
attr_reader :options
|
75
|
-
|
75
|
+
|
76
76
|
after_initialize do
|
77
77
|
run_hook :has_widgets, self
|
78
78
|
end
|
79
|
-
|
80
|
-
|
79
|
+
|
80
|
+
|
81
81
|
def initialize(parent, id, options={})
|
82
82
|
super(parent) # TODO: do that as long as cells do need a parent_controller.
|
83
83
|
@options = options
|
84
84
|
@name = id
|
85
85
|
@visible = true
|
86
|
-
|
86
|
+
|
87
87
|
setup_tree_node(parent)
|
88
|
-
|
88
|
+
|
89
89
|
run_hook :after_initialize, self
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
def parent_controller
|
93
93
|
# i hope we'll get rid of any parent_controller dependency, soon.
|
94
94
|
root? ? @parent_controller : root.parent_controller
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
def visible?
|
98
98
|
@visible
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
# Invokes +state+ and hopefully returns the rendered content.
|
102
102
|
def invoke(state, *args)
|
103
|
-
return render_state(state, *args) if method(state).arity != 0 # TODO: remove check and make trigger states receive the evt default.
|
103
|
+
return render_state(state, *args) if method(state).arity != 0 # TODO: remove check and make trigger states receive the evt default.
|
104
104
|
render_state(state)
|
105
105
|
end
|
106
|
-
|
107
|
-
# Renders and returns a view for the current state. That's why it is usually called at the end of
|
106
|
+
|
107
|
+
# Renders and returns a view for the current state. That's why it is usually called at the end of
|
108
108
|
# a state method.
|
109
109
|
#
|
110
110
|
# ==== Options
|
@@ -113,7 +113,7 @@ module Apotomo
|
|
113
113
|
# Example:
|
114
114
|
# class MouseWidget < Apotomo::Widget
|
115
115
|
# def eat
|
116
|
-
# render
|
116
|
+
# render
|
117
117
|
# end
|
118
118
|
#
|
119
119
|
# render the view <tt>eat.haml</tt>.
|
@@ -124,27 +124,27 @@ module Apotomo
|
|
124
124
|
def render(*args, &block)
|
125
125
|
super
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
# Returns the widget named +widget_id+ if it's a descendent or self.
|
129
129
|
def find_widget(widget_id)
|
130
130
|
find {|node| node.name.to_s == widget_id.to_s}
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
def address_for_event(type, options={})
|
134
134
|
options.reverse_merge! :source => name,
|
135
135
|
:type => type,
|
136
|
-
:controller => parent_controller.controller_path # DISCUSS: dependency to parent_controller.
|
136
|
+
:controller => parent_controller.controller_path # DISCUSS: dependency to parent_controller.
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
def url_for_event(type, options={})
|
140
|
-
apotomo_event_path address_for_event(type, options)
|
140
|
+
apotomo_event_path address_for_event(type, options)
|
141
141
|
end
|
142
|
-
|
143
|
-
|
142
|
+
|
143
|
+
|
144
144
|
def self.controller_path
|
145
145
|
@controller_path ||= name.sub(/Widget$/, '').underscore unless anonymous?
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
# Renders the +widget+ (instance or id).
|
149
149
|
def render_widget(widget_id, state=:display, *args)
|
150
150
|
if widget_id.kind_of?(Widget)
|
@@ -152,9 +152,9 @@ module Apotomo
|
|
152
152
|
else
|
153
153
|
widget = find_widget(widget_id) or raise "Couldn't render non-existent widget `#{widget_id}`"
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
widget.invoke(state, *args)
|
157
157
|
end
|
158
158
|
end
|
159
159
|
end
|
160
|
-
|
160
|
+
|
metadata
CHANGED
@@ -1,125 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apotomo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03
|
11
|
+
date: 2014-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cells
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.6.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.6.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: onfire
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.2.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.2.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: hooks
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.4.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.4.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: slim
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: haml
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: tzinfo
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: minitest
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 4.7.5
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ~>
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 4.7.5
|
125
125
|
description: Web component framework for Rails providing widgets that trigger events
|
@@ -130,8 +130,8 @@ executables: []
|
|
130
130
|
extensions: []
|
131
131
|
extra_rdoc_files: []
|
132
132
|
files:
|
133
|
-
-
|
134
|
-
-
|
133
|
+
- .gitignore
|
134
|
+
- .travis.yml
|
135
135
|
- CHANGES.textile
|
136
136
|
- Gemfile
|
137
137
|
- README.md
|
@@ -231,68 +231,18 @@ require_paths:
|
|
231
231
|
- lib
|
232
232
|
required_ruby_version: !ruby/object:Gem::Requirement
|
233
233
|
requirements:
|
234
|
-
- -
|
234
|
+
- - '>='
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: '0'
|
237
237
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
238
238
|
requirements:
|
239
|
-
- -
|
239
|
+
- - '>='
|
240
240
|
- !ruby/object:Gem::Version
|
241
241
|
version: '0'
|
242
242
|
requirements: []
|
243
243
|
rubyforge_project:
|
244
|
-
rubygems_version: 2.2.
|
244
|
+
rubygems_version: 2.2.2
|
245
245
|
signing_key:
|
246
246
|
specification_version: 4
|
247
247
|
summary: Web components for Rails.
|
248
|
-
test_files:
|
249
|
-
- test/apotomo_test.rb
|
250
|
-
- test/dummy/Rakefile
|
251
|
-
- test/dummy/app/controllers/application_controller.rb
|
252
|
-
- test/dummy/app/helpers/application_helper.rb
|
253
|
-
- test/dummy/app/views/layouts/application.html.erb
|
254
|
-
- test/dummy/config.ru
|
255
|
-
- test/dummy/config/application.rb
|
256
|
-
- test/dummy/config/boot.rb
|
257
|
-
- test/dummy/config/database.yml
|
258
|
-
- test/dummy/config/environment.rb
|
259
|
-
- test/dummy/config/environments/development.rb
|
260
|
-
- test/dummy/config/environments/production.rb
|
261
|
-
- test/dummy/config/environments/test.rb
|
262
|
-
- test/dummy/config/initializers/backtrace_silencers.rb
|
263
|
-
- test/dummy/config/initializers/inflections.rb
|
264
|
-
- test/dummy/config/initializers/mime_types.rb
|
265
|
-
- test/dummy/config/initializers/secret_token.rb
|
266
|
-
- test/dummy/config/initializers/session_store.rb
|
267
|
-
- test/dummy/config/locales/en.yml
|
268
|
-
- test/dummy/config/routes.rb
|
269
|
-
- test/dummy/db/test.sqlite3
|
270
|
-
- test/dummy/public/404.html
|
271
|
-
- test/dummy/public/422.html
|
272
|
-
- test/dummy/public/500.html
|
273
|
-
- test/dummy/public/favicon.ico
|
274
|
-
- test/dummy/public/stylesheets/.gitkeep
|
275
|
-
- test/event_handler_test.rb
|
276
|
-
- test/event_methods_test.rb
|
277
|
-
- test/event_test.rb
|
278
|
-
- test/invoke_event_handler_test.rb
|
279
|
-
- test/javascript_generator_test.rb
|
280
|
-
- test/rails/caching_test.rb
|
281
|
-
- test/rails/controller_methods_test.rb
|
282
|
-
- test/rails/rails_integration_test.rb
|
283
|
-
- test/rails/view_helper_test.rb
|
284
|
-
- test/rails/widget_generator_test.rb
|
285
|
-
- test/render_test.rb
|
286
|
-
- test/request_processor_test.rb
|
287
|
-
- test/test_case_methods.rb
|
288
|
-
- test/test_case_test.rb
|
289
|
-
- test/test_helper.rb
|
290
|
-
- test/tree_node_test.rb
|
291
|
-
- test/widget_shortcuts_test.rb
|
292
|
-
- test/widget_test.rb
|
293
|
-
- test/widgets/mouse/eat.erb
|
294
|
-
- test/widgets/mouse/eating.html.erb
|
295
|
-
- test/widgets/mouse/educate.html.erb
|
296
|
-
- test/widgets/mouse/feed.html.erb
|
297
|
-
- test/widgets/mouse/make_me_squeak.html.erb
|
298
|
-
- test/widgets/mouse/snuggle.html.erb
|
248
|
+
test_files: []
|