genki-merb_component 0.2.0 → 0.2.0.1

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/README CHANGED
@@ -25,20 +25,8 @@ Example of use:
25
25
  In views:
26
26
 
27
27
  Content of the user (id is 2) goes here
28
- <%= component Users, :show, :id => 2 %>
29
-
30
- Or, you can use symbol to specify subsidiary controller
31
28
  <%= component :users, :show, :id => 2 %>
32
29
 
33
- Index of posts related with the @user go here
34
- <% Post.related_with @user do %>
35
- <%= component Posts, :index %>
36
- <% end %>
37
-
38
- In app/views/posts/index.html.erb,
39
- You can access to the corresponding relation like this
40
- <%= Post.relation #=> @user %>
41
-
42
30
  For detail, you can see spec/fixture as an example.
43
31
 
44
32
  Enjoy!
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'merb-core'
5
5
  require 'merb-core/tasks/merb'
6
6
 
7
7
  GEM_NAME = "merb_component"
8
- GEM_VERSION = "0.2.0"
8
+ GEM_VERSION = "0.2.0.1"
9
9
  AUTHOR = "Genki Takiuchi"
10
10
  EMAIL = "genki@s21g.com"
11
11
  HOMEPAGE = "http://blog.s21g.com/genki"
@@ -58,8 +58,12 @@ class Merb::Controller
58
58
  cc.class.layout(layout)
59
59
  end
60
60
  object = cc.instance_variable_get(var)
61
+ throw(:halt, proc{
62
+ target = controller_name.singular.intern
63
+ target = object.send(target) if object.respond_to?(target)
64
+ redirect resource(target)
65
+ }) if object.errors.empty?
61
66
  c.instance_variable_set(var, object)
62
- object = model.new if object.errors.empty?
63
67
  end
64
68
  elsif params[:id]
65
69
  # GET with component id
@@ -77,7 +81,7 @@ class Merb::Controller
77
81
  end
78
82
 
79
83
  class Aggregator
80
- attr_reader :controller, :object, :result
84
+ attr_reader :controller, :object, :result, :context
81
85
 
82
86
  def initialize(context, controller, &block)
83
87
  @context = context
@@ -123,8 +127,22 @@ class Merb::Controller
123
127
  (aggregators[self.class] ||= []).last
124
128
  end
125
129
 
130
+ def url_with_scope(*args)
131
+ result = url_without_scope(*args)
132
+ if (agg = aggregator) && (key = agg.key)
133
+ resource_without_scope(key) + result
134
+ else
135
+ result
136
+ end
137
+ end
138
+ alias_method :url_without_scope, :url
139
+ alias_method :url, :url_with_scope
140
+
126
141
  private
127
142
  def component(controller, action, params = {})
143
+ params = self.params.merge(
144
+ :controller => controller, :action => action
145
+ ).merge(params)
128
146
  var = "@#{controller.to_s.singular}"
129
147
  object = instance_variable_get("#{var}_component")
130
148
  controller = Object.full_const_get(controller.to_s.camel_case)
@@ -156,8 +174,9 @@ private
156
174
  end
157
175
  end
158
176
 
159
- def resource(first, *args)
160
- return super unless aggregator
177
+ def resource_with_scope(first, *args)
178
+ agg = aggregator
179
+ return resource_without_scope(first, *args) unless agg
161
180
 
162
181
  controller = case first
163
182
  when Symbol, String
@@ -166,8 +185,12 @@ private
166
185
  Object.full_const_get(first.class.to_s.pluralize.camel_case)
167
186
  end
168
187
 
169
- return super unless controller <=> aggregator.controller
170
- return super unless key = aggregator.key
171
- super(key, first, *args)
188
+ if controller <=> agg.controller && agg.key
189
+ resource_without_scope(agg.key, first, *args)
190
+ else
191
+ resource_without_scope(first, *args)
192
+ end
172
193
  end
194
+ alias_method :resource_without_scope, :resource
195
+ alias_method :resource, :resource_with_scope
173
196
  end
data/spec/admin_spec.rb CHANGED
@@ -25,13 +25,24 @@ describe "Admin controller" do
25
25
  Comment.count.should > 0
26
26
  end
27
27
 
28
- it "should index html" do
28
+ it "should show index html" do
29
29
  res = request(resource(:admin))
30
30
  res.should be_successful
31
31
  res.should have_xpath("//h1")
32
32
  res.should have_xpath("//h2")
33
33
  res.should have_xpath("//ul/li")
34
34
  res.should_not have_xpath("//form")
35
+ res.should have_xpath("//a[@href='/admin/comments?page=1']")
36
+ end
37
+
38
+ it "should show index html for pagination params" do
39
+ res = request("/admin/comments?page=2")
40
+ res.should be_successful
41
+ res.should have_xpath("//h1")
42
+ res.should have_xpath("//h2")
43
+ res.should have_xpath("//ul")
44
+ res.should_not have_xpath("//form")
45
+ res.should have_xpath("//a[@href='/admin/comments?page=3']")
35
46
  end
36
47
 
37
48
  it "should show html after update a comment" do
@@ -39,14 +50,14 @@ describe "Admin controller" do
39
50
  comment.should be_kind_of(Comment)
40
51
  res = request(resource(:admin, comment),
41
52
  :method => 'PUT', :params => {:comment => {:body => "bar"}})
53
+ res.should redirect_to("/admin")
54
+
55
+ res = request(res.headers["Location"])
42
56
  res.should be_successful
43
57
  res.should have_xpath("//h1")
44
58
  res.should have_xpath("//h2")
45
59
  res.should have_xpath("//ul/li[1]")
