cuba 3.0.0.rc1 → 3.0.0.rc2

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.
@@ -107,7 +107,6 @@ Cuba.define do
107
107
 
108
108
  # /username/foobar
109
109
  on "username/:username" do |username|
110
-
111
110
  user = User.find_by_username(username) # username == "foobar"
112
111
 
113
112
  # /username/foobar/posts
@@ -149,7 +148,6 @@ Cuba.define do
149
148
  end
150
149
  ```
151
150
 
152
-
153
151
  HTTP Verbs
154
152
  ----------
155
153
 
@@ -248,6 +246,123 @@ end
248
246
  To read more about testing, check the documentation for [Cutest][cutest] and
249
247
  [Capybara][capybara].
250
248
 
249
+ Settings
250
+ --------
251
+
252
+ _You need Cuba 3.0.0 release candidate (gem install cuba --pre)._
253
+
254
+ Each Cuba app can store settings in the `Cuba.settings` hash. The settings are
255
+ inherited if you happen to subclass `Cuba`
256
+
257
+ ``` ruby
258
+ Cuba.settings[:layout] = "guest"
259
+
260
+ class Users < Cuba; end
261
+ class Admin < Cuba; end
262
+
263
+ Admin.settings[:layout] = "admin"
264
+
265
+ assert_equal "guest", Users.settings[:layout]
266
+ assert_equal "admin", Admin.settings[:layout]
267
+
268
+ ```
269
+
270
+ Feel free to store whatever you find convenient.
271
+
272
+ Rendering
273
+ ---------
274
+
275
+ _You need Cuba 3.0.0 release candidate (gem install cuba --pre)._
276
+
277
+ Cuba ships with a plugin that provides helpers for rendering templates. It uses
278
+ [Tilt][tilt], a gem that interfaces with many template engines.
279
+
280
+ ``` ruby
281
+ require "cuba/render"
282
+
283
+ Cuba.plugin Cuba::Render
284
+
285
+ Cuba.define do
286
+ on default do
287
+
288
+ # Within the partial, you will have access to the local variable `content`,
289
+ # that will hold the value "hello, world".
290
+ res.write render("home.haml", content: "hello, world")
291
+ end
292
+ end
293
+ ```
294
+
295
+ Note that in order to use this plugin you need to have [Tilt][tilt] installed, along
296
+ with the templating engines you want to use.
297
+
298
+ Plugins
299
+ -------
300
+
301
+ _You need Cuba 3.0.0 release candidate (gem install cuba --pre)._
302
+
303
+ Cuba provides a way to extend its functionality with plugins.
304
+
305
+ ### How to create plugins
306
+
307
+ Authoring your own plugins is pretty straightforward.
308
+
309
+ ``` ruby
310
+ module MyOwnHelper
311
+ def markdown(str)
312
+ BlueCloth.new(str).to_html
313
+ end
314
+ end
315
+
316
+ Cuba.plugin MyOwnHelper
317
+ ```
318
+
319
+ That's the simplest kind of plugin you'll write. In fact, that's exactly how
320
+ the `markdown` helper is written in `Cuba::TextHelpers`.
321
+
322
+ A more complicated plugin can make use of `Cuba.settings` to provide default
323
+ values. In the following example, note that if the module has a `setup` method it will
324
+ be called as soon as it is included:
325
+
326
+ ``` ruby
327
+ module Render
328
+ def self.setup(app)
329
+ app.settings[:template_engine] = "erb"
330
+ end
331
+
332
+ def partial(template, locals = {})
333
+ render("#{template}.#{settings[:template_engine]}", locals)
334
+ end
335
+ end
336
+
337
+ Cuba.plugin Render
338
+ ```
339
+
340
+ This sample plugin actually resembles how `Cuba::Render` works.
341
+
342
+ Finally, if a module called `ClassMethods` is present, `Cuba` will be extended
343
+ with it.
344
+
345
+ ``` ruby
346
+ module GetSetter
347
+ module ClassMethods
348
+ def set(key, value)
349
+ settings[key] = value
350
+ end
351
+
352
+ def get(key)
353
+ settings[key]
354
+ end
355
+ end
356
+ end
357
+
358
+ Cuba.plugin GetSetter
359
+
360
+ Cuba.set(:foo, "bar")
361
+
362
+ assert_equal "bar", Cuba.get(:foo)
363
+ assert_equal "bar", Cuba.settings[:foo]
364
+ ```
365
+
251
366
  Installation
252
367
  ------------
253
368
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cuba"
3
- s.version = "3.0.0.rc1"
3
+ s.version = "3.0.0.rc2"
4
4
  s.summary = "Microframework for web applications."
5
5
  s.description = "Cuba is a microframework for web applications."
6
6
  s.authors = ["Michel Martens"]
@@ -18,7 +18,6 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
 
20
20
  s.add_dependency "rack"
21
- s.add_dependency "tilt"
22
21
  s.add_development_dependency "cutest"
23
22
  s.add_development_dependency "capybara"
24
23
  end
@@ -1,8 +1,7 @@
1
1
  require "rack"
2
2
 
3
3
  class Cuba
4
- class RedefinitionError < StandardError
5
- end
4
+ class RedefinitionError < StandardError; end
6
5
 
7
6
  @@methods = []
8
7
 
@@ -0,0 +1,48 @@
1
+ require "tilt"
2
+
3
+ class Cuba
4
+ module Render
5
+ def self.setup(app)
6
+ app.settings[:template_engine] ||= "erb"
7
+ app.settings[:views] ||= File.expand_path("views", Dir.pwd)
8
+ end
9
+
10
+ def view(template, locals = {}, layout = "layout")
11
+ partial(layout, { content: partial(template, locals) }.merge(locals))
12
+ end
13
+
14
+ def partial(template, locals = {})
15
+ render("#{settings[:views]}/#{template}.#{settings[:template_engine]}",
16
+ locals, default_encoding: Encoding.default_external)
17
+ end
18
+
19
+ # Render any type of template file supported by Tilt.
20
+ #
21
+ # @example
22
+ #
23
+ # # Renders home, and is assumed to be HAML.
24
+ # render("home.haml")
25
+ #
26
+ # # Renders with some local variables
27
+ # render("home.haml", site_name: "My Site")
28
+ #
29
+ # # Renders with HAML options
30
+ # render("home.haml", {}, ugly: true, format: :html5)
31
+ #
32
+ # # Renders in layout
33
+ # render("layout.haml") { render("home.haml") }
34
+ #
35
+ def render(template, locals = {}, options = {}, &block)
36
+ _cache.fetch(template) {
37
+ Tilt.new(template, 1, options)
38
+ }.render(self, locals, &block)
39
+ end
40
+
41
+ # @private Used internally by #render to cache the
42
+ # Tilt templates.
43
+ def _cache
44
+ Thread.current[:_cache] ||= Tilt::Cache.new
45
+ end
46
+ private :_cache
47
+ end
48
+ end
@@ -0,0 +1,94 @@
1
+ require_relative "helper"
2
+
3
+ require "cuba/render"
4
+
5
+ test "doesn't override the settings if they already exist" do
6
+ Cuba.settings[:views] = "./test/views"
7
+ Cuba.settings[:template_engine] = "haml"
8
+
9
+ Cuba.plugin Cuba::Render
10
+
11
+ assert_equal "./test/views", Cuba.settings[:views]
12
+ assert_equal "haml", Cuba.settings[:template_engine]
13
+ end
14
+
15
+ scope do
16
+ setup do
17
+ Cuba.plugin Cuba::Render
18
+ Cuba.settings[:views] = "./test/views"
19
+ Cuba.settings[:template_engine] = "erb"
20
+
21
+ Cuba.define do
22
+ on "home" do
23
+ res.write view("home", name: "Agent Smith", title: "Home")
24
+ end
25
+
26
+ on "about" do
27
+ res.write partial("about", title: "About Cuba")
28
+ end
29
+ end
30
+ end
31
+
32
+ test "partial" do
33
+ _, _, body = Cuba.call({ "PATH_INFO" => "/about", "SCRIPT_NAME" => "/" })
34
+
35
+ assert_response body, ["<h1>About Cuba</h1>\n"]
36
+ end
37
+
38
+ test "view" do
39
+ _, _, body = Cuba.call({ "PATH_INFO" => "/home", "SCRIPT_NAME" => "/" })
40
+
41
+ assert_response body, ["<title>Cuba: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>\n"]
42
+ end
43
+
44
+ test "partial with str as engine" do
45
+ Cuba.settings[:template_engine] = "str"
46
+
47
+ _, _, body = Cuba.call({ "PATH_INFO" => "/about", "SCRIPT_NAME" => "/" })
48
+
49
+ assert_response body, ["<h1>About Cuba</h1>\n"]
50
+ end
51
+
52
+ test "view with str as engine" do
53
+ Cuba.settings[:template_engine] = "str"
54
+
55
+ _, _, body = Cuba.call({ "PATH_INFO" => "/home", "SCRIPT_NAME" => "/" })
56
+
57
+ assert_response body, ["<title>Cuba: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>\n\n"]
58
+ end
59
+ end
60
+
61
+ test "caching behavior" do
62
+ Thread.current[:_cache] = nil
63
+
64
+ Cuba.plugin Cuba::Render
65
+ Cuba.settings[:views] = "./test/views"
66
+
67
+ Cuba.define do
68
+ on "foo/:i" do |i|
69
+ res.write partial("test", title: i)
70
+ end
71
+ end
72
+
73
+ 10.times do |i|
74
+ _, _, resp = Cuba.call({ "PATH_INFO" => "/foo/#{i}", "SCRIPT_NAME" => "" })
75
+ end
76
+
77
+ assert_equal 1, Thread.current[:_cache].instance_variable_get(:@cache).size
78
+ end
79
+
80
+ test "simple layout support" do
81
+ Cuba.plugin Cuba::Render
82
+
83
+ Cuba.define do
84
+ on true do
85
+ res.write render("test/views/layout-yield.erb") {
86
+ render("test/views/content-yield.erb")
87
+ }
88
+ end
89
+ end
90
+
91
+ _, _, resp = Cuba.call({})
92
+
93
+ assert_equal ["Header\nThis is the actual content.\nFooter\n"], resp.body
94
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuba
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.rc1
4
+ version: 3.0.0.rc2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-15 00:00:00.000000000 Z
12
+ date: 2012-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &2160204820 !ruby/object:Gem::Requirement
16
+ requirement: &2152217600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2160204820
25
- - !ruby/object:Gem::Dependency
26
- name: tilt
27
- requirement: &2160203660 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *2160203660
24
+ version_requirements: *2152217600
36
25
  - !ruby/object:Gem::Dependency
37
26
  name: cutest
38
- requirement: &2160218800 !ruby/object:Gem::Requirement
27
+ requirement: &2152216880 !ruby/object:Gem::Requirement
39
28
  none: false
40
29
  requirements:
41
30
  - - ! '>='
@@ -43,10 +32,10 @@ dependencies:
43
32
  version: '0'
44
33
  type: :development
45
34
  prerelease: false
46
- version_requirements: *2160218800
35
+ version_requirements: *2152216880
47
36
  - !ruby/object:Gem::Dependency
48
37
  name: capybara
49
- requirement: &2160218280 !ruby/object:Gem::Requirement
38
+ requirement: &2152216340 !ruby/object:Gem::Requirement
50
39
  none: false
51
40
  requirements:
52
41
  - - ! '>='
@@ -54,7 +43,7 @@ dependencies:
54
43
  version: '0'
55
44
  type: :development
56
45
  prerelease: false
57
- version_requirements: *2160218280
46
+ version_requirements: *2152216340
58
47
  description: Cuba is a microframework for web applications.
59
48
  email:
60
49
  - michel@soveran.com
@@ -66,7 +55,7 @@ files:
66
55
  - CHANGELOG
67
56
  - README.markdown
68
57
  - Rakefile
69
- - lib/cuba/settings.rb
58
+ - lib/cuba/render.rb
70
59
  - lib/cuba/test.rb
71
60
  - lib/cuba.rb
72
61
  - cuba.gemspec
@@ -85,6 +74,7 @@ files:
85
74
  - test/path.rb
86
75
  - test/plugin.rb
87
76
  - test/redefinition.rb
77
+ - test/render.rb
88
78
  - test/root.rb
89
79
  - test/run.rb
90
80
  - test/segment.rb
@@ -1,25 +0,0 @@
1
- class Cuba
2
- module Settings
3
- def settings
4
- self.class
5
- end
6
-
7
- module ClassMethods
8
- def set(key, value)
9
- metaclass.send :attr_writer, key
10
- metaclass.module_eval %{
11
- def #{key}
12
- @#{key} ||= #{value.inspect}
13
- end
14
- }
15
-
16
- send :"#{key}=", value
17
- end
18
-
19
- private
20
- def metaclass
21
- class << self; self; end
22
- end
23
- end
24
- end
25
- end