roda 2.7.0 → 2.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ba4bf20bc11b1e1d4482325c64d4ae439a7665dd
4
- data.tar.gz: 2f17d46442001a41ba9223db2b71545d11e7ac3e
3
+ metadata.gz: 49da3db12f5573c87c6be816d293503ff794ea2f
4
+ data.tar.gz: 443753193002f7e346437cd50ed50eab168e8f25
5
5
  SHA512:
6
- metadata.gz: 747c00137a2db4494558398d0e85a659c8d247ef330431239787d135cd7213c91ef5cfdb5585c315b76676b8a016a64f33ee4c6d711927e04ed95839e537430e
7
- data.tar.gz: 930fd61e842f5ca4bbbbf19c9efcfb881e10651f2e2f9f7029388d9c0d84fc27d1cbae5f364e7248aa33edb011d8fbf82518a3a7074844990a58e818fb517fb6
6
+ metadata.gz: c0be145864376662bc858c903c9d4a1865b184b782b2b3f0494c0e85f168de74f44fe8c58f7398e6c1236cbbf9f280a22c3658bdf8a83f0018c6a9af45a1dc62
7
+ data.tar.gz: 79911454fded94aaf16e48ed958c0ebfaf7d0bb5e3be9e22e0740b71eb21f5acabf949eff65eba5314a0b67dfeca13b84e4037484efff44fbc7d6d382061115b
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 2.8.0 (2015-11-16)
2
+
3
+ * Add multi_view plugin for easily setting up routing for rendering multiple views (jeremyevans)
4
+
5
+ * Make content_for plugin work with haml and potentially other non-erb template engines (plukevdh) (#50)
6
+
1
7
  = 2.7.0 (2015-10-13)
2
8
 
3
9
  * Add run_handler plugin for modifying rack response arrays when using r.run, and continuing routing for 404 responses (jeremyevans)
@@ -0,0 +1,44 @@
1
+ = New Features
2
+
3
+ * A multi_view plugin has been added, for easily setting up routing
4
+ for rendering multiple views:
5
+
6
+ plugin :multi_view
7
+
8
+ route do |r|
9
+ r.multi_view(['foo', 'bar', 'baz'])
10
+ end
11
+
12
+ # or:
13
+
14
+ route do |r|
15
+ r.multi_view(/(foo|bar|baz)/)
16
+ end
17
+
18
+ # or:
19
+
20
+ regexp = multi_view_compile(['foo', 'bar', 'baz'])
21
+ route do |r|
22
+ r.multi_view(regexp)
23
+ end
24
+
25
+ # all are equivalent to:
26
+
27
+ route do |r|
28
+ r.get 'foo' do
29
+ view('foo')
30
+ end
31
+
32
+ r.get 'bar' do
33
+ view('bar')
34
+ end
35
+
36
+ r.get 'baz' do
37
+ view('baz')
38
+ end
39
+ end
40
+
41
+ = Other Improvements
42
+
43
+ * The content_for plugin now supports haml templates. Previous only
44
+ erb templates were supported.
@@ -7,10 +7,8 @@ class Roda
7
7
  # can set content for the layout template to display outside
8
8
  # of the normal content pane.
9
9
  #
10
- # The content_for template probably only works with erb
11
- # templates, and requires that you don't override the
12
- # +:outvar+ render option. In the template in which you
13
- # want to store content, call content_for with a block:
10
+ # In the template in which you want to store content, call
11
+ # content_for with a block:
14
12
  #
15
13
  # <% content_for :foo do %>
16
14
  # Some content here.
@@ -34,12 +32,15 @@ class Roda
34
32
  # is no content stored with that key.
35
33
  def content_for(key, &block)
36
34
  if block
35
+ outvar = render_opts[:template_opts][:outvar]
36
+ buf_was = instance_variable_get(outvar)
37
+ # clean the output buffer for ERB-based rendering systems
38
+ instance_variable_set(outvar, '')
39
+
37
40
  @_content_for ||= {}
38
- buf_was = @_out_buf
39
- @_out_buf = ''
40
- yield
41
- @_content_for[key] = @_out_buf
42
- @_out_buf = buf_was
41
+ @_content_for[key] = Tilt[render_opts[:engine]].new(&block).render
42
+
43
+ instance_variable_set(outvar, buf_was)
43
44
  elsif @_content_for
44
45
  @_content_for[key]
45
46
  end
@@ -0,0 +1,80 @@
1
+ class Roda
2
+ module RodaPlugins
3
+ # The multi_view plugin makes it easy to render multiple views, where the
4
+ # view template is the same as the matched element. It adds an +r.multi_view+
5
+ # method, which takes an argument that is passed to +r.get+, and should
6
+ # capture a single argument, which is treated as the template name to pass
7
+ # to +view+. This makes it possible to pass in an array of strings, or a
8
+ # regexp with a single capture.
9
+ #
10
+ # The advantage of using a regexp over an array of strings is that the regexp
11
+ # is generally faster and uses less memory. However, constructing the regexps
12
+ # is more cumbersome. To make it easier, the multi_view plugin also offers a
13
+ # +multi_view_compile+ class method that will take an array of view template
14
+ # names and construct a regexp that can be passed to +r.multi_view+.
15
+ #
16
+ # Example:
17
+ #
18
+ # plugin :multi_view
19
+ #
20
+ # route do |r|
21
+ # r.multi_view(['foo', 'bar', 'baz'])
22
+ # end
23
+ #
24
+ # # or:
25
+ #
26
+ # route do |r|
27
+ # r.multi_view(/(foo|bar|baz)/)
28
+ # end
29
+ #
30
+ # # or:
31
+ #
32
+ # regexp = multi_view_compile(['foo', 'bar', 'baz'])
33
+ # route do |r|
34
+ # r.multi_view(regexp)
35
+ # end
36
+ #
37
+ # # all are equivalent to:
38
+ #
39
+ # route do |r|
40
+ # r.get 'foo' do
41
+ # view('foo')
42
+ # end
43
+ #
44
+ # r.get 'bar' do
45
+ # view('bar')
46
+ # end
47
+ #
48
+ # r.get 'baz' do
49
+ # view('baz')
50
+ # end
51
+ # end
52
+ module MultiView
53
+ # Depend on the render plugin, since this plugin only makes
54
+ # sense when the render plugin is used.
55
+ def self.load_dependencies(app)
56
+ app.plugin :render
57
+ end
58
+
59
+ module ClassMethods
60
+ # Given the array of view template names, return a regexp that will
61
+ # match on any of the names and capture the matched name.
62
+ def multi_view_compile(array)
63
+ /(#{Regexp.union(array)})/
64
+ end
65
+ end
66
+
67
+ module RequestMethods
68
+ # Pass the argument to +get+, and assume if the matchers match that
69
+ # there is one capture, and call view with that capture.
70
+ def multi_view(arg)
71
+ get(arg) do |page|
72
+ scope.view(page)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ register_plugin(:multi_view, MultiView)
79
+ end
80
+ end
data/lib/roda/version.rb CHANGED
@@ -4,7 +4,7 @@ class Roda
4
4
  RodaMajorVersion = 2
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 7
7
+ RodaMinorVersion = 8
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
@@ -2,21 +2,22 @@ require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
2
2
 
3
3
  begin
4
4
  require 'tilt/erb'
5
+ require 'tilt/haml'
5
6
  rescue LoadError
6
- warn "tilt not installed, skipping content_for plugin test"
7
+ warn "tilt, erb, or haml not installed, skipping content_for plugin test"
7
8
  else
8
- describe "content_for plugin" do
9
+ describe "content_for plugin with erb" do
9
10
  before do
10
11
  app(:bare) do
11
- plugin :render, :views=>'./spec/views'
12
+ plugin :render, :views => './spec/views'
12
13
  plugin :content_for
13
14
 
14
15
  route do |r|
15
16
  r.root do
16
- view(:inline=>"<% content_for :foo do %>foo<% end %>bar", :layout=>{:inline=>'<%= yield %> <%= content_for(:foo) %>'})
17
+ view(:inline => "<% content_for :foo do %>foo<% end %>bar", :layout => { :inline => '<%= yield %> <%= content_for(:foo) %>' })
17
18
  end
18
19
  r.get 'a' do
19
- view(:inline=>"bar", :layout=>{:inline=>'<%= content_for(:foo) %> <%= yield %>'})
20
+ view(:inline => "bar", :layout => { :inline => '<%= content_for(:foo) %> <%= yield %>' })
20
21
  end
21
22
  end
22
23
  end
@@ -30,4 +31,61 @@ describe "content_for plugin" do
30
31
  body('/a').strip.must_equal "bar"
31
32
  end
32
33
  end
34
+
35
+ describe "content_for plugin with haml" do
36
+ before do
37
+ app(:bare) do
38
+ plugin :render, :engine => 'haml'
39
+ plugin :content_for
40
+
41
+ route do |r|
42
+ r.root do
43
+ view(:inline => "- content_for :foo do\n - capture_haml do\n foo\nbar", :layout => { :inline => "= yield\n=content_for :foo" })
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ it "should work with alternate rendering engines" do
50
+ body.strip.must_equal "bar\nfoo"
51
+ end
52
+ end
53
+
54
+ describe "content_for plugin with mixed template engines" do
55
+ before do
56
+ app(:bare) do
57
+ plugin :render, :layout_opts=>{:engine => 'haml', :inline => "= yield\n=content_for :foo" }
58
+ plugin :content_for
59
+
60
+ route do |r|
61
+ r.root do
62
+ view(:inline => "<% content_for :foo do %>foo<% end %>bar")
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ it "should work with alternate rendering engines" do
69
+ body.strip.must_equal "bar\nfoo"
70
+ end
71
+ end
72
+
73
+ describe "content_for plugin when overriding :engine" do
74
+ before do
75
+ app(:bare) do
76
+ plugin :render, :engine => 'haml', :layout_opts=>{:inline => "= yield\n=content_for :foo" }
77
+ plugin :content_for
78
+
79
+ route do |r|
80
+ r.root do
81
+ view(:inline => "<% content_for :foo do %>foo<% end %>bar", :engine=>:erb)
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ it "should work with alternate rendering engines" do
88
+ body.strip.must_equal "bar\nfoo"
89
+ end
90
+ end
33
91
  end
@@ -0,0 +1,50 @@
1
+ require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
2
+
3
+ begin
4
+ require 'tilt/erb'
5
+ rescue LoadError
6
+ warn "tilt not installed, skipping multi_view plugin test"
7
+ else
8
+ describe "multi_view plugin" do
9
+ before do
10
+ app(:bare) do
11
+ plugin :render, :views=>'spec/views', :layout=>'layout-yield'
12
+ plugin :multi_view
13
+
14
+ route do |r|
15
+ r.multi_view(['a', 'b', 'c'])
16
+ end
17
+ end
18
+ end
19
+
20
+ it "supports easy rendering of multiple views by name" do
21
+ body('/a').gsub(/\s+/, '').must_equal "HeaderaFooter"
22
+ body('/b').gsub(/\s+/, '').must_equal "HeaderbFooter"
23
+ body('/c').gsub(/\s+/, '').must_equal "HeadercFooter"
24
+ status('/d').must_equal 404
25
+ status('/a', 'REQUEST_METHOD'=>'POST').must_equal 404
26
+ end
27
+ end
28
+
29
+ describe "multi_view plugin multi_view_compile method " do
30
+ before do
31
+ app(:bare) do
32
+ plugin :render, :views=>'spec/views', :layout=>'layout-yield'
33
+ plugin :multi_view
34
+ regexp = multi_view_compile(['a', 'b', 'c'])
35
+
36
+ route do |r|
37
+ r.multi_view(regexp)
38
+ end
39
+ end
40
+ end
41
+
42
+ it "supports easy rendering of multiple views by name" do
43
+ body('/a').gsub(/\s+/, '').must_equal "HeaderaFooter"
44
+ body('/b').gsub(/\s+/, '').must_equal "HeaderbFooter"
45
+ body('/c').gsub(/\s+/, '').must_equal "HeadercFooter"
46
+ status('/d').must_equal 404
47
+ status('/a', 'REQUEST_METHOD'=>'POST').must_equal 404
48
+ end
49
+ end
50
+ end
data/spec/views/a.erb ADDED
@@ -0,0 +1 @@
1
+ a
data/spec/views/b.erb ADDED
@@ -0,0 +1 @@
1
+ b
data/spec/views/c.erb ADDED
@@ -0,0 +1 @@
1
+ c
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roda
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-13 00:00:00.000000000 Z
11
+ date: 2015-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: minitest
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: haml
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rack_csrf
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -145,6 +173,7 @@ extra_rdoc_files:
145
173
  - doc/release_notes/2.5.1.txt
146
174
  - doc/release_notes/2.6.0.txt
147
175
  - doc/release_notes/2.7.0.txt
176
+ - doc/release_notes/2.8.0.txt
148
177
  files:
149
178
  - CHANGELOG
150
179
  - MIT-LICENSE
@@ -164,6 +193,7 @@ files:
164
193
  - doc/release_notes/2.5.1.txt
165
194
  - doc/release_notes/2.6.0.txt
166
195
  - doc/release_notes/2.7.0.txt
196
+ - doc/release_notes/2.8.0.txt
167
197
  - lib/roda.rb
168
198
  - lib/roda/plugins/_erubis_escaping.rb
169
199
  - lib/roda/plugins/all_verbs.rb
@@ -202,6 +232,7 @@ files:
202
232
  - lib/roda/plugins/module_include.rb
203
233
  - lib/roda/plugins/multi_route.rb
204
234
  - lib/roda/plugins/multi_run.rb
235
+ - lib/roda/plugins/multi_view.rb
205
236
  - lib/roda/plugins/named_templates.rb
206
237
  - lib/roda/plugins/not_allowed.rb
207
238
  - lib/roda/plugins/not_found.rb
@@ -278,6 +309,7 @@ files:
278
309
  - spec/plugin/module_include_spec.rb
279
310
  - spec/plugin/multi_route_spec.rb
280
311
  - spec/plugin/multi_run_spec.rb
312
+ - spec/plugin/multi_view_spec.rb
281
313
  - spec/plugin/named_templates_spec.rb
282
314
  - spec/plugin/not_allowed_spec.rb
283
315
  - spec/plugin/not_found_spec.rb
@@ -312,8 +344,11 @@ files:
312
344
  - spec/spec_helper.rb
313
345
  - spec/version_spec.rb
314
346
  - spec/views/_test.erb
347
+ - spec/views/a.erb
315
348
  - spec/views/about.erb
316
349
  - spec/views/about.str
350
+ - spec/views/b.erb
351
+ - spec/views/c.erb
317
352
  - spec/views/content-yield.erb
318
353
  - spec/views/home.erb
319
354
  - spec/views/home.str