genki-merb_component 0.2.0.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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.1"
8
+ GEM_VERSION = "0.2.1"
9
9
  AUTHOR = "Genki Takiuchi"
10
10
  EMAIL = "genki@s21g.com"
11
11
  HOMEPAGE = "http://blog.s21g.com/genki"
@@ -24,6 +24,7 @@ spec = Gem::Specification.new do |s|
24
24
  s.email = EMAIL
25
25
  s.homepage = HOMEPAGE
26
26
  s.add_dependency('merb', '>= 1.0.7.1')
27
+ s.add_development_dependency('merb_full_url', '>= 0.0.2')
27
28
  s.require_path = 'lib'
28
29
  s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
29
30
 
@@ -53,7 +53,7 @@ class Merb::Controller
53
53
  begin
54
54
  layout = cc.class.default_layout
55
55
  cc.class.layout(options[:layout])
56
- response = cc._abstract_dispatch(action)
56
+ cc._abstract_dispatch(action)
57
57
  ensure
58
58
  cc.class.layout(layout)
59
59
  end
@@ -69,6 +69,9 @@ class Merb::Controller
69
69
  # GET with component id
70
70
  object = model.get(params[:id])
71
71
  c.instance_variable_set(var, object)
72
+ elsif params[:format]
73
+ @component_format = params.delete(:format)
74
+ #c._abstract_dispatch(action)
72
75
  end
73
76
  c.instance_variable_set("#{var}_component", object)
74
77
 
@@ -76,6 +79,20 @@ class Merb::Controller
76
79
  c.params[:id] = id if id
77
80
  c.params[:action] = c.action_name = agg_action.to_s
78
81
  }, :only => arg)
82
+
83
+ add_filter(_after_filters, proc{|c|
84
+ # setup request
85
+ request.reset_params!
86
+ request.instance_variable_set(:@params, params.merge(
87
+ :controller => arg, :action => :index,
88
+ :format => @component_format))
89
+
90
+ # call index action of subsidiary controller with scope
91
+ cc = Object.full_const_get(arg.to_s.camel_case).new(request)
92
+ @body = Aggregator.new(c, cc.class) do
93
+ cc._abstract_dispatch(:index)
94
+ end.result
95
+ }, :only => agg_action, :if => proc{@component_format})
79
96
  end
80
97
  end
81
98
  end
@@ -150,13 +167,18 @@ private
150
167
  req.reset_params!
151
168
  req.instance_variable_set :@params, params
152
169
 
153
- Aggregator.new(self, controller) do
170
+ Aggregator.new(this = self, controller) do
154
171
  controller.new(req)._dispatch(action).instance_eval do
155
172
  if object
156
173
  original = instance_variable_get(var)
157
174
  object.attributes = original.attributes if original
158
175
  instance_variable_set(var, object)
159
176
  end
177
+ cc = this.instance_variable_get(:@_caught_content)
178
+ instance_variable_get(:@_caught_content).each do |k, v|
179
+ next if k == :for_layout
180
+ cc[k].nil? ? this.throw_content(k, v) : this.append_content(k, v)
181
+ end
160
182
  render :layout => false
161
183
  end
162
184
  end.result
@@ -2,7 +2,7 @@ Merb::Router.extensions do
2
2
  def aggregates(resource, options = {})
3
3
  options[:controller] ||= @params[:controller]
4
4
  match("/:action/:id").to(options)
5
- match("/:action").to(options)
5
+ match("/:action(.:format)").to(options)
6
6
  resources resource
7
7
  end
8
8
  end
@@ -1,5 +1,6 @@
1
1
  class Comments < Application
2
2
  is_component :comment
3
+ provides :atom, :only => :index
3
4
 
4
5
  def new
5
6
  @comment = Comment.new
