genki-merb_component 0.2.0 → 0.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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