46
- res.should have_xpath("//form[@action='/admin/comments']")
47
- res.should have_xpath("//form[@method='post']")
48
- res.should_not have_xpath("//input[@value='put']")
49
- res.should contain("bar")
60
+ res.should_not have_xpath("//form")
50
61
  end
51
62
 
52
63
  it "should show html after failed to update a comment" do
@@ -70,14 +81,13 @@ describe "Admin controller" do
70
81
  comment = @post.comments.last
71
82
  comment.should be_kind_of(Comment)
72
83
  res = request(resource(:admin, comment), :method => 'DELETE')
84
+ res.should redirect_to("/admin")
85
+
86
+ res = request(res.headers["Location"])
73
87
  res.should be_successful
74
88
  res.should have_xpath("//h1")
75
89
  res.should have_xpath("//h2")
76
- res.should have_xpath("//form")
77
- res.should have_xpath("//form[@action='/admin/comments']")
78
- res.should have_xpath("//form[@method='post']")
79
- res.should_not have_xpath("//input[@value='put']")
80
- res.should_not have_xpath("//body/meta")
90
+ res.should_not have_xpath("//form")
81
91
  @post.comments.count.should == count - 1
82
92
  end
83
93
 
@@ -7,3 +7,5 @@
7
7
  </li>
8
8
  <% end %>
9
9
  </ul>
10
+
11
+ <%= link_to "next", url(:page => params[:page].to_i + 1) %>
@@ -1,4 +1,4 @@
1
1
  <h1><%= link_to @post.id.to_s, resource(@post) %></h1>
2
2
 
3
- <%= component Comments, :index %>
3
+ <%= component :comments, :index %>
4
4
  <%= form_for_component :comments %>
@@ -5,21 +5,22 @@ describe "merb_component" do
5
5
  Posts.private_instance_methods.should be_include("component")
6
6
  Posts.private_instance_methods.should be_include("form_for_component")
7
7
  Posts.instance_methods.should be_include("aggregator")
8
+ Posts.private_instance_methods.should be_include("resource")
9
+ Posts.public_instance_methods.should be_include("url")
8
10
  end
9
11
 
10
12
  it "should not extend model" do
11
13
  Post.public_methods.should_not be_include("related_with")
12
14
  end
13
15
 
14
- it "should accept controller class as the first param of compoent" do
15
- req = Merb::Request.new({})
16
- result = Posts.new(req).send(:component, Comments, :index)
17
- result.should be_kind_of(String)
18
- end
19
-
20
16
  it "should accept symbol as the first param of compoent" do
21
17
  req = Merb::Request.new({})
22
- result = Posts.new(req).send(:component, :comments, :index)
18
+ c = Posts.new(req)
19
+ proc do
20
+ c.send(:component, :comments, :index)
21
+ end.should raise_error(Merb::Router::GenerationError)
22
+ c.instance_variable_set(:@post, Post.create)
23
+ result = c.send(:component, :comments, :index)
23
24
  result.should be_kind_of(String)
24
25
  end
25
26
  end
data/spec/posts_spec.rb CHANGED
@@ -35,12 +35,29 @@ describe "Posts controller" do
35
35
  res.should have_xpath("//form[@action='/posts/#{@post.id}/comments']")
36
36
  res.should_not have_xpath("//input[@value='put']")
37
37
  res.should have_xpath("//input[@value='new']")
38
+ res.should have_xpath("//a[@href='/posts/#{@post.id}/comments?page=1']")
38
39
  end
39
40
 
41
+ it "should show html for pagination params" do
42
+ res = request("/posts/#{@post.id}/comments?page=2")
43
+ res.should be_successful
44
+ res.should have_xpath("//h1")
45
+ res.should have_xpath("//h2")
46
+ res.should have_xpath("//ul/li")
47
+ res.should have_xpath("//form[@method='post']")
48
+ res.should have_xpath("//form[@action='/posts/#{@post.id}/comments']")
49
+ res.should_not have_xpath("//input[@value='put']")
50
+ res.should have_xpath("//input[@value='new']")
51
+ res.should have_xpath("//a[@href='/posts/#{@post.id}/comments?page=3']")
52
+ end
53
+
40
54
  it "should show html after post a comment" do
41
55
  count = @post.comments.count
42
56
  res = request(resource(@post, :comments),
43
57
  :method => 'POST', :params => {:comment => {:body => "foo"}})
58
+ res.should redirect_to("/posts/#{@post.id}")
59
+
60
+ res = request(res.headers["Location"])
44
61
  res.should be_successful
45
62
  res.should have_xpath("//h1")
46
63
  res.should have_xpath("//h2")
@@ -75,6 +92,9 @@ describe "Posts controller" do
75
92
  comment.should be_kind_of(Comment)
76
93
  res = request(resource(@post, comment),
77
94
  :method => 'PUT', :params => {:comment => {:body => "bar"}})
95
+ res.should redirect_to("/posts/#{@post.id}")
96
+
97
+ res = request(res.headers["Location"])
78
98
  res.should be_successful
79
99
  res.should have_xpath("//h1")
80
100
  res.should have_xpath("//h2")
@@ -109,6 +129,9 @@ describe "Posts controller" do
109
129
  comment = @post.comments.last
110
130
  comment.should be_kind_of(Comment)
111
131
  res = request(resource(@post, comment), :method => 'DELETE')
132
+ res.should redirect_to("/posts/#{@post.id}")
133
+
134
+ res = request(res.headers["Location"])
112
135
  res.should be_successful
113
136
  res.should have_xpath("//h1")
114
137
  res.should have_xpath("//h2")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: genki-merb_component
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Takiuchi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-26 00:00:00 -08:00
12
+ date: 2009-01-27 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency