genki-merb_component 0.2.0.1 → 0.2.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/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