vanilla 1.13.3 → 1.14.1

Sign up to get free protection for your applications and to get access to all the features.
data/config.ru CHANGED
@@ -5,7 +5,7 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[lib])
5
5
  require 'vanilla'
6
6
  require 'vanilla/static'
7
7
 
8
- config = YAML.parse_file(ENV['VANILLA_CONFIG'])
8
+ config = YAML.parse_file(ENV['VANILLA_CONFIG']) rescue {}
9
9
  app = Vanilla::App.new(config)
10
10
  use Vanilla::Static, File.join(File.dirname(__FILE__), 'public')
11
11
  run app
data/lib/vanilla.rb CHANGED
@@ -1,11 +1,13 @@
1
- require 'vanilla/app'
2
-
3
1
  module Vanilla
4
- VERSION = "1.13.3"
5
- end
2
+ VERSION = "1.14.1"
6
3
 
7
- # Load all the other renderer subclasses
8
- Dir[File.join(File.dirname(__FILE__), 'vanilla', 'renderers', '*.rb')].each { |f| require f }
4
+ autoload :Renderers, "vanilla/renderers"
5
+ autoload :App, "vanilla/app"
6
+ autoload :Dynasnip, "vanilla/dynasnip"
7
+ autoload :Request, "vanilla/request"
8
+ autoload :Routes, "vanilla/routes"
9
+ autoload :Static, "vanilla/static"
10
+ end
9
11
 
10
12
  # Load all the base dynasnip classes
11
13
  Dir[File.join(File.dirname(__FILE__), 'vanilla', 'dynasnips', '*.rb')].each do |dynasnip|
data/lib/vanilla/app.rb CHANGED
@@ -1,24 +1,30 @@
1
1
  require 'soup'
2
- require 'vanilla/request'
3
- require 'vanilla/routes'
4
-
5
- # Require the base set of renderers
6
- require 'vanilla/renderers/base'
7
- require 'vanilla/renderers/raw'
8
- require 'vanilla/renderers/erb'
9
2
 
10
3
  module Vanilla
11
4
  class App
12
- include Routes
5
+ include Vanilla::Routes
13
6
 
14
7
  attr_reader :request, :response, :config, :soup
15
8
 
9
+ # Create a new Vanilla application
10
+ # Configuration options:
11
+ #
12
+ # :soup - provide the path to the soup data
13
+ # :soups - provide an array of paths to soup data
14
+ # :renderers - a hash of names to classes
15
+ # :default_renderer - the class to use when no renderer is provided;
16
+ # defaults to 'Vanilla::Renderers::Base'
17
+ # :default_layout_snip - the snip to use as a layout when rendering to HTML;
18
+ # defaults to 'layout'
19
+ # :root_snip - the snip to load for the root ('/') url;
20
+ # defaults to 'start'
16
21
  def initialize(config={})
17
22
  @config = config
18
23
  if @config[:soup].nil? && @config[:soups].nil?
19
24
  @config.merge!(:soup => File.expand_path("soup"))
20
25
  end
21
26
  @soup = prepare_soup(config)
27
+ prepare_renderers(config[:renderers])
22
28
  end
23
29
 
24
30
  # Returns a Rack-appropriate 3-element array (via Rack::Response#finish)
@@ -62,24 +68,10 @@ module Vanilla
62
68
  end
63
69
  end
64
70
 
65
- # Given the snip and parameters, yield an instance of the appropriate
66
- # Vanilla::Render::Base subclass
67
- def rendering(snip)
68
- renderer_instance = renderer_for(snip).new(self)
69
- yield renderer_instance
70
- rescue Exception => e
71
- snip_name = snip ? snip.name : nil
72
- "<pre>[Error rendering '#{snip_name}' - \"" +
73
- e.message.gsub("<", "&lt;").gsub(">", "&gt;") + "\"]\n" +
74
- e.backtrace.join("\n").gsub("<", "&lt;").gsub(">", "&gt;") + "</pre>"
75
- end
76
-
77
71
  # Returns the renderer class for a given snip
78
72
  def renderer_for(snip)
79
- if snip && snip.render_as && !snip.render_as.empty?
80
- Vanilla::Renderers.const_get(snip.render_as)
81
- elsif snip && snip.extension && !snip.extension.empty?
82
- Vanilla::Renderers.const_get(renderer_for_extension(snip.extension))
73
+ if snip
74
+ find_renderer(snip.render_as || snip.extension)
83
75
  else
84
76
  default_renderer
85
77
  end
@@ -89,10 +81,6 @@ module Vanilla
89
81
  soup[config[:default_layout_snip] || 'layout']
90
82
  end
91
83
 
92
- def default_renderer
93
- config[:default_renderer] || Vanilla::Renderers::Base
94
- end
95
-
96
84
  def layout_for(snip)
97
85
  if snip
98
86
  renderer_for(snip).new(self).layout_for(snip)
@@ -105,19 +93,49 @@ module Vanilla
105
93
  @soup << attributes
106
94
  end
107
95
 
96
+ def register_renderer(klass, *types)
97
+ types.each do |type|
98
+ if klass.is_a?(String)
99
+ klass = klass.split("::").inject(Object) { |o, name| o.const_get(name) }
100
+ end
101
+ @renderers[type.to_s] = klass
102
+ end
103
+ end
104
+
108
105
  private
109
106
 
110
- DEFAULT_EXTENSION_RENDERERS = Hash.new("Base").merge({
111
- "markdown" => "Markdown",
112
- "textile" => "Textile",
113
- "erb" => "Erb",
114
- "rb" => "Ruby",
115
- "haml" => "Haml"
116
- })
117
-
118
- def renderer_for_extension(extension)
119
- @renderer_mapping ||= DEFAULT_EXTENSION_RENDERERS.merge(@config[:extensions] || {})
120
- @renderer_mapping[extension]
107
+ def prepare_renderers(additional_renderers={})
108
+ @renderers = Hash.new(config[:default_renderer] || Vanilla::Renderers::Base)
109
+ @renderers.merge!({
110
+ "base" => Vanilla::Renderers::Base,
111
+ "markdown" => Vanilla::Renderers::Markdown,
112
+ "bold" => Vanilla::Renderers::Bold,
113
+ "erb" => Vanilla::Renderers::Erb,
114
+ "rb" => Vanilla::Renderers::Ruby,
115
+ "ruby" => Vanilla::Renderers::Ruby,
116
+ "haml" => Vanilla::Renderers::Haml,
117
+ "raw" => Vanilla::Renderers::Raw,
118
+ "textile" => Vanilla::Renderers::Textile
119
+ })
120
+ additional_renderers.each { |name, klass| register_renderer(klass, name) } if additional_renderers
121
+ end
122
+
123
+ def find_renderer(name)
124
+ @renderers[(name ? name.downcase : nil)]
125
+ end
126
+
127
+ def default_renderer
128
+ @renderers[nil]
129
+ end
130
+
131
+ def rendering(snip)
132
+ renderer_instance = renderer_for(snip).new(self)
133
+ yield renderer_instance
134
+ rescue Exception => e
135
+ snip_name = snip ? snip.name : nil
136
+ "<pre>[Error rendering '#{snip_name}' - \"" +
137
+ e.message.gsub("<", "&lt;").gsub(">", "&gt;") + "\"]\n" +
138
+ e.backtrace.join("\n").gsub("<", "&lt;").gsub(">", "&gt;") + "</pre>"
121
139
  end
122
140
 
123
141
  def prepare_soup(config)
@@ -2,8 +2,11 @@ require 'vanilla'
2
2
  require 'irb'
3
3
 
4
4
  def app(reload=false)
5
- @__vanilla_console_app = nil if reload
6
- @__vanilla_console_app ||= Vanilla::App.new(ENV['VANILLA_CONFIG'])
5
+ if !@__vanilla_console_app || reload
6
+ config = YAML.parse_file(ENV['VANILLA_CONFIG']) rescue {}
7
+ @__vanilla_console_app = Vanilla::App.new(config)
8
+ end
9
+ @__vanilla_console_app
7
10
  end
8
11
 
9
12
  puts "The Soup is simmering."
@@ -0,0 +1,12 @@
1
+ module Vanilla
2
+ module Renderers
3
+ autoload :Base, "vanilla/renderers/base"
4
+ autoload :Bold, "vanilla/renderers/bold"
5
+ autoload :Erb, "vanilla/renderers/erb"
6
+ autoload :Haml, "vanilla/renderers/haml"
7
+ autoload :Markdown, "vanilla/renderers/markdown"
8
+ autoload :Raw, "vanilla/renderers/raw"
9
+ autoload :Ruby, "vanilla/renderers/ruby"
10
+ autoload :Textile, "vanilla/renderers/textile"
11
+ end
12
+ end
@@ -1,4 +1,3 @@
1
- require 'vanilla/app'
2
1
  require 'vanilla/snip_reference_parser'
3
2
 
4
3
  module Vanilla
@@ -27,7 +26,7 @@ module Vanilla
27
26
  end
28
27
 
29
28
  def self.snip_regexp
30
- %r{(\{[\w\-_\d]+(\s+[^\}.]+)?\})}
29
+ %r{(\{[\w\-_\d\.\"]+(\s+[^\}.]+)?\})}
31
30
  end
32
31
 
33
32
  def default_layout_snip
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  module Vanilla::Renderers
4
2
  class Bold < Base
5
3
  def process_text(content)
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  require 'erb'
4
2
  include ERB::Util
5
3
 
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  require 'haml'
4
2
 
5
3
  module Vanilla::Renderers
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  require 'rubygems'
4
2
  gem 'BlueCloth' # from http://www.deveiate.org/projects/BlueCloth
5
3
  require 'bluecloth'
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  module Vanilla::Renderers
4
2
  class Raw < Base
5
3
  def render(snip, part=:content)
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  module Vanilla::Renderers
4
2
  # Snips that render_as "Ruby" should define a class.
5
3
  # The class should have instance methods for any HTTP request methods that the dynasnip
@@ -1,5 +1,3 @@
1
- require 'vanilla/renderers/base'
2
-
3
1
  require 'rubygems'
4
2
  gem 'RedCloth'
5
3
  require 'redcloth'
@@ -18,6 +18,11 @@ describe Vanilla::Renderers::Base do
18
18
  assert_response_body "loading content content", "/snip_with_inclusions"
19
19
  end
20
20
 
21
+ should "be able to render a snip attribute" do
22
+ create_snip(:name => "snip_with_inclusions", :content => "loading {test.part}")
23
+ assert_response_body "loading part content", "/snip_with_inclusions"
24
+ end
25
+
21
26
  should "perform snip inclusion when rendering a part" do
22
27
  create_snip(:name => "snip_with_inclusions", :content => "other content", :part => "loading {test}")
23
28
  assert_response_body "loading content content", "/snip_with_inclusions/part"
@@ -51,8 +51,8 @@ describe Vanilla::App do
51
51
  end
52
52
  end
53
53
 
54
- should "respect snip extensions pass in the config" do
55
- app = Vanilla::App.new(:extensions => {"markdown" => "Bold"})
54
+ should "respect snip renderers passed in the config" do
55
+ app = Vanilla::App.new(:renderers => {"markdown" => "Vanilla::Renderers::Bold"})
56
56
  snip = create_snip(:name => "blah", :extension => "markdown")
57
57
  assert_equal Vanilla::Renderers::Bold, app.renderer_for(snip)
58
58
  end
@@ -72,12 +72,12 @@ describe Vanilla::App do
72
72
  assert_raises(NameError) { @app.renderer_for(snip) }
73
73
  end
74
74
 
75
- should "load constants outside of the Vanilla::Renderers module" do
75
+ should "load constants presented as a string" do
76
76
  class ::MyRenderer
77
77
  end
78
-
79
- snip = create_snip(:name => "blah", :render_as => "MyRenderer")
80
- assert_equal MyRenderer, @app.renderer_for(snip)
78
+ app = Vanilla::App.new(:renderers => {"my_renderer" => "MyRenderer"})
79
+ snip = create_snip(:name => "blah", :render_as => "my_renderer")
80
+ assert_equal MyRenderer, app.renderer_for(snip)
81
81
  end
82
82
  end
83
83
  end
@@ -71,7 +71,7 @@ context "When presenting" do
71
71
  end
72
72
  end
73
73
 
74
- class ::Vanilla::Renderers::Custom < ::Vanilla::Renderers::Base
74
+ class CustomRenderer < ::Vanilla::Renderers::Base
75
75
  def default_layout_snip
76
76
  soup['custom-layout']
77
77
  end
@@ -79,17 +79,18 @@ context "When presenting" do
79
79
 
80
80
  context "a snip using a renderer that specifies a template" do
81
81
  setup do
82
+ @app.register_renderer CustomRenderer, "custom"
82
83
  create_snip :name => "custom-layout", :content => "<custom>{current_snip}</custom>"
83
84
  end
84
85
 
85
86
  should "use the renderer's specified layout" do
86
- create_snip :name => "test", :content => "this is a test", :render_as => "Custom"
87
+ create_snip :name => "test", :content => "this is a test", :render_as => "custom"
87
88
  assert_response_body "<custom>this is a test</custom>", "/test"
88
89
  end
89
90
 
90
91
  should "use the snips layout when given" do
91
92
  create_snip :name => "snip-custom-layout", :content => "<snipcustom>{current_snip}</snipcustom>"
92
- create_snip :name => "test", :content => "this is a test", :render_as => "Custom", :layout => "snip-custom-layout"
93
+ create_snip :name => "test", :content => "this is a test", :render_as => "custom", :layout => "snip-custom-layout"
93
94
  assert_response_body "<snipcustom>this is a test</snipcustom>", "/test"
94
95
  end
95
96
  end
@@ -97,7 +98,7 @@ context "When presenting" do
97
98
  context "and a custom default renderer has been provided" do
98
99
  should "use that renderer" do
99
100
  @app = Vanilla::App.new(:default_renderer => ::Vanilla::Renderers::Bold)
100
- create_snip :name => "layout", :content => "{current_snip}", :render_as => "Base"
101
+ create_snip :name => "layout", :content => "{current_snip}", :render_as => "base"
101
102
  create_snip :name => "test", :content => "test"
102
103
  assert_response_body "<b>test</b>", "/test"
103
104
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanilla
3
3
  version: !ruby/object:Gem::Version
4
- hash: 37
4
+ hash: 45
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 13
9
- - 3
10
- version: 1.13.3
8
+ - 14
9
+ - 1
10
+ version: 1.14.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - James Adam
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-20 00:00:00 +01:00
18
+ date: 2011-04-26 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -219,6 +219,7 @@ files:
219
219
  - lib/vanilla/renderers/raw.rb
220
220
  - lib/vanilla/renderers/ruby.rb
221
221
  - lib/vanilla/renderers/textile.rb
222
+ - lib/vanilla/renderers.rb
222
223
  - lib/vanilla/request.rb
223
224
  - lib/vanilla/routes.rb
224
225
  - lib/vanilla/snip_reference.rb