@@ -0,0 +1,21 @@
1
+ xml.instruct! :xml, :version=>"1.0"
2
+ xml.feed(:xmlns => "http://www.w3.org/2005/Atom") do |feed|
3
+ feed.title @title
4
+ feed.link :type => 'text/html', :rel => 'alternate',
5
+ :href => full_resource(:comments)
6
+
7
+ @comments.each do |comment|
8
+ feed.entry do |entry|
9
+ entry.id comment.id
10
+ entry.title "Comment to post#%s" % comment.post.id
11
+ entry.content comment.body, :type => 'text'
12
+ #entry.issued comment.created_at
13
+ #entry.modified comment.updated_at
14
+ entry.link :type => "text/html", :rel => "alternate",
15
+ :href => full_resource(comment)
16
+ #entry.author do |author|
17
+ # author.name comment.user.login
18
+ #end
19
+ end
20
+ end
21
+ end
@@ -9,3 +9,7 @@
9
9
  </ul>
10
10
 
11
11
  <%= link_to "next", url(:page => params[:page].to_i + 1) %>
12
+
13
+ <% throw_content :for_post do %>
14
+ test_content
15
+ <% end %>
@@ -2,3 +2,5 @@
2
2
 
3
3
  <%= component :comments, :index %>
4
4
  <%= form_for_component :comments %>
5
+
6
+ <%= catch_content :for_post %>
data/spec/posts_spec.rb CHANGED
@@ -36,6 +36,7 @@ describe "Posts controller" do
36
36
  res.should_not have_xpath("//input[@value='put']")
37
37
  res.should have_xpath("//input[@value='new']")
38
38
  res.should have_xpath("//a[@href='/posts/#{@post.id}/comments?page=1']")
39
+ res.should contain("test_content")
39
40
  end
40
41
 
41
42
  it "should show html for pagination params" do
@@ -156,4 +157,17 @@ describe "Posts controller" do
156
157
 
157
158
  pending "should check pagination"
158
159
  end
160
+
161
+ it "should provide atom feed for comments" do
162
+ comment = @post.comments.create(:body => "test")
163
+ comment.should_not be_new_record
164
+ res = request(resource(@post, :comments, :format => :atom))
165
+ res.should be_successful
166
+ res.should have_xpath("//feed/title")
167
+ url = "http://example.org/posts/#{@post.id}/comments"
168
+ res.should have_xpath("//feed/link[@href='#{url}']")
169
+ res.should have_xpath("//entry/title")
170
+ url = "http://example.org/posts/#{@post.id}/comments/#{comment.id}"
171
+ res.should have_xpath("//entry/link[@href='#{url}']")
172
+ end
159
173
  end
data/spec/spec_helper.rb CHANGED
@@ -12,6 +12,8 @@ dependency "merb-action-args"
12
12
  dependency "merb-helpers"
13
13
  dependency "merb-assets"
14
14
  dependency "dm-validations"
15
+ dependency "merb-builder"
16
+ dependency "merb_full_url"
15
17
 
16
18
  use_orm :datamapper
17
19
  use_test :rspec
@@ -28,6 +30,7 @@ Merb.start_environment(
28
30
  :log_file => File.dirname(__FILE__) / '..' / "merb_test.log"
29
31
  )
30
32
  DataMapper.setup(:default, "sqlite3::memory:")
33
+ Merb.add_mime_type(:atom, :to_atom, %w[application/atom+xml])
31
34
 
32
35
  Spec::Runner.configure do |config|
33
36
  config.include(Merb::Test::ViewHelper)
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.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Takiuchi
@@ -21,6 +21,15 @@ dependencies:
21
21
  - !ruby/object:Gem::Version
22
22
  version: 1.0.7.1
23
23
  version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: merb_full_url
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 0.0.2
32
+ version:
24
33
  description: Merb plugin that provides composition of controllers.
25
34
  email: genki@s21g.com
26
35
  executables: []
@@ -58,6 +67,7 @@ files:
58
67
  - spec/fixture/app/views/admin/show.html.erb
59
68
  - spec/fixture/app/views/comments
60
69
  - spec/fixture/app/views/comments/edit.html.erb
70
+ - spec/fixture/app/views/comments/index.atom.builder
61
71
  - spec/fixture/app/views/comments/index.html.erb
62
72
  - spec/fixture/app/views/comments/new.html.erb
63
73
  - spec/fixture/app/views/layout